首先请保证安装fiddler,雷电模拟器
如果没有安装fiddler的话,可以看一下这篇文章


此文章具有时效性,不过其实过程也就是那样,要学习一下分析的思路,一力破万法!

前情提要

前几天在qq群里看到有人发一个截图,就是在游戏中有人发送队友近期战绩,感觉很好用,不用自己在每局开始用wegame一个一个查询了,但是后来查了一下发现是一个插件。这里感觉有点不太敢用了。

然后既然都想要查战绩了,那么就开搞呗

分析

首先其实我是想看看有没有现成的战绩查询网站让我利用一下,转了半天都没查到。然后就想着用fiddler抓wegame的包试试,结果发现有点难搞,所以最后决定尝试用一下掌上英雄联盟/掌上wegame。

掌上英雄联盟

首先在雷电模拟器下载一下掌上英雄联盟,然后配置一下fiddler,这些应该都不用说吧。然后我们打开掌上英雄联盟,会发现有一堆的包可以看,但是这些都不是我们要的,我们直接点开好友,然后查询战绩。
首先就是让我们所有的请求都加载出来,然后这时候掌盟就弹出了很抱歉,掌上英雄联盟已停止运行,但是我们数据都已经加载出来了,这时候就不需要用到模拟器了。
掌上英雄联盟战绩查询1
掌上英雄联盟战绩查询2
掌上英雄联盟战绩查询3
掌上英雄联盟战绩查询4

内容分析

首先点击一下左下角的Capturing,停止抓包,要不然会一直加载数据。
停止抓包

然后就是分析fiddler的内容
搜索信息
其实主要是看请求头里的Raw,比较醒目,然后再就是看响应头的json,比较易看。
这个请求应该是搜索请求,因为我们可以通过上面的请求json数据知道他发送了一个游戏id,empress97,然后又发送了一个游戏名字的id,lol。下面的响应内容呢?
下面的响应内容则是搜索到的信息,其实这里推荐和手机搭配起来看,这边一搜,那边就看着内容进行对应。

{
    "data": {
        "search_nick": "empress97",
        "client_type": 9,
        "player_list": [{
            "area_id": 12,
            "game_nick": "Empress97",
            "rank": 4,
            "tier": 1,
            "rank_title": "白银II",
            "uuid": "",
            "gender": 2,
            "age": 22,
            "sns_nick": "亚索他天天1v3",
            "logo_timestamp": 1634388387,
            "logo_url": "http://down.qq.com/lolapp/lol/summoner/profileicon/4804.jpg",
            "icon_id": 4804,
            "gametoken": "droI8r9Vz/Kbc9JLBuntxCgn96R+EksLPeI7/JF5fmXogsG40ruJRulv649QLjN7oI="
        }, {
            "area_id": 3,
            "game_nick": "Empress97",
            "rank": 255,
            "tier": 255,
            "rank_title": "",
            "uuid": "",
            "gender": 2,
            "age": 0,
            "sns_nick": "       0226",
            "logo_timestamp": 0,
            "logo_url": "http://down.qq.com/lolapp/lol/summoner/profileicon/15.jpg",
            "icon_id": 15,
            "gametoken": "Z+XXZ3gIoPbzaFYIhe19r9o/eR07KnABgADTv/5pgEPeYdvkM2B8Kipvl32v5+FCCmtBpG"
        }]
    },
    "err_msg": "",
    "msg": "",
    "result": 0
}

然后其实可以简单想一下,他这里有一个gametoken,这个大概率就是获取游戏信息的东西,有了gametoken就可以获取游戏数据了,我们继续分析下面的请求。
获取user_id
查看下一个请求就获得了一个新的内容,将gametoken发送到一个链接后,获得user_id,这个也没啥好分析的,就是将gametoken转化成了user_id。

selfuuid
这个是获取一个叫selfid的东西,他发送的请求是要加上devicedid,这个id其实我之前分析的时候看到过,应该是这个app登录后,会通过请求来获取一个这样的id,如何获取可以在下一篇文章中写一下,我们只需知道这个东西这样获取就行了。
游戏数据
一直往下翻,其中的请求都是一些没啥用的请求,获取一些成就之类的数据,一直到第14条请求,我们可以看到他是获取的游戏数据,终于到了游戏数据了。

游戏数据分析

我们首先看一下他的请求头发送的json数据,一个是self_uuid,这个就是前面的那个uuid,通过devicedid来获取的那个id,然后再就是area_id,这个大概率就是一个大区id了,因为可能需要好几个信息来获取数据,要不然太容易被获取了,再就是gametoken,不过这里是空,我们可以猜测应该是换成了前面的user_id,不出所料,后面的那个target_uuid就是前面的user_id。
游戏数据分析

我这里简单的放一个游戏对局的数据。

{
    'game_id': 2786084136,
    'battle_time': '2021-11-08 19:05:15',
    'battle_map': 11,
    'game_type_id': 0,
    'game_type_name': '',
    'game_mode_id': 4,
    'game_mode_name': '单双排',
    'champion_id': 114,
    'champion_name': 'Fiora',
    'game_result': 1,
    'game_score': 707,
    'champions_killed': 4,
    'num_deaths': 6,
    'assists': 1,
    'is_mvp': 0,
    'is_have_friend': 0,
    'is_belong_game': 0,
    'is_few_defeat_many': 0,
    'team_id': 100,
    'is_fifthkill': 0,
    'is_champion_battle': 0,
    'champion_battle_url': 'https://lol.qq.com/',
    'is_svp': 0,
    'score': '7.1'
}
battle_time--对局时间
game_result--游戏结果
champions_killed--杀敌数
num_deaths--死亡数
assists--助攻数
is_mvp--是否是mvp
is_have_friend--是否有队友
is_svp--是否是svp
score--评分

请求分析

终于来到正题了,我们已经将所有的内容都获取到了。
那么我们大体来分析一下这个是怎么一个运行的方法。
首先打开app,会获取一个devicedid,然后我们用这个devicedid来获取self_uuid,之后我们将游戏id以及gameid等一起打包成json发送请求,会获得所有这个id的数据,我们从中获取到自己要查询的那个id的gametoken,之后用gametoken请求获得user_id,这样我们就获得了所有的数据。
将self__uuid,user_id,area_id打包成json发送请求,就会获得该id近期的对局数据了,我们再通过上面的字典对应的key值获取自己想要的值即可。

代码其实毫无技术含量吧,就是requests.post请求,然后再就是将返回的数据处理一下,得到自己需要的数据,再次请求,处理,请求,处理。

就不贴代码了,如果有需求的话,可以看看我的GitHub。

注意

  1. 首先,我们最好用fiddler的raw中的请求头数据,cookie的话,应该是必须要加的,现在好像没有不加cookie就能查战绩的方法,wegame可能不需要,因为我看他有游客登录
  2. cookie大概率会有一个时效性,可能是app关闭,可能是1天等,需要自己测试
  3. 大区id我会贴在最后,不过其实有的时候我发现貌似也不是这样判断的,就很迷,应该是没错的
  4. 那个游戏中获取数据的插件,应该也是类似,抓取到数据然后发送请求,要不然的话不会绑定游戏,我估测应该是绑定到游戏进程中,然后通过抓包等获取到对局的信息,应该可能大概类似于那个对局先知,然后进行请求再发送出来。不过确实不是很敢用这个插件,毕竟会检测运行的进程
  5. 最后就是禁止转载!如果有什么疑问,改进的方法可以发到评论区或者可以发送邮件给我。

大区id

这个是我查uzi这个id挨个改的,可以自己测试一下。

艾欧尼亚 1
比尔吉沃特 2
祖安 3
诺克萨斯 4
班德尔城 5
德玛西亚 6
皮尔特沃夫 7
战争学院 8
弗雷尔卓德 9
巨神峰 10
雷瑟守备 11
无畏先锋 12
裁决之地 13
黑色玫瑰 14
暗影岛 15
恕瑞玛 16
钢铁烈阳 17
水晶之痕 18
均衡教派 19
扭曲丛林 20
教育网专区 21
影流 22
守望之海 23
征服之海 24
卡拉曼达 25
巨龙之巢 26
皮城警备 27
男爵领域 30
峡谷之巅 31
最后修改:2021 年 11 月 11 日 06 : 49 PM
如果觉得我的文章对你有用,请随意赞赏