怎么用python对qq登录界面写测试脚本

Python09

怎么用python对qq登录界面写测试脚本,第1张

具体实现方法如下:?12345678910111213141516171819202122232425262728importtime,datetimeimporturllib2defchk_ ( num):chkurl='http://wpa.paipai.com/pa?p=1:'+` num`+':17'a=urllib2.urlopen(chkurl)length=a.headers.get("content-length")a.close()printdatetime.datetime.now()printlengthiflength=='2348':return'Online'eliflength=='2205':return'Offline'else:return'UnknownStatus!'defwritestate(statenow):f=open(str( ),'a')m=str(datetime.datetime.now())+"===state===="+statenow+"\n\r"f.write(m)f.close() =847893543##state=1if__name__=='__main__':while1:stat=chk_ ( )writestate(stat)time.sleep(6000)##5分钟测一次print` `+'is'+stat

一次偶然的机会我看见了一个群里的一个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,zhq=0.8

Connection:keep-alive

Content-Length:244

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

Cookie:o_cookie=455910092RK=fMEaWEZ0Qcts_last=web2.qq.com/ts_refer=www.baidu.com/ts_uid=4588821804pgv_pvid=914251705pgv_info=ssid=s3525422600&pgvReferrer=verifysession=h02LeYrtarkWBZeSu_czkiczeNSNlDm7V1mCm-A5qatkwnHaNfgb2z46zH4X7OfyhFT7wH6LfschPvSLhDGXFA4eA**ptui_loginuin=10588690ptisp=cncptcz=dace9cf90e7064a16ee56c8153273eff9f2de1d2827ba31f6571412ac18c50c3ptwebqq=b21232ed3519839063d1c2ead8a8588c385d168097efdf88bc56e1a78be7dfb4pt2gguin=o0010588690uin=o0010588690skey=@gmEO6N2JDp_uin=o0010588690p_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.2WOW64) 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:

好多年前,delphi出1.0的时候,我是delphi狂热的爱好者。把贵阳市场上的所有delphi全买到。其实也只有几本。 后来2003年的时候,经过深思熟虑学习python,当时把北京市场上的所有python书都买到,也只有几本书。现在网上python的书估计有1个GB。

delphi特别好学,而python是不同的语言,它是脚本。 如果没有学过脚本语言开始会觉着怪。

我学过两个星期还不会编程,后来把它的所有library的帮助也看了一遍。最后才明白几个道理。

library帮助就是最好的python教程了

学习编程需要从学习别人的程序开始。最后可以看看site-packages目录里的源码

多练习,建立自己的python学习笔记与库(又叫cookbook),这样会加速你的学习

大约用了几年时间,python已经熟悉到主要的库都背下来了。不过仍然有大部分的python领域我还没有涉及。不过足够用了。

python已经有一个webqq的封装版本,很简单,100行左右。在linux上常用。

如果写一套完成的qq,对于python来讲太容易了。 就相当于一个作业。很轻松,2-3天就做完了。客户端与服务端可以一起做。

python是很强大的,快速开发语言。某些方面比delphi快。不过界面方面delphi比python又强了几代。

C语言是一个基础学习语言。与python有很大关系。因为python与C可以很好的融合。 这是python的高级话题,开始的时候,C与python完全没有关系。后来你会交叉使用。

C语言是一个独立的语言,学习好有单独的用途,当然对于java, c++, 其它的三代语言学习都有帮助。但是对python的初学者没有特别的帮助 。