python开发酷q插件gui_基于python和酷Q的QQ机器人开发实践(1)
基本框架
(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)[0].split('"')[3] #用正则表达式提取翻译后的语句
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
# on_command 装饰器将函数声明为一个命令处理器
# 这里 weather 为命令的名字,同时允许使用别名「天气」「天气预报」「查天气」
@on_command('weather', aliases=('天气', '天气预报', '查天气'))
async def weather(session: CommandSession):
# 从会话状态(session.state)中获取城市名称(city),如果当前不存在,则询问用户
city = session.get('city', prompt='你想查询哪个城市的天气呢?')
# 获取城市的天气预报
weather_report = await get_weather_of_city(city)
# 向用户发送天气预报
await session.send(weather_report)
# weather.args_parser 装饰器将函数声明为 weather 命令的参数解析器
# 命令解析器用于将用户输入的参数解析成命令真正需要的数据
@weather.args_parser
async def _(session: CommandSession):
# 去掉消息首尾的空白符
stripped_arg = session.current_arg_text.strip()
if session.is_first_run:
# 该命令第一次运行(第一次进入命令会话)
if stripped_arg:
# 第一次运行参数不为空,意味着用户直接将城市名跟在命令名后面,作为参数传入
# 例如用户可能发送了:天气 南京
session.state['city'] = stripped_arg
return
if not stripped_arg:
# 用户没有发送有效的城市名称(而是发送了空白字符),则提示重新输入
# 这里 session.pause() 将会发送消息并暂停当前会话(该行后面的代码不会被运行)
session.pause('要查询的城市名称不能为空呢,请重新输入')
# 如果当前正在向用户询问更多信息(例如本例中的要查询的城市),且用户输入有效,则放入会话状态
session.state[session.current_key] = stripped_arg
async def get_weather_of_city(city: str) -> str:
return get_weather(city)
import requests
def get_weather(city):
#这里可以自行申请免费的天气api,将我的appid和密码换成自己的即可
url = 'https://www.tianqiapi.com/free/day?appid=????&appsecret=????&city=' + city
res = requests.get(url)
if 'errcode' in res.json().keys():
return '该城市不存在!'
else:
result= '今日'+city+'的天气是'+res.json()['wea']+',实时温度'+res.json()['tem']+'℃,'+res.json()['win']+res.json()['win_speed']+',空气指数:'+res.json()['air']
return result
这是官方文档的一个示例,不过官方文档中没有补充天气api部分,我申请了一个免费了api(https://www.tianqiapi.com/)
我们来看看效果
结语
这一阶段的学习就到这里啦,相信大家应该初步了解了如何制作简易的QQ机器人。后期的博客将会涉及接受更为复杂的指令的只能机器人。
原文链接:https://blog.csdn.net/weixin_42465955/article/details/105929376
python开发酷q插件gui_基于python和酷Q的QQ机器人开发实践(1)相关推荐
- python开发酷q插件_基于python和酷Q的QQ机器人开发实践(1)
基本框架 (1) 酷Q:目前最常用的QQ机器人软件(尤其是在smartQQ失效以后). (2) 酷Q HTTP插件:通过HTTP对酷Q的事件进行上报以及接收HTTP请求来调用酷Q的DLL接口,从而可以 ...
- python是商业组织吗_基于Python的电子商务系统的弹性架构与思考
DOI:10. 19392 / j. cnki. 1671-7341. 201815075 基于 Python 的电子商务系统的弹性架构与思考 谢钟扬 湖南软件职业学院 湖南湘潭 411100 摘 要 ...
- Python之PIL之绘图:基于Python的PIL库绘制各种图形、添加文字等
Python之PIL之绘图:基于Python的PIL库绘制各种图形.添加文字等 目录 一.绘制各种形状各种案例 1.绘制矩形 2.绘制圆形.弧线形
- 基于python爬虫技术的应用_基于Python爬虫技术的应用
办公自动化杂志 一.引言 本文主要是对 Python 爬虫技术进行阐述,基于 python 的爬虫与其他语言相比的有很多优势.通过爬去某个网站的所有新闻这个案例,来进一步阐释 Python 爬虫技术的 ...
- 《Python与硬件项目案例》— 基于Python的口罩检测与指纹识别签到系统设计
<Python与硬件项目案例>- 基于Python的口罩检测与指纹识别签到系统设计 目录 <Python与硬件项目案例>- 基于Python的口罩检测与指纹识别签到系统设计 1 ...
- 《Python与硬件项目案例》— 基于Python与指纹模块AS608的指纹识别签到考勤系统(下篇)(期末大作业、课程设计、毕业设计、结课项目)
目录 <Python与硬件项目案例>- 基于Python与指纹模块AS608的指纹识别签到考勤系统(下篇) 概述 参考代码 <Python与硬件项目案例>- 基于Python与 ...
- 【0基础QQ机器人开发】基于go-cqhttp的QQ机器人开发教程,仅供自学
文章目录 一.本文目的: 二.实现历程: 三.开发过程 1.准备工作 1.cq-http的下载地址:[Releases · Mrs4s/go-cqhttp (github.com)](https:// ...
- 「Java」基于Mirai的qq机器人开发踩坑笔记(其一)
目录 0. 前置操作 I. 安装MCL II. MCL自动登录配置 III. 安装IDEA插件 1. 新建Mirai项目 2. 编写主类 3. 添加外部依赖 4. IDEA运行 5. 插件打包 6. ...
- 「Java」基于Mirai的qq机器人开发踩坑笔记(其二)
目录 0. 配置机器人 1. onLoad方法 2. onEnable方法 3. 消息属性 4. 消息监听 I. 好友消息 II. 群聊消息 III. 无差别消息 5. 发送消息 I. 文本消息 II ...
最新文章
- mysql中char与varchar的区别分析(补充一句,int和integer没区别)
- 超级计算机预测2月有雪寒潮,神预测!中国超级计算提前半个月预测了美国的寒潮...
- 对函数指针与typedef的理解:typedef void (*sighandler_t)(int)
- mysql 去重_mysql 去重留一
- flink的TimeCharacteristic(转载)
- Asp.Net Core 中IdentityServer4 授权中心之应用实战
- java定时任务详解
- 8分钟搞清波士顿动力进化史 | 视频
- linux如何删除行首的空格
- shiro框架学习(一)
- Centos-显示文件类型-file
- 鹰眼跟踪、限流降级,EDAS的微服务解决之道
- linux tree命令,Linux tree命令实例详解
- PS修改图片局部颜色
- 好文摘记——施一公教授:如何提高专业英语阅读水平
- 关于 Python2 和 Python3 中的 Unicode 问题。
- JavaScript-HTML中的JavaScript
- 使用CSS去除 去掉超链接的下划线方法
- Baumer工业相机VCX系列相机硬件触发流程和设置
- python中文文本分析_python简单的分析文本