从去年年末开始,各大APP就开始给用户推送他们的「年度报告」。很快啊,朋友圈就被网易云、QQ音乐、B站的年度报告刷屏了。说起来还挺矛盾的,人们一边为自己的信息泄露而焦虑着,一边又享受着别人分析自己数据。今天吃完板烧鸡腿堡出来在群里看到好多人在讨论浙大出的这个信息化年度数据账单,然而并没有什么有价值的数据。
下午摸鱼的时候稍微分析了一下接口,不复杂,但是因为想当然浪费了很多时间。网址:
https://it2020.zju.edu.cn/
一个小坑:访问
https://it2020.zju.edu.cn/
会跳转到实际的页面
https://it2020.zju.edu.cn/share
,但是直接访问
https://it2020.zju.edu.cn/share
则会跳转到微信推文的页面。用浏览器随便抓一下包,容易看出所有的数据都包含在这条POST请求的响应中:
这个请求有两个参数,其中
redirect_uri
为固定参数,我们只需要找到
code
这个参数就好了。之前写浙大通行证模拟登录的时候就发现登录时会发送多个状态码为302的重定向请求:
这里重定向的过程是通过如下方法获得的:
# 登录
resp = s.post(......)
for r in resp.history:
print(r.status_code, r.url)
因为这里最后一次重定向请求的URL中包含一个ST开头的
ticket
参数,我就想当然的觉得我们需要的
code
参数就是这个。然而把这个
ticket
参数的值扣下来赋值给
code
,然后发送POST请求,得到的响应为「
500 Internal Server Error」。我只好按部就班地沿着请求列表向上找,希望能找到
code
参数的来源。一番攀谈交心了解到,
code
参数和上面一个302重定向的请求中的
ticket
参数相同:
而这个请求是由登录的POST请求重定向而来的:
到这里,解决办法就很显然了——把登录时的URL稍作调整即可。把每一次重定向的过程都print出来,可以看出,在登录过程中,有两个重定向URL都包含
ticket
这个参数,但是它们的值是不一样的,第一个
ticket
的值才是我们想要的
code
参数的值。