QQ机器人插件四:每日一图
1. 导入需要使用的包
import nonebot
from nonebot import on_keyword # 事件响应器函数
from nonebot.typing import T_State #bot使用的对象和字典
from nonebot.adapters.onebot.v11 import Bot,Message,MessageSegment # #Message是使用cq码的必要函数
import requests
import json # 处理api返回的json数据
2. 事件响应器
想要机器人能识别消息的关键词,然后做出相应的相应,这里就需要注册一个事件响应器。本文使用的时间响应器的辅助函数是on_keyword
。
on_keyword: 创建消息关键词匹配事件响应器。
__plugin_name__ = 'bing_picture'
__plugin_usage__ = '用法: 每日一图,输入关键词返回一张随机图片。'
picture = on_keyword({'图片','每日一图'})
3. 事件处理流程
如下所示,我们使用picture
响应器的handle
装饰器装饰了一个函数handle_receive
。handle()
是处理事件的主体部分,是事件处理的起点。
@picture.handle()
然后创建一个异步函数:
async def handle_receive(bot:Bot,state: T_State):
然后创建一个获取图片的函数:
async def get_picture():
url = 'https://api.vvhan.com/api/bing?type=json&rand=sj'
res = requests.get(url)
result = json.loads(res.text)
img = result['data']['url'] #提取图片地址
访问api并获取返回的json值,并转换为可读的格式。
{
'success': True,
'data':
{
'date': '20201118',
'title': '被北极光映衬出轮廓的因努伊特石堆,加拿大西北地区 (© Mark Duffy/Alamy)',
'url': 'https://www.bing.com/th?id=OHR.InukshukLights_ZH-CN0756858983_1920x1200.jpg'
}
}
这时,图片的网址已经提前获取并存入变量img
中,然而发送图片需要一种特殊的格式(CQ码
)。
-
CQ码
示例: [CQ:image,file=http://baidu.com/1.jpg,type=show,id=40004]
注意 图片最大不能超过30MB PNG格式不会被压缩, JPG可能不会二次压缩, GIF非动图转成PNG GIF动图原样发送(总帧数最大300张, 超过无法发出, 无论循不循环)
4. 事件响应器操作
这里使用send
操作来发送信息,向用户回复一条消息。回复的方式或途径由协议适配器自行实现。
可以是 str
、Message
、MessageSegment
或 MessageTemplate
。
这个操作等同于使用 bot.send(event, message, **kwargs)
但不需要自行传入 event
。
await picture.send(MessageSegment.image(pic))
5. 完整代码
import nonebot
from nonebot import on_keyword # 事件响应器函数
from nonebot.typing import T_State #bot使用的对象和字典
from nonebot.adapters.onebot.v11 import Bot,Message,MessageSegment # #Message是使用cq码的必要函数
import requests
import json # 处理api返回的json数据
__plugin_name__ = 'bing_picture'
__plugin_usage__ = '用法: 每日一图,输入关键词返回一张随机图片。'
picture = on_keyword({'图片','每日一图'})
@picture.handle()
async def handle_receive(bot:Bot,state: T_State):
pic = await get_picture()
await picture.send(MessageSegment.image(pic))
async def get_picture():
url = 'https://api.vvhan.com/api/bing?type=json&rand=sj'
res = requests.get(url)
result = json.loads(res.text)
img = result['data']['url']
image = f"[CQ:image,file={img},type=show,id=40000]"
return img