Python3.2模拟实现webqq登录


Posted in Python onFebruary 15, 2016

这是我最初学习时自己做的一个python模拟登录webqq的实例代码,具体代码如下

import hashlib
from urllib import request,parse
from http import cookiejar
import re,random,time
import threading as th
import json.encoder as json_encode
import json.decoder as json_decode
class QQ:
  """
   Login QQ
  """
  __headers ={
        'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.9 Safari/534.30',\
        'Referer':'http://ui.ptlogin2.qq.com/cgi-bin/login?target=self&style=5&mibao_css=m_webqq&appid=1003903&enable_qlogin=0&no_verifyimg=1&s_url=http%3A%2F%2Fwebqq.qq.com%2Floginproxy.html&f_url=loginerroralert&strong_login=1&login_state=10&t=20110909003'\
  }
  __cookiepath = 'C:\\Users\\dingyangfan\\Desktop\php\\tt.txt'
  __qq = None
  __pswd = None
  __verifycode = None
  __clientid = 21628014
  __http = {}
  __psessionid = ''
  __ptwebqq = ''
  __vfwebqq = ''
  __skey = ''
  __poll2 = None
  __get_msg_tip = None
  __rc = 0
  __send_num = 31330000
  def __init__(self):
    self.httpproess()
    self.__Login()
    pass
  def __preprocess(self,password,verifycode):
    """
      QQ密码加密部份
    """
    return hashlib.md5( (self.__md5_3((password).encode('utf-8')) + (verifycode).upper()).encode('utf-8')).hexdigest().upper()
    pass
 
  def __md5_3(self,str):
    """
      QQ密码md5_3部份
    """
    return hashlib.md5(hashlib.md5(hashlib.md5(str).digest()).digest()).hexdigest().upper()
    pass
  def httpproess(self):
    """
      初始化模拟进程
    """
    self.__http['cj'] = cookiejar.MozillaCookieJar(self.__cookiepath)
    self.__http['opener'] = request.build_opener(request.HTTPCookieProcessor(self.__http['cj']))
    return self.__http
    pass
  def __request(self,url,method='GET',data={},savecookie=False):
    """
      请求url
    """
    if (method).upper() == 'POST':
      data = parse.urlencode(data).encode('utf-8')
      self.__http['req'] = request.Request(url,data,self.__headers)
    else:
      self.__http['req'] = request.Request(url=url,headers=self.__headers)
    fp = self.__http['opener'].open(self.__http['req'])
    try:
      str = fp.read().decode('utf-8')
    except UnicodeDecodeError:
      str = fp.read()
    if savecookie == True:
      self.__http['cj'].save(ignore_discard=True,ignore_expires=True)
    fp.close()
    return str
    pass
  def __getcookies(self,name):
    fp = open(self.__cookiepath)
    fp.seek(130)
    for read in fp.readlines():
      str = read.split(name)
      if len(str) == 2:
        fp.close()
        return str[1].strip()
    fp.close()
    return None
    pass
  def __getverifycode(self):
    """
      @url:http://ptlogin2.qq.com/check?uin=644826377&appid=1003903&r=0.56373973749578
    """
    urlv = 'http://ptlogin2.qq.com/check?uin='+ ('%s' % self.__qq)+'&appid=1003903&r='+ ('%s' % random.Random().random())
    str = self.__request(url = urlv, savecookie=True)
    str = re.findall(r'\d|(?<=\')[a-zA-Z0-9\!]{4}',str)
    return str
    pass
  def __request_login(self):
    """
      @url:http://ptlogin2.qq.com/login
      @params:{u:644826377
          p:73DA5C1145E0F82247F60B3A17B89E6A  verifycode:!S10  webqq_type:10
          remember_uin:1 login2qq:1 aid:1003903 u1:http://webqq.qq.com/loginproxy.html?login2qq=1&webqq_type=10
          h:1 ptredirect:0  ptlang:2052 from_ui:1  pttype:1 dumy:
          fp:loginerroralert  action:1-24-62651 mibao_css:m_webqq}
    """
    urlv = 'http://ptlogin2.qq.com/login?u='+('%s' % self.__qq) +'&' + 'p=' + ('%s' % self.__pswd) + '&verifycode='+ ('%s' % self.__verifycode[1]) +'&remember_uin=1&aid=1003903' + "&u1=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html%3Fstrong%3Dtrue" + '&h=1&ptredirect=0&ptlang=2052&from_ui=1&pttype=1&dumy=&fp=loginerroralert'
    str = self.__request(url = urlv,savecookie=True)
    if str.find('登录成功') != -1:
      #执行二次登录
      self.__ptwebqq = self.__getcookies('ptwebqq')
      self.__skey = self.__getcookies('skey')
      self.__request_post()
    elif str.find('不正确') != -1:
      print('你输入的帐号或者密码不正确,请重新输入。')
    else:
      print('登录失败')
    pass
  def __request_post(self):
    '''
      http://d.web2.qq.com/channel/login2
      r:{"status":"online","ptwebqq":"95b148b95af9be7677757b3a629e3904f52f153d0b714c527f81f8d9e385867a","passwd_sig":"",
      "clientid":"21628014","psessionid":null}
      clientid:21628014
      psessionid:null
    '''
    self.__headers.update({'Referer':'http://d.web2.qq.com/proxy.html?v=20110331002&callback=2'})
    a = {'status':'online','ptwebqq':self.__getcookies('ptwebqq'),'passwd_sig':'','clientid':self.__clientid,'psessionid':'null'}
    array = {'r':json_encode.JSONEncoder().encode(a),'clientid':self.__clientid,'psessionid':'null'}
    url = 'http://d.web2.qq.com/channel/login2'
    str = self.__request(url,'POST',array)
    str = json_decode.JSONDecoder().decode(str)
    self.__psessionid = str['result']['psessionid']
    self.__vfwebqq = str['result']['vfwebqq']
    self.__get_friend_info2()
    self.__get_user_friends2()
    self.__get_group_name_list_mask2()
    self.__poll2_()
    self.__get_msg_tip_()
    pass
  def __poll2_(self):
    """
      不知道干嘛的,一分钟连接一次,属于长连接,接收消息
      @url:http://d.web2.qq.com/channel/poll2
      r:{"clientid":"9467930","psessionid":"8368046764001e636f6e6e7365727665725f77656271714031302e3132382e36362e31313500003058000000c0026e040009456f266d0000000a407169446b464737436b6d00000028f8d256743e5c191cb40a2217845fab12fda62acd2e6145ae196976d7a8b3bb11a64d3c9565868322","key":0,"ids":[]}
      clientid:9467930
      psessionid:8368046764001e636f6e6e7365727665725f77656271714031302e3132382e36362e31313500003058000000c0026e040009456f266d0000000a407169446b464737436b6d00000028f8d256743e5c191cb40a2217845fab12fda62acd2e6145ae196976d7a8b3bb11a64d3c9565868322
    """
    self.__headers.update({'Referer':'http://d.web2.qq.com/proxy.html?v=20110331002&callback=2'})
    urlv = 'http://d.web2.qq.com/channel/poll2'
    a = {'clientid':self.__clientid,'psessionid':self.__psessionid,'key':0,'ids':[]}
    array = {'r':json_encode.JSONEncoder().encode(a),'clientid':self.__clientid,'psessionid':self.__psessionid}
    self.__poll2 = self.__request(url = urlv,method='POST',data = array)
    str = json_decode.JSONDecoder().decode(self.__poll2)
    print(str)
    if str['retcode'] == 0:
      if str['result'][0]['poll_type'] == 'message':
        self.__message(str['result'][0]['value']['from_uin'])
      elif str['result'][0]['poll_type'] == 'group_message':
        self.__group_message(str['result'][0]['value']['from_uin'])
        pass
    t1 = th.Timer(1,self.__poll2_)
    t1.start()
    pass
  def __get_msg_tip_(self):
    """
      #也不知道是什么,反正一直请求
      @url:http://webqq.qq.com/web2/get_msg_tip?uin=&tp=1&id=0&retype=1&rc=64&lv=2&t=1315746772886
    """
    self.__headers.update({'Referer':'http://webqq.qq.com/'})
    self.__rc += 1
    num = 100 + self.__rc
    t = '%s' % '%d' % time.time() + '%s' % num
    urlv = 'http://webqq.qq.com/web2/get_msg_tip?uin=&tp=1&id=0&retype=1&rc='+'%s'% self.__rc +'&lv=3&t=' + t
    self.__get_msg_tip = self.__request(urlv)
    print(self.__get_msg_tip)
    t2 = th.Timer(60,self.__get_msg_tip_)
    t2.start()
    pass
  def __get_friend_info2(self):
    '''
      @url:http://s.web2.qq.com/api/get_friend_info2?tuin=self.__qq&verifysession=&code=&vfwebqq=self.__vfwebqq
    '''
    self.__headers.update({'Referer':'http://s.web2.qq.com/proxy.html?v=20110412001&callback=1&id=2'})
    url = 'http://s.web2.qq.com/api/get_friend_info2?tuin='+ self.__qq + '&verifysession=&code=&vfwebqq=' + self.__vfwebqq + '&t=%s' % '%d' % time.time() + '100'
    str = self.__request(url)
    print(str)
    pass
  def __get_user_friends2(self):
    '''
      @url:http://s.web2.qq.com/api/get_user_friends2
    '''
    self.__headers.update({'Referer':'http://s.web2.qq.com/proxy.html?v=20110412001&callback=1&id=2'})
    url = 'http://s.web2.qq.com/api/get_user_friends2'
    a = {'h':'hello','vfwebqq':self.__vfwebqq}
    array = {'r':json_encode.JSONEncoder().encode(a)}
    str = self.__request(url,'POST',array)
    print(str)
    pass
  def __get_group_name_list_mask2(self):
    '''
      @url:http://s.web2.qq.com/api/get_group_name_list_mask2
    '''
    self.__headers.update({'Referer':'http://s.web2.qq.com/proxy.html?v=20110412001&callback=1&id=2'})
    url = 'http://s.web2.qq.com/api/get_group_name_list_mask2'
    a = {'vfwebqq':self.__vfwebqq}
    array = {'r':json_encode.JSONEncoder().encode(a)}
    str = self.__request(url,'POST',array)
    print(str)
    pass
  def __send_message(self,uid,msg):
    '''
      @url:http://d.web2.qq.com/channel/send_buddy_msg2
      r:{"to":3023379661,"face":180,"content":"[\"哈哈\",\"\\n【提示:此用户正在使用WebQQ:http://webqq.qq.com/】\",[\"font\",        {\"name\":\"宋体\",\"size\":\"10\",\"style\":[0,0,0],\"color\":\"000000\"}]]","msg_id":31330001,"clientid":"76133590",          "psessionid":"s"}
        clientid:76133590
        psessionid:s
 
      Referer:http://d.web2.qq.com/proxy.html?v=20110331002&callback=2
      {"retcode":0,"result":"ok"}
    '''
    self.__send_num +=1
    msg = "[\""+ msg +"\",[\"font\",{\"name\":\"宋体\",\"size\":\"10\",\"style\":[0,0,0],\"color\":\"000000\"}]]"
    self.__headers.update({'Referer':'http://d.web2.qq.com/proxy.html?v=20110331002&callback=2'});
    url = 'http://d.web2.qq.com/channel/send_buddy_msg2'
    a = {'to':uid,'face':180,'content':msg,'msg_id':self.__send_num,'clientid':self.__clientid,'psessionid':self.__psessionid}
    array = {'r':json_encode.JSONEncoder().encode(a),'clientid':self.__clientid,'psessionid':self.__psessionid}
    str = self.__request(url,'POST',array)
    print(str)
    pass
  def __message(self,uid):
    '''
      {"retcode":0,"result":[{"poll_type":"message","value":{"msg_id":13013,"from_uin":3023379661,"to_uin":644826377,"msg_id2":503935,"msg_type":9,"reply_ip":176752345,"time":1316143960,"content":[["font",{"size":13,"color":"000000","style":[0,0,0],"name":"\u5B8B\u4F53"}],"\u4E0D\u662F\u5427\u3002"]}}]}
 
    '''
    self.__send_message(uid,'我是机器人%s' % time.time())
    pass
  def __send_group_message(self,gid,msg):
    '''
      @url:http://d.web2.qq.com/channel/send_qun_msg2
      r:{"group_uin":1132101900,"content":"[\"哈哈哈,测试\",\"\\n【提示:此用户正在使用WebQQ:http://webqq.qq.com/】\",[\"font\",      {\"name\":\"宋体\",\"size\":\"10\",\"style\":[0,0,0],\"color\":\"000000\"}]]","msg_id":31330002,"clientid":"76133590",
      "psessionid":"a"}
      clientid:76133590
      psessionid:a
 
      Referer:http://d.web2.qq.com/proxy.html?v=20110331002&callback=2
 
      {"retcode":0,"result":"ok"}
    '''
    self.__send_num +=1
    msg = "[\"" +msg + "\",[\"font\",{\"name\":\"宋体\",\"size\":\"10\",\"style\":[0,0,0],\"color\":\"000000\"}]]"
    self.__headers.update({'Referer':'http://d.web2.qq.com/proxy.html?v=20110331002&callback=2'});
    url = 'http://d.web2.qq.com/channel/send_qun_msg2'
    a = {'group_uin':gid,'content':msg,'msg_id':self.__send_num,'clientid':self.__clientid,'psessionid':self.__psessionid}
    array = {'r':json_encode.JSONEncoder().encode(a),'clientid':self.__clientid,'psessionid':self.__psessionid}
    str = self.__request(url,'POST',array)
    print(str)
    pass
  def __group_message(self,gid):
    '''
      {"retcode":0,"result":[{"poll_type":"group_message","value":{"msg_id":8044,"from_uin":1132101900,"to_uin":644826377,"msg_id2":178306,"msg_type":43,"reply_ip":2886742214,"group_code":317106137,"send_uin":3023379661,"seq":10654,"time":1316143836,"info_seq":32946855,"content":[["font",{"size":13,"color":"000000","style":[0,0,0],"name":"\u5B8B\u4F53"}],"\u5DE5"]}}]}
 
    '''
    self.__send_group_message(gid,'我是机器人%s' % time.time())
    pass
  def __Login(self):
    """
      qq登录
    """
    self.__qq = input('QQ号:')
    self.__pswd = input('QQ密码:')
    self.__qq = self.__qq.strip()
    self.__pswd = self.__pswd.strip()
    self.__verifycode = self.__getverifycode()
    self.__pswd = self.__preprocess(
      self.__pswd,#密码 \
      '%s' % self.__verifycode[1] #验证码 \
    )
    self.__request_login()
    pass
 
s = QQ()

以上就是本文的全部内容,希望对大家学习python程序设计有所帮助。

Python 相关文章推荐
python基础教程之Hello World!
Aug 29 Python
详解Python3中的Sequence type的使用
Aug 01 Python
python subprocess 杀掉全部派生的子进程方法
Jan 16 Python
Python线程同步的实现代码
Oct 03 Python
解决Python中list里的中文输出到html模板里的问题
Dec 17 Python
matplotlib.pyplot画图并导出保存的实例
Dec 07 Python
Pytest框架之fixture的详细使用教程
Apr 07 Python
python实现四人制扑克牌游戏
Apr 22 Python
python学习笔记之多进程
Aug 06 Python
Python importlib模块重载使用方法详解
Oct 13 Python
Scrapy实现模拟登录的示例代码
Feb 21 Python
Python实现简单的俄罗斯方块游戏
Sep 25 Python
python编码最佳实践之总结
Feb 14 #Python
Python在Console下显示文本进度条的方法
Feb 14 #Python
如何使用python爬取csdn博客访问量
Feb 14 #Python
python动态网页批量爬取
Feb 14 #Python
Python ftp上传文件
Feb 13 #Python
Python cx_freeze打包工具处理问题思路及解决办法
Feb 13 #Python
Python批量创建迅雷任务及创建多个文件
Feb 13 #Python
You might like
PHP类与对象中的private访问控制的疑问
2012/11/01 PHP
WordPress中查询文章的循环Loop结构及用法分析
2015/12/17 PHP
PHP实现图片上传并压缩
2015/12/22 PHP
List Installed Software Features
2007/06/11 Javascript
JObj预览一个JS的框架
2008/03/13 Javascript
javascript globalStorage类代码
2009/06/04 Javascript
jquery中获取元素的几种方式小结
2011/07/05 Javascript
Javascript和Java获取各种form表单信息的简单实例
2014/02/14 Javascript
js图片模糊切换显示特效的方法
2015/02/17 Javascript
详解AngularJS中自定义过滤器
2015/12/28 Javascript
JavaScript惰性载入函数实例分析
2019/03/27 Javascript
详解vue后台系统登录态管理
2019/04/02 Javascript
微信小程序里引入SVG矢量图标的方法
2019/09/20 Javascript
js数组相减简单示例【删除a数组所有与b数组相同元素】
2020/03/04 Javascript
vue 使用vant插件做tabs切换和无限加载功能的实现
2020/11/04 Javascript
[01:00:53]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Secret
2018/03/30 DOTA
python获取局域网占带宽最大3个ip的方法
2015/07/09 Python
python实现淘宝秒杀脚本
2020/06/23 Python
python运用sklearn实现KNN分类算法
2019/10/16 Python
使用Puppeteer爬取微信文章的实现
2020/02/11 Python
tensorflow转换ckpt为savermodel模型的实现
2020/05/25 Python
基于Python快速处理PDF表格数据
2020/06/03 Python
pytorch加载自己的图像数据集实例
2020/07/07 Python
Python lambda表达式原理及用法解析
2020/08/18 Python
html5 canvas移动浏览器上实现图片压缩上传
2016/03/11 HTML / CSS
Linux常见面试题
2016/10/04 面试题
现在输入n个数字,以逗号,分开;然后可选择升或者降序排序;按提交键就在另一页面显示按什么排序,结果为,提供reset
2012/11/09 面试题
企业内控岗位的职责
2014/02/07 职场文书
产品质量承诺书范文
2014/03/27 职场文书
幼儿园大班开学寄语
2014/08/02 职场文书
办理信用卡收入证明范例
2014/09/13 职场文书
工作表扬信范文
2015/01/17 职场文书
乒乓球比赛通知
2015/04/27 职场文书
pytorch 带batch的tensor类型图像显示操作
2021/05/20 Python
使用Ajax实现进度条的绘制
2022/04/07 Javascript
SQL解决未能删除约束问题drop constraint
2022/05/30 SQL Server