Не удается войти с помощью curl на сайт GameAnalytics

0

Я использую Game Analytics (GameAnalytics.com) в своем приложении. Для тех, кто не знаком с GA, это бесплатное приложение для анализа мобильных приложений, такое как шквал. Мне нужен какой-то анализ, который GameAnalytics не будет делать, поэтому я загружаю сырые данные события json, разбираю и храним его в локальной БД для дальнейшей обработки. Сначала я думал, что все нормально загружать данные вручную каждый раз, но потом я понял, что я раздражаю, и лучше автоматизировать это действие.

У меня нет глубокого понимания webdev, php и js, хотя я использую php в течение многих лет в основном для служебных программ и программных бэкэндов.

Поэтому я использовал сниффера и смог воспроизвести запрос GET с куки файлами на php:

$rollingCurl = new RollingCurl();
$rollingCurl->get("https://query-2.gameanalytics.com/v1/games/$game_id/export?start=$from&end=$to&_=0521345345333644",
  array(
      "Host: query-2.gameanalytics.com",
      "Connection: keep-alive",
      "Accept: application/json, text/plain, */*",
      "Origin: https://go.gameanalytics.com",
      "User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 YaBrowser/14.12.2125.10034 Safari/537.36",
      "Authorization: priv-eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9.eyJ0bblahblah....",
      "Referer: https://go.gameanalytics.com/game/$game_id/settings/export-data",
      "Accept-Encoding: gzip,deflate",
      "Accept-Language: en;q=0.8"
  )
);

Но этот запрос использует файлы cookie, срок действия которых истекает. Таким образом, единственный способ - скопировать файлы cookie существующего сеанса и вставить их в php-код, что неудобно.

Я знаю, что я должен открыть сессию curl, зайти на сайт gameanalytics.com, а затем использовать этот сеанс для загрузки данных, которые мне нужны. Аналогичный подход успешно используется в: Загрузите журнал событий с использованием curl

Но я почему-то не могу войти. Это похоже на некоторую защиту. Основная форма входа формирует целевой URL с некоторым числом, которое я не могу найти в источнике страницы.

go.gameanalytics.com/api/v1/public/login/basic?_= 0600650333334639

Может быть, есть некоторые известные схемы или обходные пути? Или как-то связано с страницей cookie при первой загрузке?

Когда я использую этот номер для входа через curl, он терпит неудачу:

$ch = curl_init('go.gameanalytics.com/api/v1/public/login/basic?_=0600650333334639');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 YaBrowser/14.12.2125.10034 Safari/537.36");
curl_setopt($ch, CURLOPT_COOKIEFILE, null);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, '{"email":"$EMAIL","password":"$PASSWORD","remember":false}');
$data = curl_exec($ch);
//returns: {"errors": [{"msg": null, "type": null, "id": "405"}], "results": []}

На всякий случай здесь журнал успешного запроса входа в браузер (все конфиденциальные данные были изменены, конечно):

POST https://go.gameanalytics.com/api/v1/public/login/basic?_=0665297234573059 

***Headers***
HTTP/1.1
Host: go.gameanalytics.com
Connection: keep-alive
Content-Length: 74
Accept: application/json, text/plain, */ *
Origin: https://go.gameanalytics.com
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 YaBrowser/14.12.2125.10034 Safari/537.36
Content-Type: application/json;charset=UTF-8
Referer: https://go.gameanalytics.com/login
Accept-Encoding: gzip,deflate
Accept-Language: ru,en;q=0.8
Cookie: __utmt=1; AWSELB=F7D56DAB06335D820C6DA102697F76E63C69B5593D8E1CA61696696A520EC8B406E1ACF7E4CBD4284F123BC02162F0E8265430E673426B0EE263D10D29A3D5A; ga_user_id=ga_user_048304342233359914; ga_session_id=ga_session_0967241199979347; gaUserTokenOld={"token":"9.eyJsaW5rZWQiOiBudWxsLCAiaWQiOiAxNTU2OCwgImV4cCI6IDE0MjQzNDI2NTAsICJyZW1lbWJlciI6IGZhbHNlfQ.8ZYJ9yq2xETeAmY6rfiYAtxJybxDbGyaAE","exp":1424342650000}; __utma=153348830.970035277.1424344521.1424345621.1424355621.1; __utmb=153878340.5.10.1424451621; __utmc=156578830; __utmz=153854830.1424354621.1.1.utmcsr=yandex.ru|utmccn=(referral)|utmcmd=referral|utmcct=/; visitor_id20732=101885788

***Body***
{"email":"HERE_IS_MY_EMAIL","password":"HERE_IS_MY_PASSWORD","remember":false}

And response: 

***Headers***
HTTP/1.1 200 OK
Cache-Control: no-store, no-cache, private, must-revalidate, proxy-revalidate
Content-Type: application/json
Date: Thu, 19 Feb 2015 10:31:22 GMT
Server: nginx/1.6.2
Content-Length: 284
Connection: keep-alive

***Body***
{"errors": [], "results": [{"linked": null, "token": "9.eyJsaW5rZWQiOiBudWxsLCAiaWQiOiAxNTU2OCwgImV4cCI6IDE0MjQzNDI2NTAsICJyZW1lbWJlciI6IGZhbHNlfQ.8ZYJ9yq2xETeAmY6rfiYAtxJybxDbGyaAE", "id": 99568, "exp": 1424342781, "remember": false}]}
Теги:
curl
cookies
session

1 ответ

3
Лучший ответ


Я работаю @GameAnalytics и разработал/закодировал эту систему, чтобы я мог помочь вам.

Пожалуйста, знайте:

  • мы официально не поддерживаем ручное использование веб-инструмента api
  • поэтому ваш код может сломаться в любое время, если мы изменим материал

Когда автоматизация использования этого подхода делает это ответственно.

  • не загружайте одни и те же файлы снова и снова
  • остановить сценарий в будущем, когда вам больше не нужны данные
  • чтобы частота скрипта работала до минимума (например, один раз в день)

В основном оптимизируйте свой сценарий, чтобы не напрягать наши системы. Мы контролируем использование и оставляем за собой право блокировать учетные записи, использующие плохую реализацию.

Также вы должны удалить токен в сообщении выше. :)

Решение

Хорошо... теперь, когда отказ от ответственности закончен, мы можем получить удовольствие! Вы в основном на правильном пути.

получить токен

Как и вы, сделайте запрос на общедоступный логин.

https://go.gameanalytics.com/api/v1/public/login/basic

Затем вы извлекаете токен в данных JSON. Этот токен истекает в течение 15 минут или около того (посмотрите на значение временной метки exp), а также значение, которое будет помещено в cookie через AngularJS позже (при правильном входе в систему).

использовать токен

Получите токен из данных и используйте его для доступа ко всем другим маршрутам веб-инструментов, поместив их в заголовок "X-Authorization" запроса. Чтобы проверить различные маршруты, я бы рекомендовал установить полезное расширение "почтальон" Chrome.

получение списка игр

Используйте токен, чтобы получить данные для своей учетной записи.

https://go.gameanalytics.com/api/v1/user/data

Это вернет данные JSON со студиями, играми и т.д. Найдите поле "studiosGames" в данных и найдите нужную игру. Внутри игрового словаря вам нужно найти токен, хранящийся в "dataApiToken".

загрузки

"DataApiToken" также является токеном, и он истекает. Используйте его, чтобы связаться с нашим API показателей для получения данных для конкретной игры. Этот API использует заголовок "Авторизация" для размещения маркера.

Назовите этот URL:

https://query-0.gameanalytics.com/v1/games/[game_id]/export?start=[start_timestamp]&end=[end_timestamp]

Я рекомендую проверить инструмент с помощью Chrome (вкладка сети), чтобы узнать, какие маршруты/параметры используются для вашей игры.

После запроса вы должны получить данные JSON с загружаемыми URL-адресами. Используйте эти файлы для извлечения файлов. Эти URL-адреса истекают через несколько часов.

Дайте нам знать, если это поможет!

Не забудьте не передавать ваши ключи/токены на веб-сайты (например, это), поскольку они предоставляют другим людям доступ через наши API. И.. как уже упоминалось - ведите себя ответственно!

  • 0
    Большое спасибо за ответ, очень рад видеть вас там! Во-первых, спасибо за вашу систему! Пожалуйста, не волнуйтесь, в моем посте нет реальных данных. И да, я планирую использовать скрипт редко, мне тоже не нужны накладные расходы. 1. Основная проблема была не в загрузке данных, а в входе в систему. Как получить параметр ссылки "_" для входа в систему? 2. Есть ли вероятность, что мне нужно повторно загрузить определенный файл (возможно, из-за обновления данных на вашей стороне), или я могу сохранить имена файлов, чтобы не загружать один и тот же файл дважды?
  • 0
    Здравствуй. Параметр _ предназначен просто для того, чтобы избежать кеширования. Это случайное число, сгенерированное нашим кодом API AngularJS.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню