Загрузите журнал событий Flurry, используя curl

Я начал использовать Flurry Analytics и обнаружил, что его инструменты анализа недостаточны и слишком медленны. Простая последовательность из 3 шагов была обработана в течение 3 дней, в то время как обычно запрос с 3 левыми объединениями занимает 0,001 секунды для таблицы с 100 000 строк.

Flurry позволяет загружать необработанные данные о событиях в формате csv на страницу журналов событий, поэтому я решил импортировать все события и проанализировать их дома.

Flurry позволяет загружать только 100 000 записей, и они советуют просто загружать часто, чтобы соответствовать этому ограничению. У них был сырой API загрузки событий, но он почему-то отказался от него. Таким образом, единственный способ — перейти на страницу журналов событий и загрузить данные о событиях вручную. Но, как вы можете себе представить, это очень раздражает.

Поэтому я решил получить эти данные, используя curl в php. Я скопировал HTTP-запрос GET для загрузки ссылки с заголовками и получил данные.
Но вся магия в сеансе / куки, которые я могу просто скопировать из существующего сеанса. Итак, чтобы сделать запрос curl успешным, я должен:

  1. зайдите на сайт в браузере и войдите
  2. перейдите на страницу Журналы событий, выберите параметры таймфрейма и нажмите «Загрузить»
  3. скопировать заголовки запроса в сниффере
  4. вставьте их в мой PHP-код
  5. и теперь я могу делать этот запрос в php до истечения срока действия куки

Я не уверен, но предположим, что срок действия файлов cookie истекает на следующий день, поэтому все эти усилия бесполезны.

Как я понимаю, я должен попытаться POST войти в систему с curl, и сохраняя это соединение, выполнить GET для загрузки данных. Тем не менее, я не могу войти, даже копируя все тело запроса входа POST — он отвечает с той же страницей входа, хотя 302 перенаправить
https://dev.flurry.com/fullPageTakeover.do?originalTarget=&isFirstPostLogin = верно&defaultTarget =% 2Fhome.do

Похоже, что шквал каким-то образом защищен от такого чтения локонов. Или, может быть, кому-то это удастся?

Вот код:

    $cookie_file_path = "cookies.txt";
$LOGINURL         = "https://dev.flurry.com/secure/login.do";
$MY_EMAIL ="my email";
$MY_PASS="password";
$MY_GAME_ID="gameid";

$ch = curl_init();

curl_setopt($ch, CURLOPT_HEADER,  0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6");
curl_setopt ($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path);
curl_setopt ($ch, CURLOPT_REFERER, $LOGINURL);curl_setopt($ch, CURLOPT_URL, $LOGINURL);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "loginEmail=$MY_EMAIL&loginPassword=$MY_PASS&__checkbox_rememberMe=true&struts.token.name=struts.token&struts.token=7NB9NWLOYZ8SD8TWR8LGS63REVDI8SQS");

$result = curl_exec($ch);$remotePageUrl = "https://dev.flurry.com/eventsLogCsv.do?projectID=$MY_GAME_ID&versionCut=versionsAll&intervalCut=7Days&stream=true&direction=1&offset=0";
curl_setopt($ch, CURLOPT_POST, 0);
curl_setopt($ch, CURLOPT_URL, $remotePageUrl);
$result = curl_exec($ch);

echo $result;

Также пытался передать куки (как это делается из браузера), но ничего не помогло:

Cookie: _ga=GA1.2.100867533.1424333566; S0hZTkM0RFRXRjJNSlg2TVdXSEs_fit=1424333594147; fid=SG1162A8DEFC14B8428E7C2AFC71D3AEA00C1872F5; JSESSIONID=w34~mvbdvftm9x9dez9dg9b2pmhs; _map_zoomLevel=0;
_map_zoneId=0; __utmt=1; __utmt_~1=1; S0hZTkM0RFRXRjJNSlg2TVdXSEs_fs=eyJiYSI6MTQyNDMzNzkzMzU2OCwicGF1c2VUaW1lc3RhbXAiOjAsImJjIjotMSwiZXZlbnRDb3VudGVyIjowLCJwdXJjaGFzZUNvdW50ZXIiOjAsImVycm9yQ291bnRlciI6MCwidGltZWRFdmVudHMiOltdfQ==;
__utma=83277827.100867533.1424333566.1424333594.1424336847.2; __utmb=83277827.8.10.1424336847; __utmc=83277827; __utmz=83277827.1424333594.1.1.utmcsr=flurry.com|utmccn=(referral)|utmcmd=referral|utmcct=/; __utma=34058230.100867533.1424333566.1424333566.1424336847.2; __utmb=34058230.8.10.1424336847; __utmc=34058230; __utmz=34058230.1424333566.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); _mkto_trk=id:802-TBR-126&token:_mch-flurry.com-1424333577360-64839; S0hZTkM0RFRXRjJNSlg2TVdXSEs_flp=1424338032448

Благодаря silkfire Шквал проблема решена!

4

Решение

struts.token является токеном CRSF, который привязан к вашему сеансу и регенерируется при каждой загрузке страницы. В вашем коде, однако, это статично. Вам нужно извлечь его после первого запроса cURL, а затем вставить его в массив POST, который будет использоваться для вашего второго запроса.

Также страница, на которую вы должны войти, /loginAction.do и не /login.do,

Вот как я успешно вошел в Flurry:

$post = [
'loginEmail'        => 'E-MAIL',
'loginPassword'     => 'PASSWORD',
'struts.token.name' => 'struts.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['struts.token'] = $xpath->query('//input[@name="struts.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));

$data = curl_exec($ch);echo $data;
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]