更多Python学习资料可私信关键词【资料】收集
前言我们加一个模拟登录QQ空 ~,大家愉快的开始吧~
开发工具Python版本:3.6.4相关模块:
请求模块;
Pycryptodome模块;
以及Python自带的一些模块。
环境搭建
安装Python并将其添加到环境变量中。pip可以安装所需的相关模块。
原理简介
这里简单介绍一下模拟登录QQ空的原理。一般来说,QQ空可以通过手机QQ扫码和账号密码登录。但账号密码登录有时需要验证码。为了保证登录的成功率,我们选择扫码登录。
首先,进入登录界面:
手机QQ空间pt_qr_link=复制代码
简单抓包可以发现二维码登录的接口很可能是这个(ptqrlogin看着就像是二维码登录):?Para=izonept_qr_app=手机QQ空room pt _ QR _ link = ;复制代码并简单地抓取包。可以发现二维码登录的界面大概是这样的(ptqrlogin看起来就像二维码登录一样):
更多Python学习资料可私信关键词【资料】收集
让我们看看请求此链接需要哪些参数:
更多Python学习资料可私信关键词【资料】收集
经过测试,可以发现大多数参数是固定的,即:
u1:?para = izoneptredirect:0h:1t:1g:1 from _ ui:1 ptlang:2052 js _ ver:19112817 js _ type:1pt _ ui style:40 aid:549000912 aid:5 ptdrvs:anyqupmb 2 syc 5 zv6 v4 jdelrcv OAM H-HP 6 xy 5 jvkjzhpilbk 37 JV 1 O3 jjbwmy 7j * u1e D8 quewy _ has _ one key:
Actionlogin_sigptqrtoken复制代码显然,动作应该是这样构造的:
0-0-+时间戳复制代码至于login_sig参数,很容易发现可以通过请求以下链接来复制代码:
更多Python学习资料可私信关键词【资料】收集
然后在返回的cookies中获取login_sig参数:
更多Python学习资料可私信关键词【资料】收集
并请求:
复制代码要携带的参数是:
更多Python学习资料可私信关键词【资料】收集
通过测试可以发现,上述参数都是固定的。最后剩下参数ptqrtoken。经过全局搜索,可以发现ptqrtoken的计算方法写在一个js文件中:
更多Python学习资料可私信关键词【资料】收集
其中,hash33的js代码为:
函数hash33(t) { for (var e = 0,i = 0,n = t.length我 ltn;++ I)e+=(e lt; lt5)+t . charcodeat(I);Return 2147483647 e}将代码复制到python代码意味着:
def decryptQrsig(QR SIG):e = 0 for c in QR SIG:e+=(e lt; lt5)+ord(c) return 2147483647 e复制代码。所以,现在的问题是如何得到参数qrsig?与login_sig参数类似,很容易找到以下链接:
更多Python学习资料可私信关键词【资料】收集
这个参数qrsig的值可以在返回的cookies中获得:
更多Python学习资料可私信关键词【资料】收集
并请求:
复制代码时需要携带的参数如下图所示:
更多Python学习资料可私信关键词【资料】收集
其他参数除了T都是常数,感觉就是个随机数(因为经过测试,T不变也没关系)。既然影响不大,我也懒得继续分析T是什么了,就当它是个随机数吧(反正位数是16)。
好了,到目前为止,我们大概已经了解了模拟登录的整个流程,那么我们就开始在编写代码的同时进一步明确流程吧~首先,很自然的,获取login_sig参数:
params = { proxy_url: 手机QQ空间, pt_qr_link: 复制代码
然后获得ptqrtoken参数:params = { # 39proxy _ url # 39: , # 39;daid # 39: 5, hide _ title _ bar # 39: 1, ●登录 # 39;: 0, qlogin _ auto _ login # 39: 1, no _ verifyimg # 39: 1, link _ target # 39: blank # 39, appid # 39: 549000912, 风格 # 39;: 22, 目标 # 39;: self # 39, s _ url # 39: 帕拉= izone # 39, pt _ qr _ app # 39: QQ空Room # 39;, pt _ qr _ link # 39: , # 39;self _ regurl # 39: , # 39;pt _ qr _ help _ link # 39: , # 39;pt _ no _ auth # 39: 0} RES = self . session . get(self . xlogin _ URL,headers=self.headers,verify=False,params = params)all _ cookies . update(requests . utils . dict _ from _ cookiejar(RES . cookies))pt _ log in _ SIG = all _ cookies[ # 39;pt _ login _ sig # 39]复制代码并获取ptqrtoken参数:
params = { # 39appid # 39: 549000912, e # 39: 2, l # 39: M # 39, s # 39: 3, d # 39: 72, v # 39: 4, t # 39:str(random.random()), # 39;daid # 39: 5, pt _ 3rd _ aid # 39: 0} RES = self . session . get(self . qrshow _ URL,headers=self.headers,verify=False,params = params)all _ cookies . update(requests . utils . dict _ from _ cookiejar(RES . cookies))ptqrtoken = self。_ _ decryptQrsig(all _ cookies[ # 39;qrsig # 39])复制代码的同时,在请求上述链接的过程中,即:
复制码,我们也可以得到二维码图像(也就是tent其实就是二维码的图像数据)并显示出来:
saveImage(res.content, # 39;qrcode.jpg # 39)showImage( # 39;qrcode.jpg # 39)复制代码,然后我们通过不断请求开头找到的二维码来登录链接,即:
复制码以检测二维码的当前状态:
while True:params = { # 39;u1 # 39: 帕拉= izone # 39, ptqrtoken # 39:ptqrtoken, # 39;ptredirect # 39: 0, h # 39: 1, t # 39: 1, g # 39: 1, from _ ui # 39: 1, ptlang # 39: 2052, 行动 # 39;: 0-0-+ str(int(time.time())), # 39;js _ ver # 39: 19112817, js _ type # 39: 1, login _ sig # 39:pt_login_sig, # 39;pt _ uistyle # 39: 40, 援助 # 39;: 549000912, daid # 39: 5, ptdrvs # 39: anyqupmb 2 syc 5 zv6 v4 jdelrcvoamh-HP 6 x y5 jvkjzhpilmbk 37 JV 1 o 3 jjbwmy 7j * u 1 ed 8 quewy _ # 39;, has _ onekey # 39: 1} RES = self . session . get(self . qrlogin _ URL,headers=self.headers,verify=False,params = params)if # 39;登录成功 # 39;在res.text中:break elif # 39二维码已过期 # 39;在res.text中:引发runtime error( # 39;登录失败,二维码已过期…)time.sleep(2)如果复制代码成功登录,则会话cookies将使用此请求返回的链接进行更新,以获取QQ空之间的最终登录会话对象:
all _ cookies . update(requests . utils . dict _ from _ cookiejar(RES . cookies))QQ _ number = re . find all(r # 39;uin=(。+?)服务 # 39;,RES . text)[0]打印( # 39;[信息]:帐户- gt;%s,登录成功…% QQ _ number)URL _ refresh = RES . text[RES . text . find( # 39;http # 39):RES . text . find( # 39;pt _ 3rd _ aid = 0 # 39)] + pt _ 3rd _ aid = 0 # 39self . session . cookie . update(all _ cookies)RES = self . session . get(URL _ refresh,allow_redirects=False,verify = False)all _ cookies . update(requests . utils . dict _ from _ cookiejar(RES . cookies))self . session . cookies . update(all _ cookies)END
谢谢大家的支持和喜欢。边肖每天都会和大家分享更多Python学习的干货知识,所以别忘了关注边肖。
更多Python爬虫、数据分析、办公自动化、全栈开发、人工智能学习资源@林编程关键词【数据】领取
作者:戴
链接:
来源:掘金网