记一次某运动App登录+会员课程下载

考试完一大段假期,想锻炼一下。下载了久违的Keep,结果首页随便一点就是会员课程,看不了一点,这能忍?


1. 在登录态浏览付费课程,总之先抓个包

屏幕截图 2023-06-20 141823

这里使用了WSA+Fiddler的方案,参考使用Fiddler在WSA(Windows安卓子系统)上抓包

看到一个特征极强的请求。

GET https://api.gotokeep.com/course/v3/plans/64781e13a5ac4d0001cd5d7b?trainer_gender=M&betaType= HTTP/1.1
Host: api.gotokeep.com
Connection: Keep-Alive
Accept-Encoding: gzip
x-device-id: kxxxxxxf
x-is-guest: N
User-Agent: Keep+7.52.0%2FAndroid+13-40233+Google+Pixel+5
x-version-name: 7.52.0
x-mock: false
x-carrier: 0
Authorization: Bearer eyxxxxxxxpM
x-is-support-64-bit: true
x-locale: zh–CN
x-app-platform: keepapp
x-connection-type: 2
x-channel: huawei_store___
x-manufacturer: Google
x-session-id: 168xxxxx640
x-is-new-device: true
x-timestamp: 168xxxxxx832
x-screen-width: 851
x-gp: eLpt4xxxxxxBZRw==
x-ads: yESxxxxxxxx=
x-user-id: 62xxxxxxxx282
x-flutter-plugin-version: 7.46.0.0
x-version-code: 40233
x-os: Android
x-screen-height: 880
x-os-version: 13
x-model: Pixel+5
x-keep-timezone: Asia/Shanghai

可以看到,尽管没充会员,这个响应中还是有我们感兴趣的东西
屏幕截图 2023-06-20 142352
下载后发现正是我们需要的会员课程视频。
把请求拖进Composer,经过筛选,发现必要的header只有Authorization一个,也没有签名之类的煞风景的东西。接下来要实现自动化,需要不抓包的情况下得到token。

2. 在登录态浏览付费课程,总之先抓个包

抓取App登录请求,发现有签名,于是放弃。
有没有其他办法呢?
有了,网页端登录!
打开Keep官网,空空如也,没有登录的地儿。
屏幕截图 2023-06-21 102333
这难不倒我们,Bing搜索”Keep 后台”
搜索结果第一位:my.gotokeep.com
屏幕截图 2023-06-21 102746
是我们熟悉的二维码登录,直接F12看网络请求。
看到下面两个请求:

请求 URL:
https://api.gotokeep.com/account/v2/qrcode?authType=my
请求方法:
GET
状态代码:
200
远程地址:
42.187.199.248:443
引用者策略:
no-referrer-when-downgrade
Response:
{
“ok”: true,
“data”: {
“qrcodeId”: “649260623xxxxxxxxx”,
“qrcodeUrl”: “https://api.gotokeep.com/account/v2/qrcode/image/649260623e69380001ddd629",
“redirectUrl”: “https://show.gotokeep.com/login/auth?qrcodeId=649260623e69380001ddd629&authType=my"
},
“errorCode”: “0”,
“now”: “2023-06-21T02:28:50Z”,
“version”: “1.0.0”,
“text”: null,
“more”: {}
}

请求 URL:
https://api.gotokeep.com/account/v2/qrcode/login_check?qrcodeId=64926xxxxxxxxxxxxxxx2807
请求方法:
GET
状态代码:
200
远程地址:
42.187.199.248:443
引用者策略:
no-referrer-when-downgrade
{
“ok”: true,
“data”: {
“token”: “eyxxxxxxxxxxxxxxxxxxBx4”,
“user”: {
“id”: “62d2xxxxxxxxxxxxxxxx282”,
“username”: “爱xxxxxx”,
“wechatNickName”: null,
“avatar”: null,
“gender”: “M”,
“level”: 0,
“goal”: 0,
“memberStatus”: 0
}
},
“errorCode”: “0”,
“now”: “2023-06-21T02:32:13Z”,
“version”: “1.0.0”,
“text”: null,
“more”: {}
}
写段Python模拟这个过程
def get_token(): loginQrData=requests.get("http://api.gotokeep.com/account/v2/qrcode?authType=my").json() logging.info(loginQrData) webbrowser.open(loginQrData["data"]["qrcodeUrl"]) while True: check=requests.get("http://api.gotokeep.com/account/v2/qrcode/login_check?qrcodeId="+loginQrData["data"]["qrcodeId"]).json() logging.info(check) if check["ok"]: return check["data"]["token"] else: time.sleep(3)

测试通过。

3. 题外话&成品。

抓包时可以看到使用游客登录时会获得一个token,而这个token也能达到获得真实视频地址的目标。
成品在Github