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 相关文章推荐
wxPython 入门教程
Oct 07 Python
解读Python中degrees()方法的使用
May 18 Python
python制作企业邮箱的爆破脚本
Oct 05 Python
用Python设计一个经典小游戏
May 15 Python
使用requests库制作Python爬虫
Mar 25 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
Jul 24 Python
python计算n的阶乘的方法代码
Oct 25 Python
Django admin禁用编辑链接和添加删除操作详解
Nov 15 Python
Python测试线程应用程序过程解析
Dec 31 Python
Python实现大数据收集至excel的思路详解
Jan 03 Python
Python填充任意颜色,不同算法时间差异分析说明
May 16 Python
基于Python下载网络图片方法汇总代码实例
Jun 24 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
为IP查询添加GOOGLE地图功能的代码
2010/08/08 PHP
php 文章调用类代码
2011/08/11 PHP
zf框架的Filter过滤器使用示例
2014/03/13 PHP
PHP中Memcache操作类及用法实例
2014/12/12 PHP
学习php设计模式 php实现享元模式(flyweight)
2015/12/07 PHP
js判断页面中是否有指定控件的简单实例
2014/03/04 Javascript
页面刷新时记住滚动条的位置jquery代码
2014/06/17 Javascript
jquery+CSS实现的水平布局多级网页菜单效果
2015/08/24 Javascript
深入浅出ES6之let和const命令
2016/08/25 Javascript
Vue.js每天必学之过滤器与自定义过滤器
2016/09/07 Javascript
AngularJS实现在ng-Options加上index的解决方法
2016/11/03 Javascript
jQuery EasyUI Draggable拖动组件
2017/03/01 Javascript
bootstrap daterangepicker双日历时间段选择控件详解
2017/06/15 Javascript
JS移动端/H5同时选择多张图片上传并使用canvas压缩图片
2017/06/20 Javascript
VUE元素的隐藏和显示(v-show指令)
2017/06/23 Javascript
详解Angular操作cookies方法
2018/06/01 Javascript
Vue Router history模式的配置方法及其原理
2019/05/30 Javascript
JS实现斐波那契数列的五种方式(小结)
2020/09/09 Javascript
[01:10]DOTA2次级职业联赛 - U5战队宣传片
2014/12/01 DOTA
复习Python中的字符串知识点
2015/04/14 Python
python任务调度实例分析
2015/05/19 Python
python shell根据ip获取主机名代码示例
2017/11/25 Python
python2 与python3的print区别小结
2018/01/16 Python
通过python实现随机交换礼物程序详解
2019/07/10 Python
解决python cv2.imread 读取中文路径的图片返回为None的问题
2020/06/02 Python
Python调用.net动态库实现过程解析
2020/06/05 Python
Vuori官网:运动服装的终级表现
2021/01/27 全球购物
什么是命名空间(NameSpace)
2015/11/24 面试题
应届生求职信写作技巧
2013/10/24 职场文书
教师师德教育的自我评价
2013/10/31 职场文书
营销人才自我鉴定范文
2013/12/25 职场文书
单位委托书范本
2014/04/04 职场文书
人事行政经理岗位职责
2014/06/18 职场文书
2014年学习部工作总结
2014/11/12 职场文书
班主任2015新年寄语
2014/12/08 职场文书
商业计划书如何写?关键问题有哪些?
2019/07/11 职场文书