采用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获取邮件地址的方法
Jul 10 Python
Python 数据处理库 pandas 入门教程基本操作
Apr 19 Python
浅谈pycharm的xmx和xms设置方法
Dec 03 Python
Python3.5基础之NumPy模块的使用图文与实例详解
Apr 24 Python
python调用并链接MATLAB脚本详解
Jul 05 Python
Python如何调用JS文件中的函数
Aug 16 Python
python+pygame实现坦克大战
Sep 10 Python
python Pillow图像处理方法汇总
Oct 16 Python
使用 Python 清理收藏夹里已失效的网站
Dec 03 Python
Python datetime模块使用方法小结
Jun 18 Python
使用python求斐波那契数列中第n个数的值示例代码
Jul 26 Python
如何理解python接口自动化之logging日志模块
Jun 15 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
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
2010/12/19 PHP
完美实现GIF动画缩略图的php代码
2011/01/02 PHP
PHP采用XML-RPC构造Web Service实例教程
2014/07/16 PHP
PHP上传Excel文件导入数据到MySQL数据库示例
2016/10/25 PHP
PHP判断是否是微信打开,浏览器打开的方法
2018/03/14 PHP
PHP连接MySQL数据库的三种方式实例分析【mysql、mysqli、pdo】
2019/11/04 PHP
jQuery之选择组件的深入解析
2013/06/19 Javascript
红米手机抢购的js代码
2014/03/10 Javascript
AngularJS模块学习之Anchor Scroll
2016/01/19 Javascript
利用BootStrap弹出二级对话框的简单实现方法
2016/09/21 Javascript
JavaScript trim 实现去除字符串首尾指定字符的简单方法
2016/12/27 Javascript
Vue官方文档梳理之全局配置
2017/11/22 Javascript
解决VUEX兼容IE上的报错问题
2018/03/01 Javascript
vue-router动态设置页面title的实例讲解
2018/08/30 Javascript
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
2019/11/05 Javascript
解决node终端下运行js文件不支持ES6语法
2020/04/04 Javascript
Element Carousel 走马灯的具体实现
2020/07/26 Javascript
关于vue属性使用和不使用冒号的区别说明
2020/10/22 Javascript
jquery实现异步文件上传ajaxfileupload.js
2020/10/23 jQuery
vant 解决tab切换插件标题样式自定义的问题
2020/11/13 Javascript
浅谈pyhton学习中出现的各种问题(新手必看)
2017/05/17 Python
浅谈Python中的作用域规则和闭包
2018/03/20 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
2019/10/17 Python
Python求解正态分布置信区间教程
2019/11/20 Python
Python Web静态服务器非堵塞模式实现方法示例
2019/11/21 Python
基于python连接oracle导并出数据文件
2020/04/28 Python
PyQt5实现登录页面
2020/05/30 Python
python ssh 执行shell命令的示例
2020/09/29 Python
汇智创新科技发展有限公司
2015/12/06 面试题
伊琍体标语
2014/06/25 职场文书
关于读书的演讲稿400字
2014/08/27 职场文书
车间主任岗位职责
2015/02/03 职场文书
后天观后感
2015/06/08 职场文书
大学优秀学生主要事迹材料
2015/11/04 职场文书
Python WSGI 规范简介
2021/04/11 Python
Android Canvas绘制文字横纵向对齐
2022/06/05 Java/Android