如何用python登陆qq读取信息

发布网友 发布时间:2022-04-20 11:44

我来回答

2个回答

热心网友 时间:2022-04-18 22:50

一次偶然的机会我看见了一个群里的一个QQ号总是根据你所发的消息自动回复,当时很感觉到神奇,我知道可以模拟登录网站,没想到竟然也能模拟登录QQ,首先自己想到的就是如何实现模拟登录PC端的QQ, 开始研究了下,发现QQ所发送的包都很难理解。

于是就转到了网页版的QQ,因为在网页里可以捕获所有的请求从而更好的实现模拟功能!

首先第一步就是打开网页版的qq,打开浏览器的开发者模式 这里可以监控所有的请求!

打开登录界面的的时候

会捕捉到一个GET请求

其中uin是你的QQ号

返回值是 ptui_checkVC('1','AAr4bdjMeh2hEa77PTuoHhqMTxbRqOp3','\x00\x00\x00\x00\x00\xa1\x92\x12');

其中1表示需要验证码 还有一种返回值 ptui_checkVC('0','!LJV','\x00\x00\x00\x00\x00\xa1\x92\x12') 这种表示是不需要的验证码的

[python] view plain copy

    def CheckVerify(self,uin):  

    check="h"  

    check=check.replace('{uin}',uin)  

    pattern=re.compile("ptui_checkVC′(.∗)′,′(.∗)′,′(.∗)′;")  

    result=self.Get(check)  

    checked= pattern.search(result).groups()  

    print 'Step1: CheckVerify'  

    return checked  

    获取验证码的方法

    [python] view plain copy

    def GetVerify(self):  

    #url = 'hage?&uin='+str(self.QQ)+'&aid=1002101&0.45644426648505' + str(random.randint(10,99))  

    verify="htqq.com/getimage?aid=1003903&r=0.6472875226754695&uin={QQ}&cap_cd=aSD-ZVcNEcozlZUurhNYhp-MBHf4hjbJ"  

    verify=verify.replace('{QQ}',self.QQ)  

    path= r"c:/verify/1.jpg"  

    #data = urllib.urlretrieve(url,path)  

    data = urllib2.urlopen(verify)  

    localPic =open(r"c:/verify/1.jpg",'wb')   

    localPic.write(data.read())   

    localPic.close()   

    data.close()   

    输入用户名和密码 还有验证码后发送一个GET请求

    这里面u代表账号  p代表密码 密码是经过一定算法加密的 verify是验证码

    加密算法如下

    [python] view plain copy

    def PasswordSecret(self,password,v1,v2,md5=True):  

    if md5==True:  

    password=self.PCMd5(password).upper()  

    length=len(password)  

    temp=''  

    for i in range(0,length,2):  

    temp+=r'\x'+password[i:i+2]  

    return self.PCMd5(self.PCMd5(self.hex2asc(temp)+self.hex2asc(v2)).upper()+v1).upper()  

    #md5加密函数  

    def PCMd5(self,s):  

    h=hashlib.md5()  

    h.update(s)  

    return h.hexdigest()  

    #16进制转字符  

    def hex2asc(self,s):  

    _str="".join(s.split(r'\x'))  

    length=len(_str)  

    data=''  

    for i in range(0,length,2):  

    data+=chr(int(_str[i:i+2],16))  

    return data  

    然后是登录部分代码

    [python] view plain copy

    def Login(self,uin,pwd):  

    #获取参数  

    cheked=self.CheckVerify(uin)  

    #加密密码  

    #pwd=self.PasswordSecret(pwd,cheked[1],cheked[2])  

    #pwd=self.PasswordSecret(pwd,r'AAST',r'\x00\x00\x00\x00\x00\xa1\x92\x12')  

    loginurl="h&t=1&g=1&js_type=0&js_ver=10080&login_sig=YPD0P*wu2n8vW1OS2f7VfzvPf3Ku5vnkP4nzImF0GybR02fsKZdjGYB7f9R7nQRn&pt_uistyle=5"  

    loginurl=loginurl.replace('{uin}',uin)  

    #loginurl=loginurl.replace('{pwd}',pwd)  

    #loginurl=loginurl.replace('{verify}',cheked[1])  

    #result=Get(loginurl)  

    if(cheked[0]=="1"):  

    #下载验证码  

    self.GetVerify()  

    image = Image.open(r"c:/verify/1.jpg")  

    image.show()  

    code=raw_input("verifycode:").strip()  

    loginurl=loginurl.replace('{verify}',code.upper())  

    pwd=self.PasswordSecret(pwd,r''+code.upper(),cheked[2])  

    #pwd=self.PasswordSecret(pwd,cheked[1],cheked[2])  

    else:  

    loginurl=loginurl.replace('{verify}',cheked[1])  

    pwd=self.PasswordSecret(pwd,cheked[1],cheked[2])  

    loginurl=loginurl.replace('{pwd}',pwd)  

    result=self.Get(loginurl,'ssl.ptlogin2.qq.com','hin2.qq.com/cgi-bin/login?daid=164&target=self&style=5&mibao_css=m_webqq&appid=1003903&enable_qlogin=0&no_verifyimg=1&s_urlm%2Floginproxy.html&f_url=loginerroralert&strong_login=1&login_state=10&t=20140514001',None)  

    print 'Step2: Login'  

    pattern=re.compile("ptuiCB′(.∗)′,′(.∗)′,′(.∗)′,′(.∗)′,′(.∗)′,\s′(.∗)′;")  

    ret= pattern.search(result).groups()  

    #获取必要的cookie 否则第二次登陆会出错  

    self.Get(ret[2])  

    print 'Step3: GetCookie'  

    for c in self.cj:  

    if c.name=="ptwebqq":  

    self.ptwebqq=c.value  

    return result  


    登录成功后服务器会返回一串json数据

    ptuiCB('0','0','ebqq_type%3D10&f_url=&ptlang=2052&ptredirect=100&aid=1003903&daid=164&j_later=0&low_login_hour=0&regmaster=0&pt_login_type=1&pt_aid=0&pt_aaid=0&pt_light=0','0','登录成功!', '小竹');

    第一个为0 就表示登录成功了 ,但是这并没有真正的登录成功

    上面的返回值中的url是用来获取一个关键cookie的 那就是ptwebqq

    然后进行第二次登录,这次才是真正的登录

    请求如下

    Accept:*/*

    Accept-Encoding:gzip,deflate,sdch

    Accept-Language:zh-CN,zh;q=0.8

    Connection:keep-alive

    Content-Length:244

    Content-Type:application/x-www-form-urlencoded

    Cookie:o_cookie=455910092; RK=fMEaWEZ0Qc; ts_last=web2.qq.com/; ts_refer=www.baidu.com/; ts_uid=4588821804; pgv_pvid=914251705; pgv_info=ssid=s3525422600&pgvReferrer=; verifysession=h02LeYrtarkWBZeSu_czkiczeNSNlDm7V1mCm-A5qatkwnHaNfgb2z46zH4X7OfyhFT7wH6LfschPvSLhDGXFA4eA**; ptui_loginuin=10588690; ptisp=cnc; ptcz=dace9cf90e7064a16ee56c8153273eff9f2de1d2827ba31f6571412ac18c50c3; ptwebqq=b21232ed3519839063d1c2ead8a8588c385d168097efdf88bc56e1a78be7dfb4; pt2gguin=o0010588690; uin=o0010588690; skey=@gmEO6N2JD; p_uin=o0010588690; p_skey=cZ5*kS-NOcXlD2Q0AEpJnmExwC2yA0g7jbTygpVFiA8_; pt4_token=1SyuJ39Eq6oKEwEhGIizeg__

    Host:d.web2.qq.com

    Origin:h

    Referer:htttml?v=20110331002&callback=1&id=2

    User-Agent:Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36

    Form Dataview sourceview URL encoded

    r:{"status":"online","ptwebqq":"b21232ed3519839063d1c2ead8a8588c385d168097efdf88bc56e1a78be7dfb4","passwd_sig":"","clientid":"7963288","psessionid":null}

    clientid:7963288

    psessionid:null

    其中的ptwebqq就是刚才我们从cookie中获取的

    这部分代码是

    [python] view plain copy

    def Login2(self):  

    try:  

    url="htel/login2"  

    postdata="r=%7B%22status%22%3A%22online%22%2C%22ptwebqq%22%3A%22{$ptwebqq}%22%2C%22passwd_sig%22%3A%22%22%2C%22clientid%22%3A%22{$clientid}%22%2C%22psessionid%22%3Anull%7D&clientid={$clientid}&psessionid=null"  

    postdata=postdata.replace("{$ptwebqq}",self.ptwebqq)  

    postdata=postdata.replace("{$clientid}",str(self.clientid))  

    print 'Step4: Login2'  

    result=self.Post(url,postdata,QQRobot.HOST[0],QQRobot.REFERER[0],QQRobot.ORIGIN[0])  

    retjson=json.loads(result)  

    retjson=retjson["result"]  

    return retjson  

    except Exception,e:  

    print "Login2 error "+str(e)  

    第二次登陆成功后会返回一个

    '''{"retcode":0,
    "result":{
    "uin":10588690,
    "cip":1707901841,
    "index":1075,
    "port":59571,
    "status":"online",
    "vfwebqq":"c043f1f6ce5c3b76a4603ab60082668bef2dde0b987808f728e2071eb7c164eeb30fcd85c31018d2",
    "psessionid":"8368046764001d636f6e6e7365727665725f77656271714031302e3133392e372e31363000006cb000001ae1036200a192126d0000000a40356c593742635175316d00000028c043f1f6ce5c3b76a4603ab60082668bef2dde0b987808f728e2071eb7c164eeb30fcd85c31018d2",
    "user_state":0,
    "f":0
    }
    }'''

    这样的数据结构  其中0表示登陆成功

    需要把这写数据保存下来 后面进行操作需要

    登陆成功后我们就可以拉去群列表了

    [python] view plain copy

    #获取群列表信息  

    def GetGroupNameList(self,vfwebqq):  

    try:  

    url="h/get_group_name_list_mask2"  

    postdata="r=%7B%22vfwebqq%22%3A%22{$vfwebqq}%22%7D"  

    postdata=postdata.replace("{$vfwebqq}",vfwebqq)  

    ret=self.Post(url,postdata,QQRobot.HOST[1],QQRobot.REFERER[1],QQRobot.ORIGIN[1])  

    print 'Step5: GetGroupList'  

    retjson=json.loads(ret)  

    retjson=retjson["result"]  

    self.grouplist=retjson  

    for group in self.grouplist['gnamelist']:  

    print group["code"],group["name"]  

    except Exception,e:  

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com