Flurry Authentication и загрузка CSV через cURL

Я пытаюсь пройти аутентификацию и загрузить журнал событий Flurry через php и cURL. сообщение от Silkfire частично помогло мне, но я по-прежнему возникают проблемы с загрузкой. Я считаю, что я прошел аутентификацию, но загрузка, похоже, возвращает страницу с ошибкой вместо файла. Вот последний код, который я пытаюсь:

$post = array(
  'loginEmail'        => 'email',
  'loginPassword'     => 'pw',
  //'rememberMeCheckbox' => 'true',
  //'__checkbox_rememberMeCheckbox' => 'true',
  'struts.token.name' => 'token',
);

//$ckfile = tempnam("/tmp", "FLURRYCOOKIE");

$ch = curl_init('https://dev.flurry.com/secure/login.do');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_COOKIEFILE, null);
//curl_setopt ($ch, CURLOPT_COOKIEJAR, $ckfile);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

libxml_use_internal_errors(true);

$dom = new DOMDocument('1.0', 'UTF-8');
$dom->loadHTML(curl_exec($ch));

$xpath = new DOMXPath($dom);


$post['token'] = $xpath->query('//input[@name="token"]')->item(0)->getAttribute('value');


curl_setopt($ch, CURLOPT_URL, 'https://dev.flurry.com/secure/loginAction.do');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
//curl_setopt( $ch, CURLOPT_COOKIEFILE, $ckfile );
//curl_setopt($ch, CURLOPT_COOKIESESSION, true );
//curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);

$login = curl_exec($ch);

$log_url = 'https://dev.flurry.com/eventsLogCsv.do?projectID=12345&versionCut=versionsAll&intervalCut=30Days&childProjectId=0&stream=true&direction=1&offset=0';
$ch = curl_init();
//curl_setopt( $ch, CURLOPT_COOKIEFILE, $ckfile );
curl_setopt($ch, CURLOPT_URL, $log_url);
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, "");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
$data = curl_exec($ch);
//print_r($data);
$error = curl_error($ch);
curl_close ($ch);

$destination = "/tmp/flurry_event_log.csv";
$file = fopen($destination, "w");
fputs($file, $data);
fclose($file);

Любая помощь будет принята с благодарностью.

Обновление: вот основное содержание ответа для $data:

    <div id="main">
    <!-- center -->
    <div id="centerColumn">
      <h1>&nbsp;</h1>
      <div class="fontSize" style="margin:50px;">
            <h2>Oops, an unexpected error has occurred.</h2>
            <br/><br/><br/>
            Please <a class="colorMediumBlue bold hover fontSize" href="/">go home</a> and try again.
            <br/><br/><br/>
            If you receive this same message more than once,
            please email <a class="colorMediumBlue bold hover fontSize" href="mailto:[email protected]">[email protected]</a> with details on how you arrived on this error page.
        <br/><br/>
        We apologize for this inconvenience and we will find a solution to this issue as soon as possible.
        <br/><br/>
        Sincerely,<br/>
        The Flurry Team
      </div>
  </div>
</div>

person joekrukosky    schedule 03.03.2016    source источник


Ответы (1)


Добавьте этот код строки к вашему первому вызову curl:

curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/cookieFileName");

Затем, после того как вы сохранили данные cookie, используйте их во втором вызове curl следующим образом:

curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/cookieFileName");

И убедитесь, что файлы cookie сохранены, и у вас нет проблем с правами доступа к пути /tmp/cookieFileName или любому другому пути, который вы хотите.

Я отредактировал ваш код;

<?php

$post = array(
    'loginEmail' => '[email protected]',
    'loginPassword' => 'xxxxxxx',
    //'rememberMeCheckbox' => 'true',
    //'__checkbox_rememberMeCheckbox' => 'true',
    'struts.token.name' => 'token',
);
$ch = curl_init('https://dev.flurry.com/secure/login.do');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_COOKIEFILE, null);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

libxml_use_internal_errors(true);

$dom = new DOMDocument('1.0', 'UTF-8');
$dom->loadHTML(curl_exec($ch));

$xpath = new DOMXPath($dom);

$post['token'] = $xpath->query('//input[@name="token"]')->item(0)->getAttribute('value');

curl_setopt($ch, CURLOPT_URL, 'https://dev.flurry.com/secure/loginAction.do');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
curl_exec($ch);

$log_url = 'https://dev.flurry.com/eventsLogCsv.do?projectID=12345&versionCut=versionsAll&intervalCut=30Days&childProjectId=0&stream=true&direction=1&offset=0';
curl_setopt($ch, CURLOPT_URL, $log_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
$data = curl_exec($ch);
//print_r($data);
$error = curl_error($ch);
curl_close($ch);
echo $data;
?>
person mertizci    schedule 03.03.2016
comment
mertizci, спасибо за быстрый ответ. Я попробовал ваши изменения, и я все еще получаю веб-страницу для данных, а не для загрузки csv. Я проверил разрешения для файла cookie (они широко открыты 777), так что это не должно быть проблемой. Я добавлю основное содержание страницы ответов в свой исходный пост. - person joekrukosky; 04.03.2016
comment
@joekrukosky, можешь попробовать еще раз с моим кодом? я отредактировал это. - person mertizci; 04.03.2016
comment
Выдающийся, это сделало это. Mertizci Я не могу отблагодарить вас достаточно. - person joekrukosky; 04.03.2016
comment
@mertizci Я интегрировал приведенный выше фрагмент кода, но он генерирует фатальную ошибку. Фатальная ошибка: вызов функции-члена getAttribute() для необъекта - person Rubin Porwal; 26.08.2016