使用qqbot + 聚合数据 api 实现qq智能聊天机器人 python2,3全版本兼容
借鉴了 qqbot 这位兄弟写的qqbot的库,原理是使用smartqq 来抓取包, 来分析qq聊天的各种api
首先准备工作,下载qqbot的库
pip install qqbot
去聚合数据注册一个账号,进行实名认证并且申请 问答机器人,这个审核过程可能会有1-2个小时左右,不过你实名认证的同时可以进行申请问答机器人这个api
准备工作做完之后,就开始我们的开发工作了,
-
在命令行输入
qq
成功运行后会弹出二维码,至此qqbot 运行成功,
在项目目录下新建一个py文件名为qqtest.py 代码如下
from qqbot import QQBotSlot as qqbotslot,RunBot
from random import randint
@qqbotslot
def onQQMessage(bot, contact, member, content):
#在这里过滤过来的输入, content的内容是监听qq上所有的输入
# 当群里有人@你的时候 传入过来的会被转化为[@ME]
# 所以使用 @ME 来过滤其他人在群里面at你
if '@ME' in content:
#四个参数的详细
#bot : QQBot 对象,提供 List/SendTo/Stop/Restart 四个接口,详见本文档第五节
#contact : QContact 对象,消息的发送者,具有 ctype/qq/uin/nick/mark/card/name 属性,这些属性都是 str 对象
#member : QContact 对象,仅当本消息为 群或讨论组 消息时有效,代表实际发消息的成员
#content : str 对象,消息内容
bot.SendTo(contact,'@'+member.name+" 哈哈 ")
#这里是因为部分群里面的at无法转化为[@ME]所以自己过滤at自己的内容
elif '@' in content and '光' in content:
bot.SendTo(contact,'@'+member.name+" 哈哈 ")
RunBot()```
- 到此一个基本的qq机器人已经完成了,但是这个机器人只会回复哈哈,这时咱们去查看我们的接口审核通过了没(假设通过
), - 来到这里查看自己的appkey,复制下来作为自己的key值到时候来做调用api的凭证
- 接下来的代码是python3请求接口的代码。python2请求接口的代码聚合数据提供的有查看代码实例
- 创建文件 juheapi.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import json, urllib,urllib.parse,urllib.request
#----------------------------------
# 问答机器人调用示例代码 - 聚合数据
# 在线接口文档:http://www.juhe.cn/docs/112
#----------------------------------
header={"User-Agent":'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.59 Safari/537.36',"Content-Type":'text/html; charset=utf-8'}
def main(text = '哈哈哈'):
#配置您申请的APPKey
appkey = ""
#1.问答
return request1(appkey,"GET",text)
#问答
def request1(appkey, m="GET", text="哈哈"):
url = "http://op.juhe.cn/robot/index"
params = {
"key" : appkey, #您申请到的本接口专用的APPKEY
"info" : text, #要发送给机器人的内容,不要超过30个字符
"dtype" : "", #返回的数据的格式,json或xml,默认为json
"loc" : "", #地点,如北京中关村
"lon" : "", #经度,东经116.234632(小数点后保留6位),需要写为116234632
"lat" : "", #纬度,北纬40.234632(小数点后保留6位),需要写为40234632
"userid" : "", #1~32位,此userid针对您自己的每一个用户,用于上下文的关联
}
params = urllib.parse.urlencode(params)
if m =="GET":
req = urllib.request.Request("%s?%s" % (url, params), data=None,headers=header)
f = urllib.request.urlopen(req)
else:
req = urllib.request.Request(url+params, data=None,headers=header)
f = urllib.request.urlopen(req)
content = f.read().decode()
res = json.loads(content)
if res:
error_code = res["error_code"]
if error_code == 0:
#成功请求
# print (res["result"])
# return res['result']
# print (res['result']['text'])
return res['result']['text']
else:
err = json.dumps(res)
with open('log.txt','a+') as oo:
oo.write(err+"\n\r"+text)
# print ("%s:%s" % (res["error_code"],res["reason"]))
return "我好像出错了$%$*%*&^#$@#%$@#%"
else:
return "我的接口好像出错了,哈哈哈,创造我的人技术不行啊"
- 我上面进行过稍微改动便于我们使用 qqtest.py 来调用,额外加了一个参数text 到时候作为机器人的内容传进来,
- 所以根据这样的api内容我们重新修改我们qqtest文件的代码
from qqbot import QQBotSlot as qqbotslot,RunBot
from random import randint
import juheapi
@qqbotslot
def onQQMessage(bot, contact, member, content):
if '@ME' in content:
# //拿取回答答案
wenti = content.split('[@ME]')[-1]
daan = juheapi.main(wenti)
bot.SendTo(contact,'@'+member.name+" "+daan)
elif '@' in content and '光' in content:
wenti = content.split('光')[-1]
daan = juheapi.main(wenti)
bot.SendTo(contact,'@'+member.name+" "+daan)
RunBot()
- 至此开发已经完成了,。还有许多不完善的地方,希望大家能够帮助改进,我的项目地址