网页登陆qq空间需要手机验证(qq空间需要验证)

我们添加一个模拟登录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看着就像是二维码登录):

网页登陆qq空间需要手机验证(qq空间需要验证)

更多Python学习资料可以私信关键字【资料】领取

看下请求这个链接需要哪些参数吧:

网页登陆qq空间需要手机验证(qq空间需要验证)

更多Python学习资料可以私信关键字【资料】领取

测试一下,可以发现大部分参数是固定的,即:

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

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

action
login_sig
ptqrtoken
**代码

很显然,action的构造方式应该是这样的:

'0-0-'+时间戳
**代码

至于login_sig参数,容易发现可以通过请求以下链接:

网页登陆qq空间需要手机验证(qq空间需要验证)

更多Python学习资料可以私信关键字【资料】领取

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

网页登陆qq空间需要手机验证(qq空间需要验证)

更多Python学习资料可以私信关键字【资料】领取

而请求:

**代码

需要携带的参数为:

网页登陆qq空间需要手机验证(qq空间需要验证)

更多Python学习资料可以私信关键字【资料】领取

通过测试可以发现上面这些参数都是固定的。最后就剩下ptqrtoken这个参数啦,全局搜索一下,可以发现ptqrtoken这个参数在某个js文件里写了计算方式:

网页登陆qq空间需要手机验证(qq空间需要验证)

更多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参数类似,容易发现请求以下这个链接:

网页登陆qq空间需要手机验证(qq空间需要验证)

更多Python学习资料可以私信关键字【资料】领取

在返回的cookies里可以得到qrsig这个参数的值:

网页登陆qq空间需要手机验证(qq空间需要验证)

更多Python学习资料可以私信关键字【资料】领取

而请求:

**代码

需要携带的参数如下图所示:

网页登陆qq空间需要手机验证(qq空间需要验证)

更多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'])
**代码

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

**代码

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

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

接着我们通过不断请求一开始发现的二维码登录链接,即:

**代码

来检测二维码当前的状态:

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爬虫、数据分析、办公自动化、全栈开发、人工智能学习资@林夕编程关键字【资料】领取

网页登陆qq空间需要手机验证(qq空间需要验证)

相关推荐

  • 直播行业有多赚钱,直播行业收入

    现在直播行业是很赚钱的,很多主播都靠直播赚得盆满钵满,所以有些钱他们觉得很少,甚至觉得不在乎,而且有的主播钱已经多到可以去做社会贡献了,比如我们说的PDD就是这样,除了当主播之外,赚到的钱都已经开了公司,并且还做公益捐赠了学校,还是非常阔气的。   ​对于这种主播来说,我们觉得几万块钱可能在他们眼里只是几百块而已,没什么区别,比如最近PDD在直播间…

    2023-08-13
  • 拜伦诗选(乔治戈登拜伦代表作)

    拜伦,我的讲义写了十六页,曹雪芹先生可能有意见了。 乔治·戈登·拜伦(George Gordon Byron,1788——1824)。得年三十六岁,标准天才型人物的死亡。 生于伦敦。父亲是家事不管的**。母亲脾气坏。拜伦从小不相让,吵。拜伦是个穷的贵族。妈妈骂他“拐子”,他说:说这话的还是个人吗? 不幸的童年,使人性格尖锐。 上大学后是个捣蛋鬼,…

    2023-08-12 知识百科
  • 米亚罗民宿,米亚罗旅游攻略自驾游

    米亚罗像是一个被人们遗忘在临安这个地方的异国小镇,遗世独立,与周围略显呆板普通的建筑相较起来,淡雅清新活泼的米亚罗总有那么几分不合群。 屋子造型新颖,不是我们在城市中见惯了的钢筋水泥的房子,也不是江南水乡的青砖黑瓦,而是木质的结构。每一幢木屋外观都不一样,各有特色,或清雅或奇异,看见每一幢木屋我都会在心里问自己一句:它怎么可以这么美?是的!每一幢木屋本身就已…

    2023-07-30 知识百科
  • 英语音节的划分口诀,划分音节的七大规则

    音节:音节是读音的基本单位。元音字母可以单独构成音节;元音字母+辅音字母组合也可以构成一个音节。元音字母比较响亮,可以单独构成音节;辅音不响亮,不能构成音节。 一. 音节可以分为开音节和闭音节 (一)开音节:以元音字母结尾的音节,在开音节中,元音字母发本音。 (1)绝对开音节:元音字母后面没有辅音字母,直接以元音字母结尾的音节,如:no, she, he, …

    2023-08-30
  • 浙大远程教育平台(浙江大学远程继续教育平台)

    北大全面停止夜大、网教、自考招生 浙江大学:不受影响,继续招生 大学录取率逐年提高,参加成人高考的学员在逐渐减少。资料图片 近日,北京大学在其2016年继续教育总结交流会上宣布,自2018年起全面停止该校夜大学、网络教育、自学考试等各类学历继续教育的招生工作。 成人自考、成人高考(包括函授、夜大、电大等教学形式)、网络远程教育同属成人高等教育体系。这些教育模…

    2023-08-24
  • 曼城淘汰巴黎进决赛(曼城巴黎全场回放)

    北京时间1月12日凌晨,欧洲足坛结束多场比赛,皇马在西超杯通过点球大战4-3瓦伦西亚,晋级决赛,曼城在联赛杯0-2爆冷被南安普顿淘汰出局,无缘4强,巴黎圣日耳曼在法甲2-0战胜昂热,梅西收获新年首球,并且俱乐部生涯攻破第95支对手球门。 西超杯:皇马5-4瓦伦西亚(点球4-3)过去2轮同时淘汰利物浦和切尔西,让曼城变为联赛杯头号夺冠热门,现在面对本赛季英超倒…

    2023-09-12
本站部分内容由互联网用户自发贡献,该文观点仅代表作者本人,本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如发现本站有涉嫌抄袭侵权/违法违规等内容,请联系我们举报!一经查实,本站将立刻删除。