最近突然涨了几十个粉丝,感觉很奇怪。我想我可以向新的关注者发送问候信息。所以我想以脚本的形式向用户发送消息。但是token的获取是个问题,所以想到了用脚本自动化。用户名和密码登录都会有一个验证码。然后使用微信第三方登录,就是为了巩固OAuth。1、分析整个登录流程在Chrome隐私模式下,打开开发者模式,然后打开https://segmentfault.com/。1.1微信OAuth2.0授权地址获取可以看到默认的登录方式是微信登录。微信OAuth地址获取入口为固定URL。这个也可以在JS源码中的umi.js中找到。地址为:https://segmentfault.com/gateway/session/oauth/weixin/redirect?is_mobile=0查看请求的返回数据:{"redirect_url":"https:\/\/open.weixin.qq.com\/connect\/qrconnect?appid=wxd8936345ec1df5ac&redirect_uri=https%3A%2F%2Fsegmentfault.com%2Fuser%2Foauth%2Fweixin&response_type=code&scope=snsapi_login#wechat_redirect"}获取redirect_url:https://open.weixin.qq.com/connect/qrconnect?appid=wxd8936345ec1df5ac&scope=snsapi_login&redirect_uri=https://segmentfault.com/user/oauth/weixin&state=&login_type=jssdk&self_redirect=default&styletype=&sizetype=&bgcolor=&rst=&href=https://s.com/segmentfault./weixin.css我们来分析一下这个URL的参数:appid:wxd8936345ec1df5acscope:snsapi_loginredirect_uri:https://segmentfault.com/user/oauth/weixinstate:login_type:jssdkself_redirect:defaultstyletype:sizetype:bgcolor:rst:href:https://s.segmentfault.com/css/weixin.css可以查到,其实顺丰提供的地址也是可以的。至此已经获得授权地址。1.2登录二维码获取在Chrome上,会自动显示二维码。下面我们来分析一下二维码的来源和显示内容。在浏览器中分别访问上面的redirect_url。首先看二维码的地址。https://open.weixin.qq.com/connect/qrcode/0913LA3008yh0w3q。查看原始网页的内容。我们可以发现,这串内容在内部叫做uuid。只要拿到这个uuid,就可以拿到二维码了。看看二维码中的具体内容。https://open.weixin.qq.com/connect/confirm?uuid=031J67qn4WUy0w3b可以看到这个confirmURL唯一重要的参数就是uuid。获得UUID后,您将获得QR码。1.3扫描结果在哪里?可以看到页面一直在做15秒间隔的长轮询。返回结果:window.wx_errcode=408;window.wx_code='';地址:https://lp.open.weixin.qq.com/connect/l/qrconnect?uuid=031J67qn4WUy0w3b&_=1669547560624参数:uuid:用于授权请求二维码_:时间戳(应该是为了避免缓存之类的)经过多次尝试分析,发现。目前已知wx_errcode:-402:二维码过期-404:扫码(未操作)-405:扫码确认登录(返回wx_code)-408:未扫码(初始状态)初始值一直为408,然后long轮询。用户扫码后,返回值变为404,此时需要将请求参数增加到last=404,继续长轮询。用户确认后,返回405,此时wx_code就会有值。也就是OAuth协议中最重要的代码(代码只有效一次)。有了这段代码,顺丰就可以去微信获取用户数据了(当然最重要的就是openid和unionid)。根据openid可以得到关联的用户,生成用户的token返回给前端。1.4登录界面(token代码)1.4.1方法一在Chrome开发者工具中可以看到请求:https://segmentfault.com/user/oauth/weixin?code=011hcEml2K03ka5gEWll2UUfkI0ckHQR&state=。您可以在其响应标头中看到set-cookie:PHPSESSID。PHPSESSID是令牌。1.4.2方法二在Chrome开发者工具中可以看到请求https://segmentfault.com/gateway/session/oauth/weixin/user。参数为:{"type":"weixin","code":"011hcEml2K03ka5gEWll2UUfkI0ckHQR"}但是这个接口没有任何响应体和有效的响应头。但是通过norequest的方式只请求这个接口时,发现响应头中有set-token响应头,内容为token。2、代码实现了外部库:requests:用于发送请求qrcode_terminal:用于在Terminal中显示二维码代码详见:https://gist.github.com/lpe234/f5bcb13ec03e3102357844e8a091e92c执行结果:2022-11-2718:35:08,949-sf_wx_login.py-INFO:[获取微信redirect_url]尝试获取2022-11-2718:35:09,103-sf_wx_login.py-INFO:[获取微信redirect_url]获取成功url=>https://打开。weixin.qq.com/connect/qrconnect?appid=wxd8936345ec1df5ac&redirect_uri=https%3A%2F%2Fsegmentfault.com%2Fuser%2Foauth%2Fweixin&response_type=code&scope=snsapi_login#wechat_redirect2022-11-2718:35:FOwpy_IN:[.log,f获取微信二维码]尝试获取uuid2022-11-2718:35:09,436-sf_wx_login.py-INFO:[获取微信二维码]Uuid获取成功uuid=>0915eXbM1fPC1w3r2022-11-2718:35:09,437-sf_wx_login.py-INFO:[获取微信二维码]Readytorender[]qr[]2022-11-2718:35:10,469-sf_wx_login.py-INFO:[长轮询登录结果]开始轮询2022-11-2718:35:25,639-sf_wx_login.py-信息:[长轮询登录结果]仍然没有扫描代码,继续轮询2022-11-2718:35:28,107-sf_wx_login.py-信息:[长轮询登录结果]扫描代码,等待用户确认2022-11-2718:35:36,811-sf_wx_login.py-信息:[长轮询登录结果]扫描并确认2022-11-2718:35:36,811-sf_wx_login.py-信息:[长轮询登录结果]扫描并确认wx_code=>041MyYZv3QDvEZ2boY3w44ksrY3My2YZf20-11-2718:35:36,812-sf_wx_login.py-信息:[登录sf]尝试登录2022-11-2718:35:37,378-sf_wx_login.py-信息:[登录ressf]返回数据>{'type':'login','msg':'Loginsuccessful'}2022-11-2718:35:37,378-sf_wx_login.py-INFO:[loginsf]successfullyobtainedtokentoken=>90f96559dc90c6c927752fd905cc3eed2022-11-2718:35:37,713-sf_wx_login.py-信息:[校园令牌]令牌有效,你好=>lpe234echo'5Y6f5Yib5paH56ugOiDmjpjph5Eo5L2g5oCO5LmI5Zad5aW26Iy25ZWKWzkyMzI0NTQ5NzU1NTA4zAMQMF0pLbase64-d