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数据
想要机器人能识别消息的关键词,然后做出相应的相应,这里就需要注册一个事件响应器。本文使用的时间响应器的辅助函数是on_keyword
。
on_keyword: 创建消息关键词匹配事件响应器。
__plugin_name__ = 'music'
__plugin_usage__ = '用法: 音乐,返回随机一首音乐。'
music = on_keyword({"音乐", "网易云","music","听歌"})
如下所示,我们使用music
响应器的handle
装饰器装饰了一个函数handle_song
。handle()
是处理事件的主体部分,是事件处理的起点。
@music.handle()
然后创建一个异步函数:
async def handle_song(state: T_State):
然后创建一个获取音乐的函数:
async def get_song():
url = 'https://api.vvhan.com/api/rand.music?type=json&sort=热歌榜'
res = requests.get(url)
result = json.loads(res.text)
mp3 = result['info']['mp3url']
#song = f"[CQ:record,file={mp3}]"
return mp3
访问api并获取返回的json值,并转换为可读的格式。
{
'success': True,
'sort': '热歌榜',
'info':
{
'id': 419375250,
'name': '月亮之矢',
'auther': '孤矢',
'picUrl': 'https://p4.music.126.net/i7gE7HVrqcAO_0Y--Znc6Q==/17812088370080434.jpg',
'mp3url': 'https://m801.music.126.net/20220810105659/a1e6bfdcc38aaebee6d8aaf617c3c606/jdymusic/obj/wo3DlMOGwrbDjj7DisKw/14096495888/7577/6ddd/2618/7b8330b37a6b9791f0b88f4ba68972e8.mp3'
}
}
这里使用send
操作来发送信息,向用户回复一条消息。回复的方式或途径由协议适配器自行实现。
可以是 str
、Message
、MessageSegment
或 MessageTemplate
。
这个操作等同于使用 bot.send(event, message, **kwargs)
但不需要自行传入 event
。
await music.send(MessageSegment.record(song))
不安装`ffmpeg`是无法成功发出语音视频等类型的消息。
ffmpeg
的安装包首先,进入ffmpeg
的官网Download FFmpeg,这里以Windows为例。
进入bin
目录,可以看见三个这样的文件:
点击搜索栏,搜索高级系统设置。
确定后,进入环境变量-》系统环境变量,选择path
,点击编辑-》新建,把第一步bin的文件路径
粘贴进去即可。
按win + R
打开运行,输入cmd
打开命令行窗口。
输入命令ffmpeg –version
,有输出信息,则安装成功。
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__ = 'music'
__plugin_usage__ = '用法: 音乐,返回随机一首音乐。'
music = on_keyword({"音乐", "网易云","music","听歌"})
@music.handle()
async def handle_song(state: T_State):
song = await get_song()
await music.send(MessageSegment.record(song))
# 在这里编写获取具体音乐的函数
async def get_song():
url = 'https://api.vvhan.com/api/rand.music?type=json&sort=热歌榜'
res = requests.get(url)
result = json.loads(res.text)
mp3 = result['info']['mp3url']
return mp3