美国的新年快到了,国内的同学们已经迎来了新的一年,我正好利用时差赶在这2010的最后一天里面发篇技术文章。
昨晚偶然发现Create Chen写了一篇利用基于HTTP的QQ api实现的QQ登陆的文章。作者给出了实现的C#代码,并对协议做出了详尽的分析。(URL1 URL2)
通过HTTP的POST动作控制QQ,就可以开发很多很有意思的应用。比如我们可以开发QQ消息轰炸机(呵呵
),可以制作QQ机器人…等等
我按照文章中所叙述的方法用我所喜欢的Python重新实现了一遍,下面是Python的代码。代码只实现了基本功能,对于返回的信息并没有进行处理,如果大家有兴趣,可以结合Create Chen的文章自行对返回信息进行处理。
下面是代码:
import urllib,httplib,md5,time
from time import sleep
class qq:
def __init__(self,qq="",pwd=""):
self.pwd=md5.new(pwd).hexdigest()
self.headers=""
self.qq=qq
def getdata(self):
self.conn=httplib.HTTPConnection("tqq.tencent.com:8000")
self.conn.request("POST","",self.headers)
response=self.conn.getresponse()
print response.read().decode('utf-8').encode("cp936")
sleep(1)
self.conn.close()
def Login(self):
self.headers=("VER=1.1&CMD=Login&SEQ="+\
str(int(time.time()*100)%(10**5))+"&UIN="+\
self.qq+"&PS="+\
self.pwd+\
"&M5=1&LC=9326B87B234E7235")
self.getdata()
def GetInfo(self,friend=""):
self.headers=("VER=1.1&CMD=GetInfo&SEQ="+\
str(int(time.time()*100)%(10**5))+"&UIN="+\
self.qq+"&LV=2&UN="+\
friend)
self.getdata()
def AddToList(self,friend=""):
self.headers=("VER=1.1&CMD=AddToList&SEQ="+\
str(int(time.time()*100)%(10**5))+"&UIN="+\
self.qq+"&UN="+\
friend)
self.getdata()
#agree_Type = 0 agree
#agree_Type = 1 deny
def Ack_AddToList(self,fri_Num,agree_Type):
self.headers=("VER=1.1&CMD=Ack_AddToList&SEQ="+\
str(int(time.time()*100)%(10**5))+"&UIN="+\
self.qq+"&UN="+\
fri_Num+"&CD="+agree_Type+"&RS=")
self.getdata()
def SendMsg(self,friend="",msg=""):
self.headers=("VER=1.1&CMD=CLTMSG&SEQ="+\
str(int(time.time()*100)%(10**5))+"&UIN="+\
self.qq+"&UN="+\
friend+"&MG="+\
msg.decode("cp936").encode('utf-8'))
self.getdata()
def GetMsg(self):
self.headers=("VER=1.1&CMD=GetMsgEx&SEQ="+\
str(int(time.time()*100)%(10**5))+"&UIN="+\
self.qq)
self.getdata()
def Query_Stat(self):
self.headers=("VER=1.1&CMD=Query_Stat&SEQ="+\
str(int(time.time()*100)%(10**5))+"&UIN="+\
self.qq+"&TN=50&UN=0")
self.getdata()
def List(self):
self.headers=("VER=1.1&CMD=List&SEQ="+\
str(int(time.time()*100)%(10**5))+"&UIN="+\
self.qq+"&TN=160&UN=0")
self.getdata()
#stat = 10 online
#stat = 20 offline
#stat = 30 busy
def Change_Stat(self,stat=""):
self.headers=("VER=1.1&CMD=Change_Stat&SEQ="+\
str(int(time.time()*100)%(10**5))+"&UIN="+\
self.qq+"&ST="+stat)
self.getdata()
def Logout(self):
self.headers=("VER=1.1&CMD=Logout&SEQ="+\
str(int(time.time()*100)%(10**5))+"&UIN="+\
self.qq)
self.getdata()
test = qq('9918xxxx','xxxxx')
test.Login()
print "OK"
#i =0
#while i<5:
# print i
# sleep(2)
# test.SendMsg('xxxxxx',"I am robot")
# i = i+1
i = 0
while i<10:
print i
test.Change_Stat('10')
sleep(1)
test.Change_Stat('30')
sleep(1)
test.Change_Stat('20')
sleep(1)
i = i + 1
test.Logout()
代码下载地址:http://www.darlingtree.com/download/qqlogin.tar.gz
祝大家新年快乐!