基本框架

(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)相关推荐

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

    基本框架 (1) 酷Q:目前最常用的QQ机器人软件(尤其是在smartQQ失效以后). (2) 酷Q HTTP插件:通过HTTP对酷Q的事件进行上报以及接收HTTP请求来调用酷Q的DLL接口,从而可以 ...

  2. python是商业组织吗_基于Python的电子商务系统的弹性架构与思考

    DOI:10. 19392 / j. cnki. 1671-7341. 201815075 基于 Python 的电子商务系统的弹性架构与思考 谢钟扬 湖南软件职业学院 湖南湘潭 411100 摘 要 ...

  3. Python之PIL之绘图:基于Python的PIL库绘制各种图形、添加文字等

    Python之PIL之绘图:基于Python的PIL库绘制各种图形.添加文字等 目录 一.绘制各种形状各种案例 1.绘制矩形 2.绘制圆形.弧线形

  4. 基于python爬虫技术的应用_基于Python爬虫技术的应用

    办公自动化杂志 一.引言 本文主要是对 Python 爬虫技术进行阐述,基于 python 的爬虫与其他语言相比的有很多优势.通过爬去某个网站的所有新闻这个案例,来进一步阐释 Python 爬虫技术的 ...

  5. 《Python与硬件项目案例》— 基于Python的口罩检测与指纹识别签到系统设计

    <Python与硬件项目案例>- 基于Python的口罩检测与指纹识别签到系统设计 目录 <Python与硬件项目案例>- 基于Python的口罩检测与指纹识别签到系统设计 1 ...

  6. 《Python与硬件项目案例》— 基于Python与指纹模块AS608的指纹识别签到考勤系统(下篇)(期末大作业、课程设计、毕业设计、结课项目)

    目录 <Python与硬件项目案例>- 基于Python与指纹模块AS608的指纹识别签到考勤系统(下篇) 概述 参考代码 <Python与硬件项目案例>- 基于Python与 ...

  7. 【0基础QQ机器人开发】基于go-cqhttp的QQ机器人开发教程,仅供自学

    文章目录 一.本文目的: 二.实现历程: 三.开发过程 1.准备工作 1.cq-http的下载地址:[Releases · Mrs4s/go-cqhttp (github.com)](https:// ...

  8. 「Java」基于Mirai的qq机器人开发踩坑笔记(其一)

    目录 0. 前置操作 I. 安装MCL II. MCL自动登录配置 III. 安装IDEA插件 1. 新建Mirai项目 2. 编写主类 3. 添加外部依赖 4. IDEA运行 5. 插件打包 6. ...

  9. 「Java」基于Mirai的qq机器人开发踩坑笔记(其二)

    目录 0. 配置机器人 1. onLoad方法 2. onEnable方法 3. 消息属性 4. 消息监听 I. 好友消息 II. 群聊消息 III. 无差别消息 5. 发送消息 I. 文本消息 II ...

最新文章

  1. mysql中char与varchar的区别分析(补充一句,int和integer没区别)
  2. 超级计算机预测2月有雪寒潮,神预测!中国超级计算提前半个月预测了美国的寒潮...
  3. 对函数指针与typedef的理解:typedef void (*sighandler_t)(int)
  4. mysql 去重_mysql 去重留一
  5. flink的TimeCharacteristic(转载)
  6. Asp.Net Core 中IdentityServer4 授权中心之应用实战
  7. java定时任务详解
  8. 8分钟搞清波士顿动力进化史 | 视频
  9. linux如何删除行首的空格
  10. shiro框架学习(一)
  11. Centos-显示文件类型-file
  12. 鹰眼跟踪、限流降级,EDAS的微服务解决之道
  13. linux tree命令,Linux tree命令实例详解
  14. PS修改图片局部颜色
  15. 好文摘记——施一公教授:如何提高专业英语阅读水平
  16. 关于 Python2 和 Python3 中的 Unicode 问题。
  17. JavaScript-HTML中的JavaScript
  18. 使用CSS去除 去掉超链接的下划线方法
  19. Baumer工业相机VCX系列相机硬件触发流程和设置
  20. python中文文本分析_python简单的分析文本

热门文章

  1. NetSuite:企业中最常见的云ERP运维问题(下)
  2. EMC设计-接口电路
  3. iOS大小写字符串的转化
  4. 教你如何从Google Map爬数据(切片)
  5. Android 高级控件(七)——RecyclerView的方方面面
  6. go --- 正则匹配根域名
  7. 上海桂伦为您呈现 科技发展从倍加福传感器起航!
  8. CentOS 网口bond
  9. 论文笔记 - Q-Leach:用于无线传感器网络的基于节能群集的路由协议
  10. Symbian Crabide c++ 调试小窍门