Board logo

标题: [转载教程] SmartQQ最新登录Python3源码 [打印本页]

作者: ivor    时间: 2016-3-8 12:52     标题: SmartQQ最新登录Python3源码

转载: http://hexblog.net/source-code/s ... ython-20160111.html
  1. #!/usr/bin/python3
  2. #coding:utf-8
  3. """
  4.     这是一个用来使用SmartQQ的模块
  5.     这也是我用Python正式编写的第一个代码
  6.     送给常来我站点的朋友们
  7.     Code By OET//183
  8.     Blog    HexBlog.Net
  9. """
  10. import os
  11. #import curses
  12. from urllib import request,response,parse
  13. from time import sleep
  14. import json
  15. class SmartQQ():
  16. #    初始化
  17.     def __init__(self):
  18.         print("SmartQQ 已经启动...")
  19.         #    读取脚本路径并保存
  20.         self.__path=os.getcwd()
  21.         #    定义一个全局Cookie,用来保存Cookie字符串
  22.         self.__cookie=""
  23.         #    定义ptwebqq,这个以后常用
  24.         self.__ptwebqq=""
  25.         #    定义vfwebqq,获取好友及群列表使用
  26.         self.__vfwebqq=""
  27.         #    定义一个hash用与获取好友及群列表
  28.         self.__hash=""
  29.         #    定义登录UIN
  30.         self.__uin=""
  31.         #    定义一个全局的Header,用来模拟浏览器请求头
  32.         self.__header={
  33.             "User-Agent":"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11",
  34.             "Referer":"",
  35.             "Cookie":""
  36.         }
  37.         #    创建一个全局的opener
  38.         self.__redirect=request.HTTPRedirectHandler()
  39.         #    这么干....不说了
  40.         self.__redirect.redirect_request=self.__redirect_request
  41.         opener=request.build_opener(self.__redirect,request.HTTPRedirectHandler)
  42.         #    安装全局屏蔽掉302跳转
  43.         request.install_opener(opener)
  44.     #----------------------------------------------------------------------
  45.     #    用于记录cookie
  46.     def __readCookie(self,res):
  47.         for key,value in res.info().items():
  48.             if(key=="Set-Cookie"):
  49.                 self.__cookie+=value[:value.find(";")+1]
  50.     #----------------------------------------------------------------------
  51.     #    记录跳转后的Cookie,否则无法记录
  52.     def __redirect_request(self, req, fp, code, msg, headers, newurl):
  53.         #    记录跳转后的Cookie,这真的挺牛掰的
  54.         self.__readCookie(fp)
  55.     #----------------------------------------------------------------------
  56.     #    定义一个Http方法用于获取网页内容
  57.     #    并且将Cookie保存下来
  58.     def __http(self,url,referer="",data=None,bit=False ):
  59.         #    更新headers内容
  60.         self.__header["Referer"]=referer
  61.         self.__header["Cookie"]=self.__cookie
  62.         req=request.Request(url=url,data=data,headers=self.__header)
  63.         try:
  64.             res=request.urlopen(req)
  65.         #    Python3中已经将错误语法进行转变,原来的,修改长了 as
  66.         except request.HTTPError as  e:
  67.             print("Http Error:%s" %e.code)
  68.             return None
  69.         #    读取Cookie并保存
  70.         self.__readCookie(res)
  71.         #    返回读取的字节流
  72.         result=res.read()
  73.         if(not bit):
  74.             return result.decode("utf8")
  75.         else:
  76.             return result
  77.     #----------------------------------------------------------------------
  78.     #    下载二维码
  79.     def __ptqrshow(self):
  80.         png= self.__http(url="https://ssl.ptlogin2.qq.com/ptqrshow?appid=501004106&e=0&l=M&s=5&d=72&v=4&t=0.4139144900254905",
  81.                          referer="",
  82.                          data=None,
  83.                          bit=True)
  84.         if(png!=None):
  85.             pngfile=open(self.__path+"/temp.png","wb")
  86.             pngfile.write(png)
  87.             pngfile.close()
  88.             print("二维码下载完毕,请打开扫描...")
  89.             return True
  90.         else:
  91.             print("二维码下载失败,请检查网络...")
  92.             return False
  93.     #----------------------------------------------------------------------
  94.     #    进行循环检测认证进度
  95.     def __ptqrlogin(self):
  96.         html=self.__http("https://ssl.ptlogin2.qq.com/ptqrlogin?webqq_type=10&remember_uin=1&login2qq=1&aid=501004106"+
  97.                          "&u1=http%3A%2F%2Fw.qq.com%2Fproxy.html%3Flogin2qq%3D1%26webqq_type%3D10&ptredirect=0&ptlang=2052"+
  98.                          "&daid=164&from_ui=1&pttype=1&dumy=&fp=loginerroralert&action=0-0-4088&mibao_css=m_webqq&t=undefined"+
  99.                          "&g=1&js_type=0&js_ver=10145&login_sig=&pt_randsalt=0",
  100.                          "https://ui.ptlogin2.qq.com/cgi-bin/login")
  101.         if(html!=None):
  102.             temp=html.find("登录成功")
  103.             if(temp==-1):
  104.                 #print(html)
  105.                 sleep(1)
  106.                 #    递归继续登录,一定要return 进行调用,否则无返回值
  107.                 return self.__ptqrlogin()
  108.             elif(temp!=-1):
  109.                 #    进行二次登录验证
  110.                 #print(self.__cookie)
  111.                 return self.__check_sig(html[html.find("http"):html.find("','0','登录成功!'")])
  112.             else:
  113.                 return False
  114.         else:
  115.             return False
  116.     #----------------------------------------------------------------------
  117.     #    再一次进行登录验证
  118.     def __check_sig(self,url):
  119.         html=self.__http(url=url,referer="https://ui.ptlogin2.qq.com/cgi-bin/login")
  120.         if(html!=None):
  121.             temp=self.__cookie.find("ptwebqq")+8;
  122.             self.__ptwebqq=self.__cookie[temp:self.__cookie.find(";",temp)]
  123.             #    打印ptwebqq
  124.             #print(self.__ptwebqq)
  125.             #    获取vfwebqq
  126.             self.__getvfwebqq()
  127.             return self.__login2()
  128.         else:
  129.             return False
  130.     #----------------------------------------------------------------------
  131.     #    获取vfwebqq用于获取好友及群列表
  132.     def __getvfwebqq(self):
  133.         html=self.__http(url="http://s.web2.qq.com/api/getvfwebqq?ptwebqq="+self.__ptwebqq+"&clientid=53999199&psessionid=&t=1446710396202",
  134.                          referer="http://d.web2.qq.com/proxy.html?v=20130916001&callback=1&id=1")
  135.         if(html!=None):
  136.             #    尝试用Json解析
  137.             jsn=json.loads(html)
  138.             self.__vfwebqq=jsn["result"]["vfwebqq"]
  139.     #----------------------------------------------------------------------
  140.     #    最后一次登录验证,如果成功即便是成功了
  141.     def __login2(self):
  142.         #    此处需要直接进行编码,否则返回100001,
  143.         data="r=%7B%22ptwebqq%22%3A%22"+self.__ptwebqq+"%22%2C%22clientid%22%3A53999199%2C%22psessionid%22%3A%22%22%2C%22status%22%3A%22online%22%7D"
  144.         html=self.__http(url="http://d1.web2.qq.com/channel/login2",
  145.                          referer="http://d.web2.qq.com/proxy.html?v=20130916001&callback=1&id=2",
  146.                          data=data.encode(encoding="utf8"))
  147.         if (html==None):
  148.             return False
  149.         #    尝试使用Json
  150.         jsn=json.loads(html)
  151.         if(jsn["retcode"]==0):
  152.             #    获取登录UID及计算friendshash
  153.             self.__uin=jsn["result"]["uin"]
  154.             self.__hash= self.__friendsHash(self.__uin,self.__ptwebqq)
  155.             #    登录成功,可以获取好友及群列表
  156.             self.__get_user_friends2()
  157.             return True
  158.         else:
  159.             return False
  160.     #----------------------------------------------------------------------
  161.     #    为了获取好友,我们需要计算好友的Hash
  162.     def __friendsHash(self,X,K):
  163.         #    本段代码完全参考腾讯的JS进行编写,只不过我现在爱上了Python
  164.         N=[0 for x in range(4)]
  165.         V=[0 for x in range(4)]
  166.         U=[0 for x in range(8)]
  167.         #    字符串转换为字符数组
  168.         k=K.encode(encoding="UTF8")
  169.         n=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"]
  170.         for x in range(len(k)):
  171.             N[x%4]^=k[x]
  172.         x=int(X)
  173.         V[0] = x >> 24 & 255 ^ 69;
  174.         V[1] = x >> 16 & 255 ^ 67;
  175.         V[2] = x >> 8 & 255 ^ 79;
  176.         V[3] = x & 255 ^ 75;
  177.         for x in range(8):
  178.             U[x]=(x%2==0) and N[x>>1] or V[x>>1]
  179.         result=""
  180.         for x in U:
  181.             result+=n[x>>4&15]
  182.             result+=n[x&15]
  183.         return result
  184.     #    拉取好友列表http://s.web2.qq.com/api/get_user_friends2
  185.     def __get_user_friends2(self):
  186.         data="r=%7B%22vfwebqq%22%3A%22"+self.__vfwebqq+"%22%2C%22hash%22%3A%22"+self.__hash+"%22%7D"
  187.         html=self.__http(url="http://s.web2.qq.com/api/get_user_friends2",
  188.                          referer="http://s.web2.qq.com/proxy.html?v=20130916001&callback=1&id=1",
  189.                          data=data.encode(encoding="utf8"))
  190.         if(html!=None):
  191.             #    记录好友列表
  192.             jsn=json.loads(html)
  193.             if(jsn["retcode"]==0):
  194.                 #    正确返回列表后
  195.                 for x in jsn["result"]["marknames"]:
  196.                     print (x["markname"])
  197.     #----------------------------------------------------------------------
  198.     #    执行代码
  199.     def run(self):
  200.         #    下载二进制二维码图像
  201.         if(self.__ptqrshow()):
  202.             if(self.__ptqrlogin()):
  203.                 print("登录成功...")
  204.     #----------------------------------------------------------------------
  205.     #   销毁
  206.     def __del__(slef):
  207.         print("SmartQQ 已经退出...")
  208. if  __name__ == '__main__':
  209.     qq=SmartQQ()
  210.     qq.run()
  211.     x=input()
  212.     del qq
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2