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

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

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

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

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

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

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

Насколько я понимаю, я должен попробовать войти в POST с помощью curl, и чтобы это соединение выполняло GET для загрузки данных. Тем не менее я не могу войти в систему даже при копировании всего тела запроса POST-запроса – он отвечает с той же страницей регистрации, хотя должен переадресовать 302 на https://dev.flurry.com/fullPageTakeover.do?originalTarget=&isFirstPostLogin=true&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 (например, из браузера), но ничего не помогло:

 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 проблема Flurry решена!

    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;