python实现简单对话机器人_采用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">提示)',\'

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 , qq , 机器人 单用户 python实现qq机器人、python实现简单爬虫、python 机器人、python 聊天机器人、python 微信机器人,以便于您获取更多的相关知识。

标签: Python

顶一下

(0)

0%

踩一下

(0)

0%

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要用 Python 实现 QQ机器人,你需要先了解 QQ 机器人的工作原理。QQ 机器人需要连接 QQ 协议服务器,接收和发送消息,然后根据消息内容做出相应的响应。 一些 Python 库可以帮助你实现这个功能,比如 SmartQQQQBot。这里我们以 QQBot 为例,简单介绍一下如何用 Python 实现 QQ机器人。 首先,你需要在 QQ 中注册一个机器人账号,并开通机器人权限。然后,你需要安装 QQBot 库,可以使用 pip 工具进行安装: ``` pip install qqbot ``` 安装完成后,你需要创建一个 QQBot 实例,并添加一些处理函数,用来处理接收到的消息。比如,如果接收到一条消息,你可以解析这条消息,并根据消息内容做出相应的回复。 下面是一个简单的示例代码: ```python from qqbot import QQBotSlot as qqbotslot, RunBot # 处理群消息的函数 @qqbotslot def onQQMessage(bot, contact, member, content): if content == 'hello': # 回复消息 bot.SendTo(contact, 'world') elif content == 'hi': # 回复消息,并@发消息的人 bot.SendTo(contact, '@' + member.name + ' hello') # 创建 QQBot 实例并运行 if __name__ == '__main__': RunBot() ``` 这个示例代码中,我们定义了一个 `onQQMessage` 函数,用来处理群消息。当接收到一条消息时,如果消息内容是 `'hello'`,则回复 `'world'`;如果消息内容是 `'hi'`,则回复 `'@发消息的人 hello'`。 你可以根据自己的需要,添加更多的处理函数,来实现更丰富的功能。当你完成代码编写后,可以运行这个 Python 文件,QQBot 就会连接到 QQ 协议服务器,并等待接收消息。当有消息到来时,QQBot 会调用相应的处理函数进行处理,并根据处理函数的返回值发送消息。 当然,要实现一个完整的 QQ机器人还需要考虑很多问题,比如如何处理群成员变化、如何处理非法消息等等。这里只是提供了一个基本的实现思路,供你参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值