您好,欢迎访问本站博客!登录后台查看权限
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧
  • 网站所有资源均来自网络,如有侵权请联系站长删除!

python开发酷q插件_基于python和酷Q的QQ机器人开发实践(1)

CF黑号 admin 2025-09-17 16:04 2 次浏览 0个评论
网站分享代码

基本框架

(1) 酷Q:目前最常用的QQ机器人软件(尤其是在smartQQ失效以后)。

(2) 酷Q HTTP插件:通过HTTP对酷Q的事件进行上报以及接收HTTP请求来调用酷Q的DLL接口,从而可以使用其它语言编写酷Q插件。

(3) nonebot:基于酷Q的Python异步QQ机器人框架。

准备工作

1.安装酷Q

酷Q官网最近好像不能注册了,我在网上找了份资源,解压后打开CQA.exe,输入账号密码即可。注意:务必用小号作为机器人账号!

可以在应用-应用管理中查看并管理所有的机器人插件,在日志中查看机器人是否有正确做出回应。酷Q的这一部分是比较简单的,大家基本看看就知道了。

2.安装酷Q HTTP插件

这里同样用的是网盘资源,github上的下载确实有点慢(https://github.com/richardchien/coolq-http-api/releases),这里可能不是最新版(最新版请访问上述github链接),但是也无伤大雅。

你将会下载这样的文件io.github.richardchien.coolqhttpapi.cpk,将这个cpk文件放到酷Q的插件目录下,插件目录一般为“CQA.exe文件所在目录/app”,如果你不确定,也可以打开酷Q软件后右键悬浮窗:应用-应用目录。

在酷Q中点击重载应用,HTTP插件便会启动,会弹出下图这样的窗口

接下来要完成初始化设置,首次启用HTTP插件会生成一个默认配置文件,在“CQA.exe文件所在目/data/app/io.github.richardchien.coolqhttpapi/config”文件夹下会有这样一个json文件,名字是你登陆的QQ号。我们要对这个配置文件进行修改,修改下图中的三行,修改完成后重载应用。

"ws_reverse_api_url": "ws://127.0.0.1:8080/ws/api/",

"ws_reverse_event_url": "ws://127.0.0.1:8080/ws/event/",

"use_ws_reverse": true,

如果在这一块遇到问题,可以访问CQHTTP 插件的官方文档:https://cqhttp.cc/docs/4.15/

3.安装nonebot框架

这个是最好搞定的,你只需要在你的python环境中安装nonebot模块即可

pip install nonebot

建议大家在动手实践之前一定要详细看一遍!

正式开始!

1.“Hello World”

我们先来看一个最最基础,也是官方文档中给出的最小实例。

首先创建一个myRobot文件夹,建议放在酷Q的工作路径下(其实放哪无所谓)。我们创建一个python文件‘bot.py’

#bot.py

import nonebot

if __name__ == '__main__':

nonebot.init()

nonebot.load_builtin_plugins()

nonebot.run(host='127.0.0.1', port=8080)

运行之后我们在控制台可以看到这样的日志,表明已经设置成功

我们可以给这个机器人QQ账号发送一个基本的内置指令“echo”,这也是基础案例包含的唯一指令(其实还有say指令,但涉及到设置超级用户,具体可以参见说明文档),意思是让机器人发送后面的文字,比如我们输入“/echo hello world”。

我们可以在控制台和酷Q的日志看到如下log

那么echo函数是怎样定义的呢?我们来看一下源码

@on_command('echo')

async def echo(session: CommandSession):

await session.send(session.state.get('message') or session.current_arg)

@on_command()是一个命令识别的装饰器,其中的参数包括name(指令的名称),aliases(指令的别名),permission(用户权限设置),only_to_me(在群聊中唤醒机器人是否需要@,默认为True)等等,这里只定义了指令的名称,当然我们也可以定义如下,这样我们可以使用“显示”或者“打印”命令来唤醒机器人,并且在群聊中不需要@机器人。

@on_command('echo', aliases=('显示','打印',), only_to_me = False)

装饰器下面是一个异步的echo函数(关于异步编程可以参见异步IO),这个函数调用session.send()函数,直接把参数中的消息内容原样发送。

2.翻译功能

在上面我们学习了只包含基础echo指令的机器人,接下来我们给它添砖加瓦,添加一些新的功能。

首先我们在上述myRobot文件夹下创建配置文件‘config.py’,主要内容是SUPERUSERS和COMMAND_START,前者定义超级用户的QQ号,拥有更多权限;后者是设置指令的开头,这里设置了五个开头,拿之前的‘echo’指令为例,现在用户可以使用‘echo’,‘/echo’,‘!echo’,‘/echo’,‘!echo’来唤醒机器人(之前只能用‘/echo’)。

from nonebot.default_config import *

SUPERUSERS = {你想设置的超级用户QQ号}#1

COMMAND_START = {'', '/', '!', '/', '!'}

#HOST = '0.0.0.0'

#PORT = 8080

接着我们在myRobot文件夹新建文件夹‘plugins’,用来放置新的功能python文件,接着在‘plugins文件夹下新建‘translate.py’。

from nonebot import on_command, CommandSession

import requests #爬虫库

import re #正则表达式处理

@on_command('translate', aliases=('翻译','中译英')) #定义翻译指令及别名

async def translate(session: CommandSession):

message = session.get('message', prompt='您想翻译成英文的语句是?') #获取待翻译的语句

translate_send = await get_translate(message) #将待翻译的语句传给翻译函数

await session.send(translate_send) #发送翻译后的语句

async def get_translate(message): #异步的翻译函数

translate_sentence = get_content(message)

return translate_sentence

def get_content(message): #翻译功能

url = 'http://fanyi.youdao.com/translate?&doctype=json&type=AUTO&i='+message #有道的免费api

res = requests.get(url) #爬取json格式的网页

text = res.text

result = re.findall('"tgt":.*"',text).split('"') #用正则表达式提取翻译后的语句

return result

@translate.args_parser #translate命令的参数解析器

async def _(session: CommandSession):

stripped_arg = session.current_arg_text.strip() #去除首尾空白符

if session.is_first_run: #如果是第一次运行

if stripped_arg: #如果用户的待翻译语句跟在指令后面,则直接传参

session.state

'message'

= stripped_arg

return

if not stripped_arg: #如果用户的待翻译语句不在指令后面,则让他另行输入

session.pause('要翻译的不能为空呢,请重新输入')

#将参数放入会话状态中

session.state

session.current_key

= stripped_arg

这个翻译功能的实现明显要复杂一些了,还会涉及爬虫以及正则表达式知识,具体解释见注释部分。

本翻译功能基于有道的免费api,所以翻译效果不是很好(如果你是做着玩玩是无所谓,商业用途考虑购买专业的api,我不是在打广告!)。大部分这样的api功能都需要爬虫和正则表达式知识/json格式处理知识(大致了解即可)。

接下来我们将重写‘bot.py’,将新的翻译功能添加进去。

import nonebot

import config

from os import path

if __name__ == '__main__':

#加载配置文件

nonebot.init(config)

#加载功能插件(放在plugins文件夹中的python文件)

nonebot.load_plugins(path.join(path.dirname(__file__), 'plugins'), 'plugins')

#nonebot.run()

nonebot.run(host='127.0.0.1', port=8080)

接着我们重新运行‘bot.py’,可以看到以下日志,可以看到plugins.translate已经成功加载(help和weather是我另写的其他插件)。

让我们来做个尝试吧!

3.天气功能

我们在plugins文件夹下接着新建‘weather.py’

from nonebot import on_command, CommandSession