采用python实现简单QQ单用户机器人的方法
作者:shichen2014 发布时间:2022-06-26 03:28:40
标签:python,QQ
采用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()
至此,机器人功能得以实现!
0
投稿
猜你喜欢
- 本文是利用python 复制文件夹 刚开始写了一个普通的递归复制文件夹 然后想了想 觉得对io频繁的程序 thre
- python数据结构之 列表和元组序列:序列是一种数据结构,它包含的元素都进行了编号(从0开始)。典型的序列包括列表、字符串和元组。其中,列
- 前言:python在同一个线程中多次执行同一方法时,该方法执行耗时较长且每次执行过程及结果互不影响,如果只在主进程中执行,效率会很低,因此使
- python字符串连接的方法,一般有以下三种:方法1:直接通过加号(+)操作符连接website = 'python' +
- 一、使用ImageFolder读取数据集时忽略特定文件如果事先知道需要忽略哪些文件,当然直接从数据集里删除就行了。但如果需要在程序运行时动态
- 本文详细归纳整理了Python中列表、字典、元组、集合数据结构。分享给大家供大家参考。具体分析如下:列表:shoplist = ['
- >>> "hello".encode("hex") '68656c6c6f
- 在用wordpress这个博客的时候,我很奇怪的发现,最近写的内容排在第一页,而最早写的成了最后页。这显然有悖逻辑,正常的情况应该是最早写的
- 作用域:顾名思义,作用的范围。如果你是自学者,而且已经进军到函数这一部分了,那么就应当了解下Python的作用域。否则你可能会像我一样,总是
- #coding=utf-8#对话框import sysfrom PyQt4 import QtGui, QtCoreclass Window
- 本文实例讲述了django框架使用模板。分享给大家供大家参考,具体如下:models.py:from django.db import mo
- 已解决卸载pip重新安装的方法问题需求粉丝群里面的一个小伙伴遇到问题跑来私信我,想用卸载pip重新安装pip,但是发生了报错(当时他心里瞬间
- 是什么能让一个设计看上去是协调的,有条理的,专业的?答案是”色彩”.不是所有的项目都要用那种浅的”公司蓝”(corporate blue)才
- 我发布了一个通过FTP自动优化新图像的教程。这次我们将抓取整个网站,并在本地优化我们遇到的图像,按URL组织。请注意,这个简短但中级的脚本不
- python常见的错误有1.NameError变量名错误2.IndentationError代码缩进错误3.AttributeError对象
- 匿名函数lambdaPython使用lambda关键字创造匿名函数。所谓匿名,意即不再使用def语句这样标准的形式定义一个函数。这种语句的目
- 本文实例讲述了Python实现快速多线程ping的方法。分享给大家供大家参考。具体如下:#!/usr/bin/python#_*_codin
- IE历来被web标准的拥护者所诟病,而当FireFox横空出世以后,更多的网页制作者开始关注web标准设计。看着FireFox的市场占有率不
- 各种请求方式pip3 install requests>>> import requests>>> r
- 前言如果你在寻找python工作,那你的面试可能会涉及Python相关的问题。通过对网络资料的收集整理,本文列出了100道python的面试