Я начал использовать Flurry Analytics и обнаружил, что его инструменты анализа недостаточны и слишком медленны. Простая последовательность из 3 шагов была обработана в течение 3 дней, в то время как обычно запрос с 3 левыми объединениями занимает 0,001 секунды для таблицы с 100 000 строк.
Flurry позволяет загружать необработанные данные о событиях в формате csv на страницу журналов событий, поэтому я решил импортировать все события и проанализировать их дома.
Flurry позволяет загружать только 100 000 записей, и они советуют просто загружать часто, чтобы соответствовать этому ограничению. У них был сырой API загрузки событий, но он почему-то отказался от него. Таким образом, единственный способ — перейти на страницу журналов событий и загрузить данные о событиях вручную. Но, как вы можете себе представить, это очень раздражает.
Поэтому я решил получить эти данные, используя curl в php. Я скопировал HTTP-запрос GET для загрузки ссылки с заголовками и получил данные.
Но вся магия в сеансе / куки, которые я могу просто скопировать из существующего сеанса. Итак, чтобы сделать запрос curl успешным, я должен:
Я не уверен, но предположим, что срок действия файлов 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 Шквал проблема решена!
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;
Других решений пока нет …