1. 主页 > 用户投稿

qq空间登陆登录电脑版(qq空间登陆)

更多Python学习资料可以是私人关键词【资料】领取前言让我们添加一个模拟登录QQ空间的例子~,让我们快乐地开始吧~开发工具Python版本:3.6.4相关模块:requests模块;pycrypt

更多Python学习资料可以是私人关键词【资料】领取

前言

让我们添加一个模拟登录QQ空间的例子~ ,让我们快乐地开始吧~

开发工具

Python版本:3.6.4

相关模块:

requests模块;

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看起来像是二维码登录):

更多Python学习资料可以是私人关键词【资料】领取

让我们看看请求这个链接需要什么参数:

更多Python学习资料可以是私人关键词【资料】领取

测试一下,可以找到大多数参数是固定的,即:

u1:https://qzs.qq.com/qzone/v5/loginsucc.html?para=izoneptredirect: 0h: 1t: 1g: 1from_ui: 1ptlang: 2052js_ver: 19112817js_type: 1pt_uistyle: 40aid: 549000912daid: 5ptdrvs: AnyQUpMB2syC5zV6V4JDelrCvoAMh-HP6Xy5jvKJzHBIplMBK37jV1o3JjBWmY7j*U1eD8quewY_has_onekey: 1复制代码

所以我们只需要知道以下参数:

actionlogin_sigptqrtoken复制代码

很显然,action建筑的方式应该是这样的:

'0-0-'+时间戳复制代码

至于login_sig参数,通过请求以下链接可以轻松找到:

更多Python学习资料可以是私人关键词【资料】领取

然后在返回的cookies里得到login_sig参数:

更多Python学习资料可以是私人关键词【资料】领取

而请求:

https://xui.ptlogin2.qq.com/cgi-bin/xlogin?复制代码

所需的参数是:

更多Python学习资料可以是私人关键词【资料】领取

通过测试,可以找到上述参数是固定的。最后,只有ptqrtoken这个参数,全球搜索,可以找到ptqrtoken这个参数在一定范围内js计算方法写在文档里:

更多Python学习资料可以是私人关键词【资料】领取

其中,hash33的js代码为:

function hash33(t) { for (var e = 0, i = 0, n = t.length; i < n; ++i) e += (e << 5) + t.charCodeAt(i); return 2147483647 & e}复制代码

转为python代码是:

def decryptQrsig(qrsig): e = 0 for c in qrsig: e += (e << 5) + ord(c) return 2147483647 & e复制代码

那么,现在的问题是qrsig这个参数怎么取?和login_sig参数相似性,很容易找到。请求以下链接:

更多Python学习资料可以是私人关键词【资料】领取

在返回的cookies可以在中获得qrsig该参数的值:

更多Python学习资料可以是私人关键词【资料】领取

而请求:

https://ssl.ptlogin2.qq.com/ptqrshow复制代码

所需的参数如下图所示:

更多Python学习资料可以是私人关键词【资料】领取

除了t其他参数不变,感觉t就像一个随机数(因为考试,发现t保持不变也没关系),因为影响不大,我懒得继续分析了t到底是什么,把它想象成一个随机数(反正数字都一样16位)。

OK,仅此而已;那就到此为止,我们大概知道模拟登录的整个过程,然后开始写代码,同时进一步明确流程~首先是获得自然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 = { 'appid': '549000912', 'e': '2', 'l': 'M', 's': '3', 'd': '72', 'v': '4', 't': str(random.random()), 'daid': '5', 'pt_3rd_aid': '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['qrsig'])复制代码

同时,在请求上述链接的过程中,也就是:

https://ssl.ptlogin2.qq.com/ptqrshow复制代码

我们还可以获取二维码图片(即res.content其实就是二维码的图像数据),并展示出来:

saveImage(res.content, 'qrcode.jpg')showImage('qrcode.jpg')复制代码

然后我们通过不断请求我们一开始找到的二维码来登录链接,即:

https://ssl.ptlogin2.qq.com/ptqrlogin复制代码

来检测QR码的当前状态:

while True: params = { 'u1': 'https://qzs.qq.com/qzone/v5/loginsucc.html?para=izone', 'ptqrtoken': ptqrtoken, 'ptredirect': '0', 'h': '1', 't': '1', 'g': '1', 'from_ui': '1', 'ptlang': '2052', 'action': '0-0-' + str(int(time.time())), 'js_ver': '19112817', 'js_type': '1', 'login_sig': pt_login_sig, 'pt_uistyle': '40', 'aid': '549000912', 'daid': '5', 'ptdrvs': 'AnyQUpMB2syC5zV6V4JDelrCvoAMh-HP6Xy5jvKJzHBIplMBK37jV1o3JjBWmY7j*U1eD8quewY_', 'has_onekey': '1' } res = self.session.get(self.qrlogin_url, headers=self.headers, verify=False, params=params) if '登录成功' in res.text: break elif '二维码已过期' in res.text: raise RuntimeError('Fail to login, qrcode has expired...') time.sleep(2)复制代码

如果登录成功,用请求返回的链接更新session的cookies从而获得最终的QQ空间登录会话对象:

all_cookies.update(requests.utils.dict_from_cookiejar(res.cookies))qq_number = re.findall(r'&uin=(.+?)&service', res.text)[0]print('[INFO]: Account -> %s, login successfully...' % qq_number)url_refresh = res.text[res.text.find('http'): res.text.find('pt_3rd_aid=0')] + 'pt_3rd_aid=0'self.session.cookies.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爬虫、数据分析、办公自动化、全栈开发、人工智能学习资源关键字【资料】领取

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 203304862@qq.com

本文链接:https://jinnalai.com/n/101923.html

联系我们

在线咨询:点击这里给我发消息

微信号:

工作日:9:30-18:30,节假日休息