采用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发送arp欺骗攻击代码分析
Jan 16 Python
python实现查找两个字符串中相同字符并输出的方法
Jul 11 Python
python使用电子邮件模块smtplib的方法
Aug 28 Python
Python获取文件所在目录和文件名的方法
Jan 12 Python
Python自定义线程池实现方法分析
Feb 07 Python
对python 各种删除文件失败的处理方式分享
Apr 24 Python
Python实现的远程登录windows系统功能示例
Jun 21 Python
用python wxpy管理微信公众号并利用微信获取自己的开源数据
Jul 30 Python
djano一对一、多对多、分页实例代码
Aug 16 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
Sep 03 Python
python可视化text()函数使用详解
Feb 11 Python
解决python -m pip install --upgrade pip 升级不成功问题
Mar 05 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动态分页函数,PHP开发分页必备啦
2011/11/07 PHP
深入解析Session是否必须依赖Cookie
2013/08/02 PHP
PHP查找数值数组中不重复最大和最小的10个数的方法
2015/04/20 PHP
PHP中把对象数组转换成普通数组的方法
2015/07/10 PHP
YII2框架中使用yii.js实现的post请求
2017/04/09 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
JavaScript delete操作符应用实例
2009/01/13 Javascript
将CKfinder整合进CKEditor3.0的新方法
2010/01/10 Javascript
JS/Jquery判断对象为空的方法
2015/06/11 Javascript
jquery中toggle函数交替使用问题
2015/06/22 Javascript
jQuery支持添加事件的日历特效代码分享(3种样式)
2015/08/24 Javascript
JS添加删除DIV的简单实例
2016/07/08 Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
2017/03/09 Javascript
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
分享5个小技巧让你写出更好的 JavaScript 条件语句
2018/10/20 Javascript
NodeJs实现简单的爬虫功能案例分析
2018/12/05 NodeJs
React 使用Hooks简化受控组件的状态绑定
2019/03/18 Javascript
layer.open组件获取弹出层页面变量、函数的实例
2019/09/25 Javascript
原生js实现的观察者和订阅者模式简单示例
2020/04/18 Javascript
[44:15]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第二局
2016/03/06 DOTA
Python实现新浪博客备份的方法
2016/04/27 Python
Python用threading实现多线程详解
2017/02/03 Python
python编程培训 python培训靠谱吗
2018/01/17 Python
matplotlib subplots 设置总图的标题方法
2018/05/25 Python
Python获取航线信息并且制作成图的讲解
2019/01/03 Python
django的分页器Paginator 从django中导入类
2019/07/25 Python
python 图像的离散傅立叶变换实例
2020/01/02 Python
基于python爬取链家二手房信息代码示例
2020/10/21 Python
大型会议接待方案
2014/03/01 职场文书
小浪底导游词
2015/02/12 职场文书
教导处教学工作总结
2015/08/12 职场文书
Python下opencv库的安装过程及问题汇总
2021/06/11 Python
Java方法重载和方法重写的区别到底在哪?
2021/06/11 Java/Android
Win11安装受阻怎么办? Windows11安装问题与解决方案汇总
2021/11/21 数码科技
vue组件vue-esign实现电子签名
2022/04/21 Vue.js