[極簡(jiǎn)教程]nonebot入門插件編寫

這是一個(gè)極簡(jiǎn)教程,如有不正確請(qǐng)?jiān)谠u(píng)論區(qū)中指出,歡迎大佬指教
參考文檔聲明:
基于 Python asyncio 編寫
1.關(guān)鍵詞應(yīng)答,示例代碼
from nonebot import?on_keyword
from nonebot.adapters.onebot.v11 import Message
word=on_keyword({"x"})
@word.handle()
async def _():
await word.finish(Message("y"))
這段示例代碼是當(dāng)bot接收到"x"時(shí),返回"y"
紅色的是響應(yīng)器的函數(shù)可替換為:
on: 創(chuàng)建任何類型的事件響應(yīng)器。
on_metaevent: 創(chuàng)建元事件響應(yīng)器。
on_message: 創(chuàng)建消息事件響應(yīng)器。
on_request: 創(chuàng)建請(qǐng)求事件響應(yīng)器。
on_notice: 創(chuàng)建通知事件響應(yīng)器。
on_startswith: 創(chuàng)建消息開頭匹配事件響應(yīng)器。
on_endswith: 創(chuàng)建消息結(jié)尾匹配事件響應(yīng)器。
on_fullmatch: 創(chuàng)建消息完全匹配事件響應(yīng)器。
on_keyword: 創(chuàng)建消息關(guān)鍵詞匹配事件響應(yīng)器。
on_command: 創(chuàng)建命令消息事件響應(yīng)器。
on_shell_command: 創(chuàng)建 ? ? shell 命令消息事件響應(yīng)器。
on_regex: 創(chuàng)建正則表達(dá)式匹配事件響應(yīng)器。
CommandGroup: 創(chuàng)建具有共同命令名稱前綴的命令組。
MatcherGroup: 創(chuàng)建具有共同參數(shù)的響應(yīng)器組。
響應(yīng)器用于接收關(guān)鍵詞如on_message是接收所有消息,on_command 接收的消息是需要帶”/”的
藍(lán)色的在寫代碼時(shí)可自定義,但每個(gè)都要相同如:
a=on_keyword({"x"})
@a.handle()
async def _():
await a.finish(Message("y"))
rule的用法
from nonebot import on_keyword
from nonebot.rule import to_me
word=on_keyword({"x"},rule=to_me())
rule是判斷信息類型如
rule=to_me 是檢測(cè)信息是否at bot
checker
from nonebot import on_keyword
from nonebot.adapters.onebot.v11 import Event
def _checker(event: Event) -> bool :
? ?return event.message_type=="group"
word=on_keyword({"你是誰(shuí)"},rule=_checker)
事件響應(yīng)器的匹配規(guī)則是一個(gè)?Rule
?對(duì)象,它是一系列?checker
?的集合,當(dāng)所有的?checker
?都返回?True
?時(shí),才會(huì)觸發(fā)該響應(yīng)器。
優(yōu)先級(jí) priority
事件響應(yīng)器的優(yōu)先級(jí)代表事件響應(yīng)器的執(zhí)行順序
同一優(yōu)先級(jí)的事件響應(yīng)器會(huì)同時(shí)執(zhí)行,優(yōu)先級(jí)數(shù)字越小越先響應(yīng)!優(yōu)先級(jí)請(qǐng)從 1
開始排序!
word=on_keyword({"你是誰(shuí)"},priority=5)
阻斷 block
當(dāng)有任意事件響應(yīng)器發(fā)出了阻止事件傳遞信號(hào)時(shí),該事件將不再會(huì)傳遞給下一優(yōu)先級(jí),直接結(jié)束處理。
NoneBot 內(nèi)置的事件響應(yīng)器中,所有非 command
規(guī)則的 message
類型的事件響應(yīng)器都會(huì)阻斷事件傳遞,其他則不會(huì)。
在部分情況中,可以使用 matcher.stop_propagation()
方法動(dòng)態(tài)阻止事件傳播,該方法需要 handler
在參數(shù)中獲取 matcher
實(shí)例后調(diào)用方法。
foo = on_request()
@foo.handle()async def handle(matcher: Matcher): ? ?matcher.stop_propagation()
有效期 temp
/expire_time
temp
屬性:配置事件響應(yīng)器在下一次響應(yīng)之后移除。
expire_time
屬性:配置事件響應(yīng)器在指定時(shí)間之后移除。
阻斷 block
當(dāng)有任意事件響應(yīng)器發(fā)出了阻止事件傳遞信號(hào)時(shí),該事件將不再會(huì)傳遞給下一優(yōu)先級(jí),直接結(jié)束處理。
NoneBot 內(nèi)置的事件響應(yīng)器中,所有非 command
規(guī)則的 message
類型的事件響應(yīng)器都會(huì)阻斷事件傳遞,其他則不會(huì)。
在部分情況中,可以使用 matcher.stop_propagation()
方法動(dòng)態(tài)阻止事件傳播,該方法需要 handler
在參數(shù)中獲取 matcher
實(shí)例后調(diào)用方法。
foo = on_request()
@foo.handle()async def handle(matcher: Matcher): ? ?matcher.stop_propagation()
CQ碼https://docs.go-cqhttp.org/cqcode/和MessageSegment
CQ 碼是指 CQ 中特殊消息類型的文本格式, 這是它的基本語(yǔ)法:
[CQ:類型,參數(shù)=值,參數(shù)=值]
1
在 QQ 中, 一個(gè)消息由多個(gè)部分構(gòu)成, 例如一段文本, 一個(gè)圖片, at 某人的一個(gè)部分. CQ 中定義了與這些消息相符的 CQ 碼, 以方便用戶使用.
例如, 下面是由一個(gè) at 部分和一個(gè)文本部分構(gòu)成的合法 CQ 消息串
[CQ:at,qq=114514]早上好啊
1
例如qq號(hào)為114514的人昵稱為"小明", 那么上述消息串在QQ中的渲染是這樣的:
@小明 早上好啊
CQ碼有多種功能如:發(fā)送語(yǔ)音,戳一戳等
但容易被風(fēng)控,不建議使用
MessageSegment
MessageSegment的使用方法實(shí)際上非常簡(jiǎn)單,基本的用法就是 MessageSegment.xxx()
,并且正如上文所說,MessageSegment本質(zhì)上是Message類,所以我們不需要用 Message()
對(duì)其進(jìn)行轉(zhuǎn)義。 首先我們先輸入 MessageSegment.
然后查看編輯器的提示或轉(zhuǎn)到源碼,就能看到MessageSegment提供的方法了:

我們這里用image進(jìn)行舉例:
from nonebot.adapters.onebot.v11 import MessageSegment
setu001 = MessageSegment.image('file:///D:/learning_materials/setu/001.jpg')
這樣setu001就是一個(gè)Message類的澀圖了,理論上和 Message('[CQ:image,file=file:///D:/learning_materials/setu/001.jpg]')
是等效的。
MessageSegment由于功能很多,因此不在此一一演示了,想要用好MessageSegment,需要需要多加利用編輯器的自動(dòng)補(bǔ)全和語(yǔ)法提示,這樣就不必翻源碼即可使用了。
Call _api?https://docs.go-cqhttp.org/api/
使用方法
首先我們需要知道我們對(duì)接的客戶端有什么樣的api,這樣我們才能對(duì)其發(fā)起請(qǐng)求。我們使用的
中對(duì)API有詳細(xì)的介紹。call_api的寫法目前有兩種,bot.call_api('xxx', **{key:value})
和bot.xxx(key=value)
兩種僅寫法不同,實(shí)質(zhì)并無(wú)影響,可根據(jù)自身喜好進(jìn)行調(diào)整。
這里我們以“獲取群信息”為例進(jìn)行寫法一的演示。
我們需要提供兩個(gè)數(shù)據(jù),其中no_cache為選填字段(是否為選填字段需要自行結(jié)合描述和實(shí)踐進(jìn)行判斷),group_id為必填字段。
from nonebot.adapters.onebot.v11 import Bot
from nonebot import on_message
test = on_command('test')
@test.handle()
async def _(bot: Bot):
? ?# call_api的寫法一
? ?data = await bot.call_api('get_group_info',**{
? ? ? ?'group_id' : 123456
? ?})
這樣我們就獲得了data這個(gè)json格式的返回值,然后進(jìn)行簡(jiǎn)單的轉(zhuǎn)義就可以讀取了。 這里我們?cè)傺菔疽幌潞汀鞍l(fā)送消息”,并使用第二種方法進(jìn)行演示。
from nonebot.adapters.onebot.v11 import Bot, Event
from nonebot import on_message
import ast
test = on_command('test')
@test.handle()
async def _(bot: Bot, event: Event):
? ?# call_api的寫法一
? ?data = await bot.call_api('get_group_info',**{
? ? ? ?'group_id' : 123456
? ?})
? ?# 對(duì)json進(jìn)行轉(zhuǎn)義
? ?data = ast.literal_eval(str(data))
? ?msg = f"群號(hào) ?:{data['group_id']}\
? ? ? ? ?\n群名稱:{data['group_name']}\
? ? ? ? ?\n成員數(shù):{data['member_count']}"
? ?# call_api的寫法二
? ?await bot.send(
? ? ? ?event ? = event,
? ? ? ?message = msg
? ?)
? ?# 不過,這里更推薦直接用響應(yīng)器的send方法
? ?# await test.send(msg)