qq空间登陆入口官网(qq空间登陆网页版)

更多Python学习资料可私信关键词【资料】收集

qq空间登陆入口官网(qq空间登陆网页版)

前言我们加一个模拟登录QQ空 ~,大家愉快的开始吧~

开发工具Python版本:3.6.4相关模块:

请求模块;

Pycryptodome模块;

以及Python自带的一些模块。

环境搭建

安装Python并将其添加到环境变量中。pip可以安装所需的相关模块。

原理简介

这里简单介绍一下模拟登录QQ空的原理。一般来说,QQ空可以通过手机QQ扫码和账号密码登录。但账号密码登录有时需要验证码。为了保证登录的成功率,我们选择扫码登录。

首先,进入登录界面:

'https://xui.ptlogin2.qq.com/cgi-bin/xlogin?proxy_url=https://qzs.qq.com/qzone/v6/portal/proxy.html&daid=5&&hide_title_bar=1&low_login=0&qlogin_auto_login=1&no_verifyimg=1&link_target=blank&appid=549000912&style=22&target=self&s_url=https://qzs.qq.com/qzone/v5/loginsucc.html?para=izone&pt_qr_app=手机QQ空间&pt_qr_link=https://z.qzone.com/download.html&self_regurl=https://qzs.qq.com/qzone/v6/reg/index.html&pt_qr_help_link=https://z.qzone.com/download.html&pt_no_auth=0'复制代码

简单抓包可以发现二维码登录的接口很可能是这个(ptqrlogin看着就像是二维码登录):'https://xui.ptlogin2.qq.com/cgi-bin/xlogin? proxy _ URL = https://qzs . QQ . com/qzone/V6/portal/proxy . html & daid = 5 & & hide _ title _ bar = 1 & low _ log in = 0 & qlogin _ auto _ log in = 1 & no _ verify img = 1 & link _ target = blank & appid = 549000912 & style = 22 & target = self & s _ URL = https://qzs . QQ . com/qzone/V5/login succ . html?Para=izone&pt_qr_app=手机QQ空room & pt _ QR _ link = https://z.qzone.com/download.html & self _ re gurl = https://qzs.qq.com/qzone/v6/reg pt _ QR _ help _ link = https://z . qzone . com/download . html & pt _ no _ auth = 0 & # 39;复制代码并简单地抓取包。可以发现二维码登录的界面大概是这样的(ptqrlogin看起来就像二维码登录一样):

更多Python学习资料可私信关键词【资料】收集

让我们看看请求此链接需要哪些参数:

更多Python学习资料可私信关键词【资料】收集

经过测试,可以发现大多数参数是固定的,即:

u1:https://qzs . QQ . com/qzone/V5/login succ . html?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学习资料可私信关键词【资料】收集

并请求:

复制代码要携带的https://xui.ptlogin2.qq.com/cgi-bin/xlogin?参数是:

更多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学习资料可私信关键词【资料】收集

并请求:

复制https://ssl.ptlogin2.qq.com/ptqrshow代码时需要携带的参数如下图所示:

更多Python学习资料可私信关键词【资料】收集

其他参数除了T都是常数,感觉就是个随机数(因为经过测试,T不变也没关系)。既然影响不大,我也懒得继续分析T是什么了,就当它是个随机数吧(反正位数是16)。

好了,到目前为止,我们大概已经了解了模拟登录的整个流程,那么我们就开始在编写代码的同时进一步明确流程吧~首先,很自然的,获取login_sig参数:

params = { 'proxy_url': 'https://qzs.qq.com/qzone/v6/portal/proxy.html', 'daid': '5', 'hide_title_bar': '1', 'low_login': '0', 'qlogin_auto_login': '1', 'no_verifyimg': '1', 'link_target': 'blank', 'appid': '549000912', 'style': '22', 'target': 'self', 's_url': 'https://qzs.qq.com/qzone/v5/loginsucc.html?para=izone', 'pt_qr_app': '手机QQ空间', 'pt_qr_link': 'https://z.qzone.com/download.html', 'self_regurl': 'https://qzs.qq.com/qzone/v6/reg/index.html', 'pt_qr_help_link': 'https://z.qzone.com/download.html', 'pt_no_auth': '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_login_sig = all_cookies['pt_login_sig']复制代码

然后获得ptqrtoken参数:params = { & # 39proxy _ url & # 39: 'https://qzs.qq.com/qzone/v6/portal/proxy.html',& # 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: 'https://qzs.qq.com/qzone/v5/loginsucc.html?帕拉= izone & # 39, 'pt _ qr _ app & # 39: 'QQ空Room & # 39;, 'pt _ qr _ link & # 39: 'https://z.qzone.com/download.html',& # 39;self _ regurl & # 39: 'https://qzs.qq.com/qzone/v6/reg/index.html',& # 39;pt _ qr _ help _ link & # 39: 'https://z.qzone.com/download.html',& # 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])复制代码的同时,在请求上述链接的过程中,即:

复制https://ssl.ptlogin2.qq.com/ptqrshow码,我们也可以得到二维码图像(也就是res.content其实就是二维码的图像数据)并显示出来:

saveImage(res.content,& # 39;qrcode.jpg & # 39)showImage(& # 39;qrcode.jpg & # 39)复制代码,然后我们通过不断请求开头找到的二维码来登录链接,即:

复制https://ssl.ptlogin2.qq.com/ptqrlogin码以检测二维码的当前状态:

while True:params = { & # 39;u1 & # 39: 'https://qzs.qq.com/qzone/v5/loginsucc.html?帕拉= 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爬虫、数据分析、办公自动化、全栈开发、人工智能学习资源@林编程关键词【数据】领取

作者:戴
链接:
来源:掘金网

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/345072.html

发表回复

登录后才能评论