0

我在我的应用程序中使用游戏分析 (GameAnalytics.com)。对于不熟悉 GA 的人来说,它是一项免费的移动应用分析服务,例如 flurry。我需要一些 GameAnalytics 不会做的分析,这就是为什么我下载原始 json 事件数据,解析并将其存储在本地数据库中以供进一步处理。首先我认为每次手动下载数据都可以,但后来我意识到我很烦人,最好自动执行此操作。

我对 webdev、php 和 js 没有深入的了解,尽管多年来我主要将 php 用于实用程序和软件后端。

所以我使用了嗅探器,并且能够在 php 上使用 cookie 重现 GET 请求:

$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"
  )
);

但是这个请求使用了很快就会过期的cookies。所以唯一的方法是复制现有会话的cookie并将它们粘贴到php代码中,这很不方便。

我知道我必须打开 curl 会话,登录 gameanalytics.com,然后使用此会话下载我需要的数据。类似的方法成功用于: Download flurry event log using 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}]}
4

1 回答 1

4


我在@GameAnalytics 工作并设计/编码了这个系统,所以我可以帮助你。

请知悉:

  • 我们不正式支持手动使用 web-tool api
  • 因此,如果我们更改内容,您的代码可能随时中断

当使用这种方法进行自动化时,要负责任地这样做

  • 不要一遍又一遍地下载相同的文件
  • 以后不再需要数据时停止脚本
  • 将脚本运行的频率保持在最低限度(例如每天一次)

基本上优化您的脚本以不给我们的系统带来压力。我们监控使用情况并保留阻止使用不良实施的帐户的权利。

此外,您应该删除上面帖子中的令牌。:)

解决方案

好的..现在免责声明结束了,我们可以开始有趣的事情了!你基本上是在正确的道路上。

获得令牌

就像您在上面所做的那样,向公共登录路由发出请求。

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

然后,您检索 JSON 数据中的令牌。该令牌将在 15 分钟左右内过期(查看 exp 时间戳值),也是 AngularJS 稍后放置在 cookie 中的值(在进行适当的工具登录时)。

使用令牌

从数据中获取令牌并通过将其放置在请求的“X-Authorization”标头中来使用它来访问所有其他 Web 工具路由。为了测试不同的路线,我建议安装有用的“邮递员”Chrome 扩展。

获取游戏列表

使用令牌获取您帐户的数据。

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

这将返回包含工作室、游戏等的 JSON 数据。在数据中找到“studiosGames”字段并找到您需要的游戏。在游戏字典中,您需要找到存储在“dataApiToken”中的令牌。

下载

“dataApiToken”也是一个令牌,它将过期。使用它来联系我们的指标 API 以获取特定游戏的数据。此 API 使用“授权”标头来放置令牌。

调用这个网址:

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

我建议使用 Chrome(网络选项卡)检查该工具,以查看您的游戏使用了哪些路由/参数。

然后,您应该从请求中获取带有要下载的 URL 的 JSON 数据。使用这些来获取文件。这些网址将在几个小时后过期。

让我们知道这是否有帮助!

请记住不要在网站上(像这样)分享您的密钥/令牌,因为它们通过我们的 API 授予其他人访问权限。并且..如前所述-负责任地行事!

于 2015-02-23T12:02:47.107 回答