美国的新年快到了,国内的同学们已经迎来了新的一年,我正好利用时差赶在这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 祝大家新年快乐!