环境要求
- mac OS/linux(其他操作系统类似)
- 酷Qdocker+CoolQ HTTP API 插件
- NoneBot
- docker
如果是windows服务器或者电脑也可以安装酷Q,mac linux/linux服务器只能装酷Qdocker(推荐docker安装)
简单介绍
简单介绍一下原理是什么。
- 在酷Q中登录你的QQ账号,「酷Q」接管你的消息,并将QQ的所有消息请求和发送进行封装成一些接口,供“插件”进行进一步接管和调用。
酷Q的插件后缀都是.cpk
,需要安装在酷Q的内部。
- 「CoolQ HTTP API 插件」作用就是专门针对“http请求以及信息处理”方面的插件,使用的语言当然是与酷Q一致的(易语言好像是)
会易语言的开发者还是蛮少的吧...emmm
- 「NoneBot」就像一个翻译官,将「CoolQ HTTP API 插件」的插件全部转变成“Python的方法”。
「CoolQ HTTP API 插件」有很多个不同语言的翻译官,方便使用不同语言的开发者直接处理酷Q的信息。
这样,我们直接写Python文件,就能直接接收或者发送QQ消息啦!
开始
开始安装!
#1. 安装docker
brew install docker
#2. 安装酷Q+http插件集成镜像
docker pull richardchien/cqhttp:latest
#3. 安装nonebot
pip3 install nonebot
我们在docker中先启用酷Q
docker run -ti --rm --name cqhttp-test -v $(pwd)/coolq:/home/user/coolq -p 9001:9000 -p 5701:5700 -e COOLQ_ACCOUNT=123456 -e CQHTTP_POST_URL=http://example.com:8080 -e CQHTTP_SERVE_DATA_FILES=yes richardchien/cqhttp:latest
上面的命令如果需要改,就改9001
和5701
就可以了,其它的不用修改。
其中:
9001
端口号就是登录酷Q的端口号5001
端口号是HTTP API 插件开放的端口,这个不用管。如果需要启用多个酷Q,保证这个端口号和容器名称cqhttp-test
不重复即可
启动之后,打开127.0.0.1:9001
,如果部署到Linux服务器上面就是ip地址:9001
打开页面之后,会要求输入密码,密码默认是MAX8char
。进入之后就是一个类似QQ登录界面,输入账号密码即可。(第一次登录可能要输入验证码)
此时,酷Q其实就是以一个安卓手机的身份登录了你的QQ,并接管了你的所有消息处理。「CoolQ HTTP API 插件」同时也在开放接口供其他插件进行调用。
接下来,我们需要使用nonebot 模块,使用Python代码接管QQ消息的接收和发送。
在coolq/data/app/io.github.richardchien.coolqhttpapi/config/
里面有<你的登录的QQ号>.json 文件,打开,并修改(如果没有则增加)三个变量为对应的值
{
"ws_reverse_api_url": "ws://127.0.0.1:9999/ws/api/",
"ws_reverse_event_url": "ws://127.0.0.1:9999/ws/event/",
"use_ws_reverse": true
}
!> 如果docker部署电脑上的,把 127.0.0.1
改成host.docker.internal
!> 如果docker是部署在Linux服务器上的,把127.0.0.1
改成172.17.0.1
这个操作就是让「CoolQ HTTP API 插件」把接收信息和发送的信息借给noneboot 模块来接管。
所以,开始通过noneboot模块,使用Python开发吧。
可以用pycharm ide,当然也可以直接新建一个文件夹,使用命令行启用。
我们直接用命令行来启动。
cd ~/Document
mkdir qqboot_test
touch boot.py
cd qqboot_test & mkdir plugin
第一条指令cd
切换到指定目录,后面的指令,你可以完全一样。
打开boot.py,我们复制粘贴下面的代码:
import nonebot
from os import path
if __name__ == '__main__':
nonebot.init()
nonebot.load_plugins(
path.join(path.dirname(__file__),'plugins'),
'plugins'
)
nonebot.run(host='127.0.0.1', port=9999)
我们之前用ws://127.0.0.1:9999/ws/api/
接管「CoolQ HTTP API 插件」插件的消息处理。
上面的代码的作用启动noneboot模块,并且绑定到host的指定端口处。
!> 如果是本机电脑运行的boot.py 程序,host填写127.0.0.1
即可
!> 如果是Linux服务器部署的boot.py 程序,host 改成0.0.0.0
上面我们在qqboot_test
项目里面新建了一个plugins
文件夹,并且在boot.py
指明插件文件夹的位置了。
现在在这个插件文件夹创建一个文件吧。
touch user.py
在具体开发之前简单介绍一下noneboot的处理逻辑。
有两种方式:
- noneboot 接收到用户发来的消息(自然语言),通过匹配消息的关键字,执行指定的命令函数。
- noneboot 直接接收命令,然后直接指定命令函数代码
用户发送/文字
的格式表示发送文字
为名称的命令
我们通过第一种方式处理用户自然语言的信息。
比如,当用户发下面的句子
今天天气怎么样?
天气
天气好吗
北京天气
在user.py
文件里面编辑:
@on_natural_language(keywords={'天气'})
async def _(session: NLPSession):
# 返回意图命令,前两个参数必填,分别表示置信度和意图命令名
return IntentCommand(60.0, 'weather')
@on_command('weather', aliases=('天气'))
async def weather(session: CommandSession):
# 从会话状态(session.state)中获取城市名称(city),如果当前不存在,则询问用户
city = session.get('city', prompt='你的城市是')
weather_report = await get_weather(city)
# 向用户发送天气预报
await session.send(weather_report)
async def get_weather(city: str) -> str:
# 这里简单返回一个字符串
return city+"的天气不错"
代码分为三个部分:
- 第一部分是解析自然语言,只要包含
keywords
里面的关键字就会进行对应的命令处理weather
- 第二部分是命令处理函数,
aliases
是别名,意思是通过/[aliases]
这种方式就可以直接执行命令函数 - 第三部分是异步请求返回天气预报,这个正是noneBoot的一个特色。
最后就是启动这个项目即可:
python3 boot.py
这个命令启动之后,你会看到console输出中有酷Q接管的所有信息输出。
以上就是一个简单的QQ聊天机器人的开发以及部署。
把机器人部署到服务器的docker上面,如果愿意可以有很多的创意,比如夜晚时间接收到任何信息都会自动回复“夜晚休息,上线后处理”
但唯一可能的问题是docker中启动酷Q后,手机上不能再次登录相同的QQ号了。
祝使用愉快~
26 条评论
大佬,请问一下,我到这一步,一直黑屏
打开页面之后,会要求输入密码,密码默认是MAX8char。进入之后就是一个类似QQ登录界面,输入账号密码即可。(第一次登录可能要输入验证码)OωO
运行 boot.py 一直报这个错。知道怎么解决么
大佬威武,搞得我都感觉快要看懂了
我感觉就是,我用的还是那个docker上部署的东西,我自己的py项目根本就没有成功运行
请问一下,为啥我总是一登陆qq,就显示各种的websocket重连
看看 端口号和coolqhttpapi插件配置文件里面是不是一致的,本篇文章里面的端口号是9999
noneboot 的boot 启动端也必须是9999
安装酷Q+http插件集成镜像的时候报错 Get https://auth.docker.io/token?scope=repository%3Arichardchien%2Fcqhttp%3Apull&service=registry.docker.io: net/http: request canceled (Client.Timeout exceeded while awaiting headers)
看样子是网络问题 开代理试试
还有什么好用的QQ机器人推荐?
大佬你好,可以问问你是做那方面的开发的吗?一看你的网站我就对我的程序员之路没了信心⌇●﹏●⌇——我主要学的java
现在读研以后开发方向还不知道呢
假装能看懂
我就是从E语言入坑的。
你好,mac 启动时配置用的是host.docker.internal可以连接,但是centos7 部署时安装你的配置后python 启动仍然无法连接到coolq http api,请问大佬你那边亲测config 用172.17.0.1,py启动用0.0.0.0可以代理成功吗
要连接到coolqhttp需要通过ws协议与外部写好的python程序通信,创建容器默认采用网桥模式,命令docker network inspect bridge查看容器网络配置信息,我是172.17.0.2,一般172.17.0.1是docker0的网关的ip。直接用主机的公网ip应该也可以,但如果是容器之间通信就不行了
刚刚我把linux 的config 配置ip换成本机的公网ipv4地址后就可以了。
所以大佬中这句话【如果docker是部署在Linux服务器上的,把127.0.0.1改成172.17.0.1】172.17.0.1应该换成本机的公网ip吧୧(๑•̀⌄•́๑)૭
我是填 172.17.0.1 就可以了
我公网ip和172.17.0.1都不行,一直在提示
2020-05-28 03:10:41.983] [W] [反向WS] 反向 WebSocket(Event)客户端连接失败或异常断开,将在 3000 毫秒后尝试重连
[2020-05-28 03:10:44.979] [I] [反向WS] 开启反向 WebSocket 客户端(API)成功,开始连接 ws://172.17.0.1:9999/ws/api/
[2020-05-28 03:10:44.980] [W] [反向WS] 反向 WebSocket(API)客户端连接失败或异常断开,将在 3000 毫秒后尝试重连
膜拜大佬
这个很简单,不是大佬
大佬只能膜拜~