Nonebot QQ机器人插件四:每日一图

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_receivehandle()是处理事件的主体部分,是事件处理的起点。

@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]
    

    Nonebot QQ机器人插件四:每日一图_第1张图片

    Nonebot QQ机器人插件四:每日一图_第2张图片

    Nonebot QQ机器人插件四:每日一图_第3张图片

    注意
    图片最大不能超过30MB
    PNG格式不会被压缩, JPG可能不会二次压缩, GIF非动图转成PNG
    GIF动图原样发送(总帧数最大300张, 超过无法发出, 无论循不循环)
    

4. 事件响应器操作

这里使用send操作来发送信息,向用户回复一条消息。回复的方式或途径由协议适配器自行实现。

可以是 strMessageMessageSegmentMessageTemplate

这个操作等同于使用 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

6. 结果展示

Nonebot QQ机器人插件四:每日一图_第4张图片

你可能感兴趣的:(qq机器人,python,json,爬虫)