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