python实现QQ机器人(自动登录,获取群消息,发送群消

上海杰彻自动化设备有限公司 发布时间:2017-09-15 10:47:30
python实现QQ机器人(自动登录,获取群消息,发送群消息)

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

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

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

打开登录界面的的时候

会捕捉到一个GET请求

https://ssl.ptlogin2.qq.com/check?uin=10588690&appid=1003903&js_ver=10080&js_type=0&login_sig=YW1ZUUsIU*7FepsR1blgEgcSVWeHCrNVVquTT1LZ0paOxZ-6xHtypEqNGoo-VELQ&u1=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html&r=0.5928007187321782

其中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') 这种表示是不需要的验证码的

def CheckVerify(self,uin): check="https://ssl.ptlogin2.qq.com/check?uin={uin}&appid=1003903&js_ver=10080&js_type=0&login_sig=YPD0P*wu2n8vW1OS2f7VfzvPf3Ku5vnkP4nzImF0GybR02fsKZdjGYB7f9R7nQRn&u1=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html&r=0.8179273759014904" check=check.replace('{uin}',uin) pattern=re.compile("ptui_checkVC\('(.*)','(.*)','(.*)'\);") result=self.Get(check) checked= pattern.search(result).groups() print 'Step1: CheckVerify' return checked

获取验证码的方法

def GetVerify(self): #url = 'https://ssl.captcha.qq.com/getimage?&uin='+str(self.QQ)+'&aid=1002101&0.45644426648505' + str(random.randint(10,99)) verify="https://ssl.captcha.qq.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请求

https://ssl.ptlogin2.qq.com/login?u=10588690&p=AB80CD3B6429D9660878E93058DD78BD&verifycode=TEYX&webqq_type=10&remember_uin=1&login2qq=1&aid=1003903&u1=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html%3Flogin2qq%3D1%26webqq_type%3D10&h=1&ptredirect=0&ptlang=2052&daid=164&from_ui=1&pttype=1&dumy=&fp=loginerroralert&action=6-14-296574&mibao_css=m_webqq&t=1&g=1&js_type=0&js_ver=10080&login_sig=YW1ZUUsIU*7FepsR1blgEgcSVWeHCrNVVquTT1LZ0paOxZ-6xHtypEqNGoo-VELQ&pt_uistyle=5

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

加密算法如下

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


然后是登录部分代码

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="https://ssl.ptlogin2.qq.com/login?u={uin}&p={pwd}&verifycode={verify}&webqq_type=10&remember_uin=1&login2qq=1&aid=1003903&u1=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html%3Flogin2qq%3D1%26webqq_type%3D10&h=1&ptredirect=0&ptlang=2052&daid=164&from_ui=1&pttype=1&dumy=&fp=loginerroralert&action=4-30-135914&mibao_css=m_webqq&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','https://ui.ptlogin2.qq.com/cgi-bin/login?daid=164&target=self&style=5&mibao_css=m_webqq&appid=1003903&enable_qlogin=0&no_verifyimg=1&s_url=http%3A%2F%2Fweb2.qq.com%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数据

企业建站2800元起,携手武汉肥猫科技,做一个有见地的颜值派!更多优惠请戳:武汉网站设计公司 http://www.45qun.com

  • 上一篇:Thinkphp 无法使用-)order() 排序的两种解决办法!
  • 下一篇:最后一页
  •