前言
csgo 除了官方服务器,还有各种的第三方平台如国外的 esea,faceit 以及国内的三家b5,5e 和完美平台。
每个平台上都会记录详细的个人数据,我打算将这些数据整合起来展示,因此需要抓到平台的数据接口。
浏览器(devtools)
5E平台提供了网页,而B5和完美只有客户端,从最简单的网站开始。
在 5e 的网站上找到我的个人主页,并打开开发者工具的网络选项,就可以看到请求。
很可惜,5e的网站是服务端渲染,没找到所需的api端点,只能下载抓包工具打开客户端探索了。
windows 端 fiddler
在 windows 系统中,我下载了fiddler进行抓包,软件使用需要注册登录并配置 https,在本机抓包无需额外的配置,相当顺利的找到了 5e 和 b5 的端点。
我还尝试使用了charles,但软件设计较为复古,免费版体验也不如人意。
本认为会这么顺利的进行下去,完美平台时却有些不同。每一个接口,都需要a,r,s,t四个参数。我不能确定这四个参数的意义,我需要的个人数据接口更是需要 12 个参数。
这12个参数每一个都不能缺少,测试时其中一些一直在变化,这种不稳定的端点难以使用,因此只能放弃。
ios 抓包
偶然间想起了完美还有一款手机app(完美世界电竞),虽然无法确认它们是否使用相同的端点,从学习的角度决定试试手机的抓包。
还是使用fiddler,安装打开后,根据提示安装电脑端的证书。在设置的 https 选项中添加 ignore server certificate errors,以及在 connections 中添加 allow remote computers to connect。然后保证手机和电脑处于同一网络下,用手机 safari 打开对应的地址(由电脑 ip 和软件中设置的端口组成)下载证书。在 ios14 中,需要在 general-> profile 中进行安装,general -> about -> certificate trust settings 中启用。还需要在手机设置中找到对应 wifi 设置 http 代理,填入电脑的 ip 地址和对应端口。
此时在手机打开完美世界电竞进入对应界面,fiddler 会实时显示所有的信息。
可以发现个人数据和高光视频的端点都不需要任何额外的参数,仅需要steamid即可查询。
surge
除了借助电脑对手机应用进行抓包,我还购买了surge,相比我之前使用的代理工具可以提供更多的功能和信息,并且无需使用电脑。
安装证书后打开mitm
和抓取流量
,进入需要抓包的应用操作,返回 surge 即可查看最近访问请求,点击可预览返回的 json 数据。
除了尝试了新的工具,手机APP的接口仅使用steamid或者用户名就可以查询,相比PC客户端抓包需要加密入参的方式更易用。
端点总结
找这些接口让我有解密的快感,顺便学习了一点抓包的知识和工具的使用,很好玩。
找到的端点如下
- 5e(get)
https://client.5ewin.com/api/data/player_detail/a73841959?yyyy=2021&season=1&match_type=1
(自行更换用户名和赛季等参数,以下不做提示)
- 完美个人数据(post)
https://api.wmpvp.com/api/v2/csgo/pvpDetailStats
body : {“steamId64”:“76561198863365348”,“csgoSeasonId”:“s3”}
- 完美高光(get)
https://appactivity.wmpvp.com/steamcn/video/getPerfectList?toSteamId=76561198863365348
- b5(get)
https://api.xiaoheihe.cn/game/csgo/b5/get_player_overview/?account_id=903099620 (accountid 可在 b5 战绩对应页面右上角获取)
接口聚合
出于保护 steam 密钥和减少客户端请求次数的角度,需要一个能汇总以上数据并进行简易加工的接口。
本打算部署在 vercel,但其对超时的要求为 10s(netlify 同),因此客户端请求偶尔会出错。尝试了 firebase 的云函数然而我并没有办法使用 blaze 方案,转为使用国内的服务。
阿里云提供的服务相对简陋,选择了腾讯云。虽然开发体验不佳,但能提升访问速度还是值得的。
接口应用
拥有了以上平台与steam的接口数据就足够了。
在ios14下制作一个汇集所有平台数据的小部件,比网页更实用,还可以和好友分享。
除了以上各平台的数据我还获取了服务器中的段位,csgo游戏时间。 官方的文档中规中矩,但并不能很好的入门,还好reddit上找到了不少示例,成品如下图。