采用python实现简单QQ单用户机器人的方法


Posted in Python onJuly 03, 2014

采用python实现简单QQ单用户机器人的方法如下:

一、首先我们查看一下关于3GQQ的相关协议:
    对此,打开一个支持WAP的浏览器,可以使用Firefox的wmlbrowser插件,打开FF后,访问地址 https://addons.mozilla.org/zh-CN/firefox/search/?q=wmlbrowser&cat=all&x=17&y=11
  
二、进入3GQQ的进行协议分析
    3GQQ的地址是:http://pt.3g.qq.com/s?aid=nLogin3gqq 用安装了wmlbrowser插件的FF打开页面后,启用firebug,即可实现监视提交的数据。

三、源代码部分:

#coding:utf-8
#基于python2.6版本开发
import httplib,urllib,os,threading,re
import sys
reload(sys)
sys.setdefaultencoding('utf8')
class PYQQ:
  def __init__(self):
    self.reqIndex = 0
  
  #HTTP请求
  def httpRequest(self,method,url,data={}):
    try:
      _urld = httplib.urlsplit(url)
      conn = httplib.HTTPConnection(_urld.netloc,80,True,3)
      conn.connect()
      data = urllib.urlencode(data)
      if method=='get':
        conn.putrequest("GET", url, None)
        conn.putheader("Content-Length",'0')
      elif method=='post':
        conn.putrequest("POST", url)
        conn.putheader("Content-Length", str(len(data)))
        conn.putheader("Content-Type", "application/x-www-form-urlencoded")
      
      conn.putheader("Connection", "close")
      conn.endheaders()
      
      if len(data)>0:
        conn.send(data)
      f = conn.getresponse()
      self.httpBody = f.read().encode('utf8')
      f.close()
      conn.close()
    except:
      self.httpBody=''
    return self.httpBody
  #通过首尾获取字符串的内容
  def getCon(self,start,end):
    findex = self.httpBody.find(start)
    if findex == -1 : return None
    tmp = self.httpBody.split(start)
    
    eindex = tmp[1].find(end)
    if eindex == -1:
      return tmp[1][0:]
    else:
      return tmp[1][0:eindex]
  #获取postfield的值
  def getField(self,fd):
    KeyStart = '')
  #获取登陆验证码,并保存至当前目录的qqcode.gif
  def getSafecode(self):
    url = self.getCon('python_实现简单QQ单用户机器人
    import urllib2
    pager = urllib2.urlopen(url)
    data=pager.read()
    file=open(os.getcwd()+'\qqcode.gif','w+b')
    file.write(data)
    file.close()
    return True
  #登陆QQ
  def login(self):
    self.qq = raw_input('请输入QQ号:'.encode('gbk'))
    self.pwd = raw_input('请输入密码:'.encode('gbk'))
    s1Back = self.httpRequest('post','http://pt.3g.qq.com/handleLogin',{'r':'240971315','qq':self.qq,'pwd':self.pwd,'toQQchat':'true','q_from':'','modifySKey':0,'loginType':1})
    if s1Back.find('请输入验证码')!=-1:
      self.sid = self.getField('sid')
      self.hexpwd = self.getField('hexpwd')
      self.extend = self.getField('extend')
      self.r_sid = self.getField('r_sid')
      self.rip = self.getField('rip')
      if self.getSafecode():
        self.safeCode = raw_input('请输入验证码(本文件同目录的qqcode.gif):')
      else:
        print '验证码加载错误'
      
      postData = {'sid':self.sid,'qq':self.qq,'hexpwd':self.hexpwd,'hexp':'true','auto':'0',
            'logintitle':'手机腾讯网','q_from':'','modifySKey':'0','q_status':'10',
            'r':'271','loginType':'1','prev_url':'10','extend':self.extend,'r_sid':self.r_sid,
            'bid_code':'','bid':'-1','toQQchat':'true','rip':self.rip,'verify':self.safeCode,
      }
      s1Back = self.httpRequest('post','http://pt.3g.qq.com/handleLogin',postData)
    
    self.sid = self.getCon('sid=','&')
    #print self.sid
    print '登陆成功'.encode('gbk')
    self.getMsgFun()  
  #定时获取消息
  def getMsgFun(self):
    self.reqIndex = self.reqIndex + 1
    s2Back = self.httpRequest('get','http://q32.3g.qq.com/g/s?aid=nqqchatMain&sid='+self.sid)
    if s2Back.find('alt="聊天"/>(')!=-1:
      #有新消息,请求获取消息页面
      s3back = self.httpRequest('get','http://q32.3g.qq.com/g/s?sid='+ self.sid + '&aid=nqqChat&saveURL=0&r=1310115753&g_f=1653&on=1')
      
      #消息发起者的昵称
      if s3back.find('title="临时会话')!=-1:
        _fromName = '临时对话'
      else:
        _fromName = self.getCon('title="与','聊天')
      
      #消息发起者的QQ号
      _fromQQ = self.getCon('num" value="','"/>')
      
      #消息内容
      _msg_tmp = self.getCon('saveURL=0">提示)',\'<input name="msg"\')
      crlf = '\n'
      if _msg_tmp.find('\r\n')!=-1: crlf = '\r\n'
      _msg = re.findall(r'(.+)
'+ crlf +'(.+)
',_msg_tmp)
      
      for _data in _msg:
        self.getMsg({'qq':_fromQQ,'nick':_fromName,'time':_data[0],'msg':str(_data[1]).strip()})
    
    if self.reqIndex>=30:
      #保持在线
      _url = 'http://pt5.3g.qq.com/s?aid=nLogin3gqqbysid&3gqqsid='+self.sid
      self.httpRequest('get',_url)
      self.reqIndex = 0
    t = threading.Timer(2.0,self.getMsgFun)
    t.start()  
  #发送消息
  #qq 目标QQ
  #msg 发送内容
  def sendMsgFun(self,qq,msg):
    msg = unicode(msg,'utf8').encode('utf8')
    postData = {'sid':self.sid,'on':'1','saveURL':'0','saveURL':'0','u':qq,'msg':str(msg),}
    s1Back = self.httpRequest('post','http://q16.3g.qq.com/g/s?sid='+ self.sid +'&aid=sendmsg&tfor=qq',postData)
    print '发送消息给'.encode('gbk'),qq,'成功'.encode('gbk')  
  #收到消息的接口,重载或重写该方法
  def getMsg(self,data):
    print data['time'],"收到".encode('gbk'),data['nick'].encode('gbk'),"(",data['qq'],")的新消息".encode('gbk')," : ",data['msg'].encode('gbk')
    self.sendMsgFun(data['qq'],data['nick']+' ,测试消息。。')#+ data['msg'])
QQ = PYQQ()
QQ.login()

至此,机器人功能得以实现!

Python 相关文章推荐
python抓取豆瓣图片并自动保存示例学习
Jan 10 Python
python分块读取大数据,避免内存不足的方法
Dec 10 Python
python+opencv打开摄像头,保存视频、拍照功能的实现方法
Jan 08 Python
Django给admin添加Action的步骤详解
May 01 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
Feb 29 Python
Django模型中字段属性choice使用说明
Mar 30 Python
3种适用于Python的疯狂秘密武器及原因解析
Apr 29 Python
Python使用matplotlib绘制圆形代码实例
May 27 Python
python打开音乐文件的实例方法
Jul 21 Python
使用anaconda安装pytorch的实现步骤
Sep 03 Python
重构Python代码的六个实例
Nov 25 Python
Python实现微信表情包炸群功能
Jan 28 Python
centos系统升级python 2.7.3
Jul 03 #Python
python实现定制交互式命令行的方法
Jul 03 #Python
小结Python用fork来创建子进程注意事项
Jul 03 #Python
在Windows8上的搭建Python和Django环境
Jul 03 #Python
Win7上搭建Cocos2d-x 3.1.1开发环境
Jul 03 #Python
盘点提高 Python 代码效率的方法
Jul 03 #Python
python实现html转ubb代码(html2ubb)
Jul 03 #Python
You might like
初品cakephp 入门基础
2012/02/16 PHP
TNC vs IO BO3 第二场2.13
2021/03/10 DOTA
json简单介绍
2008/06/10 Javascript
一个小型js框架myJSFrame附API使用帮助
2008/06/28 Javascript
理解Javascript_14_函数形式参数与arguments
2010/10/20 Javascript
input 和 textarea 输入框最大文字限制的jquery插件
2011/10/27 Javascript
jQuery插件jQuery-JSONP开发ajax调用使用注意事项
2013/11/22 Javascript
Jquery性能优化详解
2014/05/15 Javascript
nodejs npm install全局安装和本地安装的区别
2014/06/05 NodeJs
Node.js 服务器端应用开发框架 -- Hapi.js
2014/07/29 Javascript
详解参数传递四种形式
2015/07/21 Javascript
JavaScript记录光标在编辑器中位置的实现方法
2016/04/22 Javascript
怎么限制input的text里输入的值只能是数字(正则、js)
2016/05/16 Javascript
BOM系列第二篇之定时器requestAnimationFrame
2016/08/17 Javascript
JS获取当前页面名称的简单实例
2016/08/19 Javascript
js实现前端分页页码管理
2017/01/06 Javascript
详解AngularJS ng-class样式切换
2017/06/27 Javascript
浅谈Vue.js应用的四种AJAX请求数据模式
2017/08/30 Javascript
vue实现文字横向无缝走马灯组件效果的实例代码
2019/04/09 Javascript
webpack4 从零学习常用配置(小结)
2019/05/28 Javascript
[46:00]Ti4 冒泡赛第二轮LGD vs C9 2
2014/07/14 DOTA
Python中的with语句与上下文管理器学习总结
2016/06/28 Python
Python内置函数—vars的具体使用方法
2017/12/04 Python
python 获取键盘输入,同时有超时的功能示例
2018/11/13 Python
10 分钟快速入门 Python3的教程
2019/01/29 Python
pygame编写音乐播放器的实现代码示例
2019/11/19 Python
python关于倒排列的知识点总结
2020/10/13 Python
python中time包实例详解
2021/02/02 Python
迪卡侬荷兰官网:Decathlon荷兰
2017/10/29 全球购物
基督教卡片、励志礼品、家居装饰等:DaySpring
2018/10/12 全球购物
英国在线药房和在线药剂师:Chemist 4 U
2020/01/05 全球购物
营业经理岗位职责
2013/11/10 职场文书
2014年五一促销活动方案
2014/03/09 职场文书
带病坚持工作事迹
2014/05/03 职场文书
会议通知
2015/04/15 职场文书
2016学校先进集体事迹材料
2016/02/29 职场文书