百度贴吧二维码扫码登录过程分析

科技一点鑫得 2024-03-09 00:44:07
首先找到二维码图片链接

在浏览器开发工具network页签中可以轻松找到二维码链接,url示例如下

https://passport.baidu.com/v2/api/qrcode?sign=7e40fda3aceb18d409a3ad26359efacf&lp=pc&qrloginfrom=pc&logPage=traceId%3Apc_loginv4_1685610693%2ClogPage%3Aloginv4

分析查询参数猜测168开头的基本就是时间戳,应该是可以构造的。只有一个sign是需要知道怎么来的,从名称来看为签名串,这个值应该是在之前的请求中返回的,Ctrl+F打开搜索框搜索sign的值,可以直接找到是在哪个请求中返回的。

返回sign的请求

找到是下面的请求响应中携带了sign的值

https://passport.baidu.com/v2/api/getqrcode?lp=pc&qrloginfrom=pc&gid=DAF0412-DA10-404B-8AA5-7DDC4AD65510&oauthLog=&callback=tangram_guid_1685610692859&apiver=v3&tt=1685610693098&tpl=tb&logPage=traceId%3Apc_loginv4_1685610693%2ClogPage%3Aloginv4&_=1685610693101

继续分析这个请求的参数,发现除了gid之外基本都是可以构造的。在源代码页签按Ctrl+Shift+F可以打开全局搜索,搜索v2/api/getqrcode可以找到gid生成的方法e.guideRandom及实现代码,发现gid为前端随机生成,也就是说同样可以构造。也就是这个请求的参数全部都可以构造出来,那么就可以通过这个请求拿到sign值,进一步通过sign构造请求得到二维码图片。

轮询等待扫描二维码

拿到了二维码,接下来就是等待用户扫码登录的过程了。扫描登录是通过轮询发送下面的请求来查询二维码扫描的状态,二维码有未扫码、已扫码、已登录三种状态,为服务器端返回。

https://passport.baidu.com/channel/unicast?channel_id=6204c8850e9e74387944504663e3f508&gid=78A1874-2069-4BCB-854B-D4D6C3C37CB0&tpl=tb&_sdkFrom=1&callback=tangram_guid_1685669846982&apiver=v3&tt=1685669877669&_=1685669877670

分析这个轮询请求的参数发现channel_id就是上面得到的sign值,其他参数都可以构造。未扫码、已扫码、已登录三种状态的响应结果分别如下:未扫码返回

已扫码返回

已登录返回

正式的登录请求

用户扫码登录之后,轮询请求响应中返回了一个v值,接着又会发起下面这个请求正式请求登录。这个请求的响应中包含了保持登录的cookie信息以及用户名信息。cookie信息可以保存下来作为下次请求的cookie,这样就可以保持登录状态了。

https://passport.baidu.com/v3/login/main/qrbdusslogin?v=1685670178870&bduss=2eef858b34827ade3bffec6acbd5a0f9&u=&loginVersion=v4&qrcode=1&tpl=tb&apiver=v3&tt=1685670178870&traceid=&time=1685670179&alg=v3&sig=VkdBbVBUWVhZSXhtT1NzNVZTQ3ZOMGs0TDlDaWg4N1lRM0RVc0JaVzNkbEYrbW5RbkVVQTdJSWswV0tNNDB0Rg%3D%3D&elapsed=13&shaOne=00d5d7019720edf3cd7113a57273eec2451e8971&rinfo=%7B%22fuid%22%3A%22eb7e862fec8d30ff2f0d15c44eb2b7c7%22%7D&callback=bd__cbs__j8sojo

经过分析请求登录的参数发现bduss为轮询请求成功登录后返回的channel_v中的v值,除sig、shaOne、rinfo三个参数之外,其他参数都可以构造,不过经过测试发现sig、shaOne、rinfo这三个参数并没有什么实质作用,直接保留原值就行。

总结

理清了百度贴吧扫码登录的过程,就可以编写脚本通过调用api的方式实现贴吧的模拟登录,拿到cookie后就可以在保持登录的情况下请求所需的数据了,这里总结下实现模拟登录的思路:

构造请求参数,发送v2/api/getqrcode请求,从响应中拿到sign值;根据拿到的sign值构造v2/api/qrcode请求,得到二维码图片;根据sign值构造channel/unicast轮询请求,等待用户扫码登录,响应中拿到v的值;根据拿到的v的值构造login/main/qrbdusslogin请求,响应中可以得到保持登录的cookie信息以及登录用户信息,保存cookie到本地;加载保存的cookie保持登录状态,发送爬取数据的请求,拿到想要的数据。
0 阅读:0

科技一点鑫得

简介:感谢大家的关注