采用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自定义类的数组排序实现代码
Aug 28 Python
解析Python中的eval()、exec()及其相关函数
Dec 20 Python
详解Appium+Python之生成html测试报告
Jan 04 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
Jan 30 Python
pyqt 实现在Widgets中显示图片和文字的方法
Jun 13 Python
Python数据类型之列表和元组的方法实例详解
Jul 08 Python
python opencv 简单阈值算法的实现
Aug 04 Python
python3 pillow模块实现简单验证码
Oct 31 Python
详解Python在使用JSON时需要注意的编码问题
Dec 06 Python
win10下python2和python3共存问题解决方法
Dec 23 Python
Python3 pickle对象串行化代码实例解析
Mar 23 Python
python 基于opencv实现高斯平滑
Dec 18 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
Yii框架中memcache用法实例
2014/12/03 PHP
WAF的正确bypass
2017/01/05 PHP
键盘控制事件应用教程大全
2006/11/24 Javascript
一个基于jquery的图片切换效果
2010/07/06 Javascript
JS实现self的resend
2010/07/22 Javascript
JS实现弹性漂浮效果的广告代码
2015/09/02 Javascript
JavaScript使ifram跨域相互访问及与PHP通信的实例
2016/03/03 Javascript
javascript数组对象常用api函数小结(连接,插入,删除,反转,排序等)
2016/09/20 Javascript
微信小程序 教程之小程序配置
2016/10/17 Javascript
微信小程序手势操作之单触摸点与多触摸点
2017/03/10 Javascript
Node.js实现文件上传的示例
2017/06/28 Javascript
JavaScript使用小插件实现倒计时的方法讲解
2019/03/11 Javascript
Node Mongoose用法详解【Mongoose使用、Schema、对象、model文档等】
2020/05/13 Javascript
[52:15]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS LGD-GAMING
2014/05/23 DOTA
[00:32]2018DOTA2亚洲邀请赛Secret出场
2018/04/03 DOTA
[01:04]不如跳舞!DOTA2新英雄玛尔斯的欢乐日常
2019/03/11 DOTA
Python中操作符重载用法分析
2016/04/29 Python
深入解析Python的Tornado框架中内置的模板引擎
2016/07/11 Python
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
解决Ubuntu pip 安装 mysql-python包出错的问题
2018/06/11 Python
Python查找最长不包含重复字符的子字符串算法示例
2019/02/13 Python
Python实现病毒仿真器的方法示例(附demo)
2020/02/19 Python
Python-jenkins模块获取jobs的执行状态操作
2020/05/12 Python
Python Scrapy多页数据爬取实现过程解析
2020/06/12 Python
python Matplotlib模块的使用
2020/09/16 Python
css3实现背景动态渐变效果
2019/12/10 HTML / CSS
实习生个人的自我评价
2013/12/08 职场文书
学校办公室主任职责
2013/12/27 职场文书
上班迟到检讨书
2014/01/10 职场文书
2014学习全国两会精神心得体会2000字
2014/03/11 职场文书
爱国演讲稿500字
2014/05/04 职场文书
安全责任书模板
2014/07/22 职场文书
2014年辅导员工作总结
2014/11/18 职场文书
2016年五一劳动节专题校园广播稿
2015/12/17 职场文书
严以用权学习心得体会
2016/01/12 职场文书
React Fragment介绍与使用详解
2021/11/11 Javascript