美文网首页技术类文章收集大杂烩who
Python模拟登录QQ空间(二)

Python模拟登录QQ空间(二)

作者: JetLu | 来源:发表于2015-04-20 11:59 被阅读16269次

好像又不能用了?放弃了。

2017.05.28


  • 更新了验证码获取方式
  • 支持扫码登录

2015.12.20


更新版本,欢迎测试:github

2015.11.17


好像不能直接用了,如果有问题,可以自行分析腾讯的JS。


上次写了一篇关于Python模拟登录QQ空间的文章,后来发现QQ的加密机制变了。于是就有了这篇。

加密过程解析:

当然上图的流程不是我凭空捏造的,而是有依据的——c_login_2.js

方法:

JS中的方法对应于Python中的实现:

md5                       => hashlib.md5
uin2hex                   => to_bytes
hexchar2bin               => bytes.fromhex
strToBytes                => binascii.hexlify
btoa                      => base64.b64encode

依赖第三方库:

具体实现:

捐赠共勉:

支付宝

订阅号:

来波关注

相关文章

网友评论

  • c35b1c03a5a1:腾讯好像又更新了,加密的方式还是参数不知道改了啥,一直是用户名或密码错误
  • b6df3476f3cf:楼主你好,现在这个加密算法好像变了,你这个不能用了,我自己在python中重写了一下,还是不行,能不能再更新一下:scream:
    JetLu:@炸鱼丶丶丶 刚刚试了一下,扫码登录可以啊,你那边有什么报错吗?
    b6df3476f3cf:@JetLu :yum: 谢谢
    JetLu:@炸鱼丶丶丶 嗯,有空我看一下
  • 2b59cc36c2ec:学习学习
  • c32bf4c64a1f:楼主你好,昨晚用你的这个出现---没有应用程序与此操作的指定文件有关联---的问题,而且在C盘下生成了一个二维码图片,想问下该怎么解决?
    c32bf4c64a1f:@JetLu :joy: 刚刚突然想到了,是我没设默认程序的原因
    c32bf4c64a1f:@JetLu :flushed: 我看了下是不是那个APPID的原因额?我是win10的。
    JetLu:生成图片后会用系统默认的程序打开图片,windows 上应该没有问题啊,另外发现登录又出问题了。
  • f6f1e8b920f4:楼主gtk的计算方式你是在哪里推出来的呢,我登陆这个之后去访问qq群空间gtk码错了,是不是群空间的gtk计算方式不一样?
    JetLu:@CapJiang 好像是的,你得分析 js 源码了
  • 1be93c76d9ee:楼主你好,很高兴能看到你这篇文章。我试了一下可以执行,我想保持登录态访问其他页面抓取数据失败,提示我请登录。请问如何保持登录后的登录态去访问其他页面?
    JetLu:pt2gguin,uin,skey,亲测需要这三个cookies,模拟登录成功后,后两个应该是有滴,至于第一个怎么来的,你自己研究吧
    1be93c76d9ee:http://my.pay.qq.com/cgi-bin/personal/balance_query_sortflow.cgi
    就这个查询Q币页面,抓包确认只需要uin和skey参数就可以请求了,我添加后也是查询失败
    JetLu:@jemeryii 有页面可能需要另外请求获取额外的cookies,要根据抓包判断的,没有通用解决方案。
  • 暂时还没有昵称2222: 弱弱的问一下, 那个加密流程图是用什么画的呢?
    JetLu: @c23ed3efb48f xmind
  • c1223a391524:这个是电脑版得网页QQ?貌似是手机版的诶......
  • 6c0295713bbb:想获取空间的内容,希望得到你的帮助,非常感谢。qq:2428375119
  • dec600e8fb9b:用了最新版本,还是不行啊。要输入验证码。然后报错,能麻烦帮忙分析下吗。
    C:\qqlib-master>python qqlo.py
    Verify code: otfd
    Traceback (most recent call last):
    File "qqlo.py", line 2, in <module>
    qq=qqlib.QQ('aertee@qq.com','123456')
    File "C:\Python34\lib\site-packages\qqlib\__init__.py", line 53, in __init__
    self.check()
    File "C:\Python34\lib\site-packages\qqlib\__init__.py", line 76, in check
    self.login()
    File "C:\Python34\lib\site-packages\qqlib\__init__.py", line 120, in login
    'p' : self.getEncryption(),
    File "C:\Python34\lib\site-packages\qqlib\__init__.py", line 90, in getEncry
    ion
    e = int(self.qq).to_bytes(8, 'big')
    ValueError: invalid literal for int() with base 10: 'aertee@qq.com'
    JetLu:@25720892 囧,可惜拿不出来
    JetLu:@25720892 感动啊
    dec600e8fb9b:已解决,是字符问题。
  • ff8be32b20a3:非常感谢 最近正在愁QQ空间的模拟登陆问题
    JetLu:@ff8be32b20a3 是的
    ff8be32b20a3:@ff8be32b20a3 是微信公众号二维码吗?
    JetLu:@ff8be32b20a3 嗯,加油,可以扫一下文末的二维码吆
  • 卓千叶:大神厉害,我正在使用你的qqlib,出现了错误,在命令行里一步步运行没有问题,但是用文档编辑器编完了,整体运行报错,说是qqlib的属性QQ不存在,这是怎么回事呢,本人用的是python3.5.1
    JetLu:@卓千叶 并没有你说的问题,倒是看到了一个缩进的问题。你自己的py文件,是不是和tea.py在一个目录下?
    卓千叶:@JetLu谢谢回复,并没有改变什么,我是直接用python setup.py install安装的,安装后在shell里运行python没有任何问题,但是在.py文件里导入包后,写下qq =qqlib.QQ(),再用python xx.py 报错,说是attribute错误,就是qqlib.QQ报错
    JetLu:@卓千叶 你改了什么地方?
  • f9615cf95100:登录以后获得的 ptuiCB('4','0','','0','url', '');
    是通过访问获得的 url 在获得cookie 访问页面吗
    JetLu: @王你的手 嗯
  • 55f36dc5e1b9:Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "qqlib\__init__.py", line 52, in __init__
    self.check()
    File "qqlib\__init__.py", line 75, in check
    self.login()
    File "qqlib\__init__.py", line 119, in login
    'p' : self.getEncryption(),
    File "qqlib\__init__.py", line 89, in getEncryption
    e = int(self.qq).to_bytes(8, 'big')
    AttributeError: 'int' object has no attribute 'to_bytes'
    55f36dc5e1b9:@Mok_绝舞仅侑 找到问题了 不支持py2,
  • 1a97d69aa576:现在怎么登陆啊 :sob:
  • a0070de5e83a:请问可以发表说说吗?还是只能签到?
  • 00941ac87773:试了下例子,发现可以弹出验证码,但是之后就出现问题了。
    qq.login()
    File "E:\新建文件夹\151113webqq\qqlib\qqlib\__init__.py", line 78, in login
    'pt_verifysession_v1': self.session.cookies['ptvfsession'],
    File "E:\Programs\Python\Python350\Lib\site-packages\requests\cookies.py", line 283, in __getitem__
    return self._find_no_duplicates(name)
    File "E:\Programs\Python\Python350\Lib\site-packages\requests\cookies.py", line 341, in _find_no_duplicates
    raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))

    builtins.KeyError: "name='ptvfsession', domain=None, path=None"
  • 157d2888a96f:安装完成测试了一下,提示:、
    Verify code: tpgk
    Traceback (most recent call last):
    File "D:\code\Python\qq3.py", line 3, in <module>
    qq.login()
    File "D:\Program Files\Python\lib\site-packages\qqlib\__init__.py", line 78, in login
    'pt_verifysession_v1': self.session.cookies['ptvfsession'],
    File "D:\Program Files\Python\lib\site-packages\requests\cookies.py", line 283, in __getitem__
    return self._find_no_duplicates(name)
    File "D:\Program Files\Python\lib\site-packages\requests\cookies.py", line 341, in _find_no_duplicates
    raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))
    KeyError: "name='ptvfsession', domain=None, path=None"
  • b6626201fe32:@JetLu 报错raise LogInError(r[4]) ,返回信息为:ptuiCB('-1','0','','0','登录失败,请稍后再试。(1727013600)', ' . '); 请问可以提供下帮助么?
    JetLu:@小江 你看一下你手机QQ的设置
    JetLu:@小江 这个,我也不知道了,这个是腾讯返回的 状态码。也许是你开了设备锁
  • 866ff6d9bf71:@JetLu ,学习了。楼主你给的c_login_2.js很简短,每怎么看懂,我在http://imgcache.qq.com/ptlogin/ver/10131/js/c_login_2.js中一堆代码中看到了加密的过程,但是感觉代码太多了,理不清它的加密过程。楼主你是一步一步看的吗?
    866ff6d9bf71:喔喔,一步一步理清感觉太不容易了。 :+1: ,学习了
    JetLu:@cmlighters 分析的大致思路是:先浏览器登录一遍,抓包看看提交了那些参数。然后把那个js,解密一下,在里面搜这些参数。看看对应的函数,一步一步来的。
    JetLu:@cmlighters 记得当时从上班分析到下班才理清了思路。嗯,我给的那个链接似乎不能用了。你这个链接是对的。明天有时间再来研究一下。
  • JetLu: @leoncoding 发现以前的不能用了,出了点问题
    12a37803a4db:@JetLu 啊。。这样呀。想请教下楼主QQ的模拟登录是个什么思路呢?我按照http://www.nowamagic.net/academy/detail/1302877这个网站可以成功模拟登录人人网,但感觉QQ的JS特别多,然后加密我也不太了解是怎么回事,哪里需要破解加密。
  • 12a37803a4db:楼主你好,很高兴能看到你这篇文章。我试了一下,在python3.4.2中我import qqlib报错,说no module named qqlib。在python2.7.9中我试了需要输verify code,我试了打引号和不打引号,都报错,不知道为什么。不好意思楼主,我刚开始学习python,可能问的问题比较傻,望给我解答一下,非常感谢!
    12a37803a4db:@JetLu 对的,我就是这样操作的,但是不行。我是把你的那个文件解压到了3.4的scripts里,再通过cmd进行安装的,不知道怎么就装到2.7下面了,所以3.4里import会报错。在2.7下面qq.login()之后要输verify code,请问这个要怎么输呢?楼主,方便私聊吗?我的领导让我试着爬一下qq空间,我感觉问题还挺多的。
    JetLu:@leoncoding 这样不能运行吗?
    JetLu:@leoncoding 3.4.2下应该是可以的啊?
    import qqlib
    qq=qqlib.QQ(12345678,'password')
    qq.login()
    qq.sayHi()
  • JetLu: @xiaoshen ajax你也可以模拟post或者get去请求,最近木时间研究这个了
  • 1a49580e45d3:@JetLu 之前的问题是请求地址分析错了,不过遇到个问题,请求一个页面后没有ajax动态生成的页面信息只取到一些html的框架,这个问题能帮忙分析下怎么处理么,获取js的ajax生成的页面信息?
  • JetLu: @xiaoshen 其他页面在请求的时候可能有新的cookies被设置了,而你跳过了这个步骤,或者请求的参数不对,都是有可能的
  • 1a49580e45d3:@JetLu 我想在登陆QQ成功后继续访问主页的其他链接,改怎么做呢,目前只能取到主页,请求其他链接失败跳到了登陆界面;
  • JetLu:@xiaoshen 确实是get请求,get可以发送header和cookies
  • 1a49580e45d3:楼主我刚才验证了下却是可以使用,不过发送的是get请求,抓的包也全是get请求,get请求可以发送header和cookie么,那还是得找到post地址使用post方法,刚搞这个不久,请多多指教啊
  • 6b9d3ced4e1c:请问博主,这些方法能否移植到JAVA上面去,想结合Nutch去抓取QQ空间的数据???
  • c10223df1bfe:python 2.7可用吗?我运行的时候是说出错的
    Traceback (most recent call last):
    File "test.py", line 5, in <module>
    qq.login()
    File "/data/web/qqlib/qqlib/__init__.py", line 82, in login
    raise LogInError(r[4])
    qqlib.LogInError
    计算机世界观:@codeo4 这个解决了吗,我也遇到了 +1
    f6d93eb734ed:@codeo4 这个解决了吗, 我也遇到了
  • MrLuckyV:@若晨星同学 @林夕如梦 有关QQ登录和数据抓取的问题希望能一起探讨,QQ 272614057
  • JetLu:@MrLuckyV @若晨星同学

    def blog(self):
    par = {
    'hostUin' : self.num,
    'uin' : self.num,
    'blogType' : 0,
    'cateName' : '',
    'cateHex' : '',
    'statYear' : 2015,
    'reqInfo' : 7,
    'pos' : 0,
    'num' : 15,
    'sortType' : 0,
    'source' : 0,
    'rand' : '0.732127174269408',
    'ref' : 'qzone',
    'g_tk' : self.gtk(),
    'verbose' : 1
    }
    print(get('http://user.qzone.qq.com/p/b1/cgi-bin/blognew/get_abs?%s' % urllib.parse.urlencode(par)))
    d7317276baac:@JetLu 新手对这整个都不太懂,完全没有思路,是通过上面方法获取到的,诚心请教啊 :sob:
    JetLu:@kylewuwu 囧,自己动手,丰衣足食啊
    d7317276baac:@JetLu 我在qq登陆后,想访问 qq好友的相册 ,gtk 无法获取,如果你的blog方法有效的话,求发一份到我的邮箱里面,不管是基于python2还是3的都可以,新手诚心请教,非常感谢。谢谢谢谢谢谢!!!!! 1243391214@qq.com
  • MrLuckyV:@若晨星同学 @林夕如梦 用之前的hash方法可以得到gtk 我对比了一下浏览器和代码里面的request,应该是代码里面模拟发送的request少了一些cookies值,但不知道这些值是怎么产生的
  • JetLu:@若晨星同学 好滴有时间我看看
  • 9f150d5eb0a6:@MrLuckyV 我也是这种情况,我这边是调用gtk()时cookie是空的,所以gtk返回的值也为空,登录不了。代码里cookie声明后就再也没赋过值,请问@林夕如梦 是否需要在登录后将self.cookies赋值给cookie?
    d7317276baac:@若晨星同学 想问下这个问题解决了吗,是怎么解决的,我现在也碰到这个问题了,没法获取 gtk()
  • MrLuckyV:@林夕如梦 我模拟qq登录后,抓包分析到获取说说数据的url是http://taotao.qq.com/cgi-bin/emotion_cgi_msglist_v6?sort=0&amp;format=jsonp&pos=0&uin=XXXXX&num=20&replynum=100&callback=_preloadCallback&code_version=1&g_tk=XXXXX&ftype=0&need_private_comment=1类似这样的,拿这个url直接在浏览器打开可以拿到数据,但是在代码里面去访问总是得到_preloadCallback({"code":-3000,"message":"请先登录空间","subcode":-4001});这种response :sob:
  • JetLu:@MrLuckyV 理论上是可行的,自己抓包吧
  • MrLuckyV:@林夕如梦 我想把我的QQ空间日志和说说导出来,模拟登录成功有办法吗?好像没有API什么的可以调用
  • JetLu:@MrLuckyV 你这是注孤的节奏
  • MrLuckyV:@林夕如梦 好简洁好任性,I don't like it............I LOVE IT!
  • JetLu:@MrLuckyV 来试试我的新玩意儿:http://www.fboat.net/music
  • MrLuckyV:@林夕如梦 亲测可用。Bravo! :+1:
  • MrLuckyV:@林夕如梦 @天下第一帅 是对齐的问题吗 有什么解决方法吗 谢谢
  • JetLu:@MrLuckyV 这个问题已经被 @天下第一帅 给解决了
  • 寂寞的原子:膜拜大神!
  • MrLuckyV:有python 2.7版本吗?
    在2.7.8上跑qqlib的login会有错误,bytes.fromhex()我改成了python 2.7的str(bytearray.fromhex()),还是会有这样的错误:
    File "qqlib/__init__.py", line 127, in pwdencode
    tea.encrypt(str(bytearray.fromhex(pwd1)), str(bytearray.fromhex(s2)))
    File "qqlib/tea.py", line 96, in encrypt
    o = xor(v[i:i + 8], tr)
    File "qqlib/tea.py", line 29, in xor
    a1, a2 = struct.unpack('!LL', a[0:8])
    struct.error: unpack requires a string argument of length 8
  • f1dff1106d4a:不错。学习学习。

本文标题:Python模拟登录QQ空间(二)

本文链接:https://www.haomeiwen.com/subject/wiayfttx.html