《開源精選》是我們分享Github、Gitee等開源社區中優質項目的欄目,包括技術、學習、實用與各種有趣的內容。本期推薦的是一個跨平臺 Python/ target=_blank class=infotextkey>Python 異步聊天機器人框架——nonebot2。
NoneBot2 是一個現代、跨平臺、可擴展的 Python 聊天機器人框架,它基于 Python 的類型注解和異步特性,能夠為你的需求實現提供便捷靈活的支持。
特性
- 開箱即用:使用 NB-CLI 快速構建屬于你的機器人
- 插件系統:插件化開發,模塊化管理
- 跨平臺支持:支持多種平臺,以及多樣的事件響應方式
- 異步開發:異步優先式開發,提高運行效率
- 依賴注入:簡單清晰的依賴注入系統,內置依賴函數減少用戶代碼
應用案例
- milkice233/efb-qq-slave:基于 ehForwarderBot 框架的 QQ 從端
https://github.com/milkice233/efb-qq-slave
- projectriri/bot-gateway:提供跨聊天平臺的通用機器人 API 的機器人消息網關
https://projectriri.github.io/bot-gateway/
- jqqQQqqqqqq/UnifiedMessageRelay:QQ <-> Telegram Bot Framework & Forwarder
https://github.com/jqqqqqqqqqq/UnifiedMessageRelay
- Mother-Ship/cabbageWeb:基于 JAVA Web 的 osu! 游戲數據查詢機器人
https://github.com/Mother-Ship/cabbageWeb
- spacemeowx2/splatoon2-qqbot:宇宙第一的 Splatoon2 的地圖機器人
https://github.com/spacemeowx2/splatoon2-qqbot
- mrthanlon/SICNUBOT:專為四川師范大學設計用于審核發布消息用的 QQ 機器人
https://github.com/mrthanlon/SICNUBOT
- Bluefissure/FFXIVBOT:基于 Django Channels 的最終幻想 14 游戲數據查詢機器人
https://github.com/Bluefissure/OtterBot
- duan602728596/qqtools:基于 Nwjs 的 QQ 群工具(摩點、口袋 48、微博提醒、入群歡迎、定時喊話、自定義命令和回復信息等)
https://github.com/duan602728596/qqtools
- UltraSoundX/SDFMU-Library:山東第一醫科大圖書館預約機器人
https://github.com/UltraSoundX/SDFMU-Library
- Ninzore/Wecab:網絡內容聚合機器人,支持微博、B站、Twitter 等
https://github.com/Ninzore/Wecab
- Kyomotoi/ATRI:為即時聊天工具中復現一只優秀的功能性機器人是本項目的目標
https://github.com/Kyomotoi/ATRI
- KimigaiiWuyi/GenshinUID:基于 HoshinoBot/NoneBot2/QQ 官方頻道 Bot (Python SDK) 的原神 Uid 查詢/原神 Wiki/米社簽到/樹脂提醒插件
https://github.com/KimigaiiWuyi/GenshinUID
插件示例
命令式問答示例:
from nonebot import on_command from nonebot.rule import to_me from nonebot.matcher import Matcher from nonebot.adapters import Message from nonebot.params import Arg, CommandArg, ArgPlainText weather = on_command("weather", rule=to_me(), aliases={"天氣", "天氣預報"}, priority=5) @weather.handle() async def handle_first_receive(matcher: Matcher, args: Message = CommandArg()): plain_text = args.extract_plain_text() # 首次發送命令時跟隨的參數,例:/天氣 上海,則args為上海 if plain_text: matcher.set_arg("city", args) # 如果用戶發送了參數則直接賦值 @weather.got("city", prompt="你想查詢哪個城市的天氣呢?") async def handle_city(city: Message = Arg(), city_name: str = ArgPlainText("city")): if city_name not in ["北京", "上海"]: # 如果參數不符合要求,則提示用戶重新輸入 # 可以使用平臺的 Message 類直接構造模板消息 await weather.reject(city.template("你想查詢的城市 {city} 暫不支持,請重新輸入!")) city_weather = await get_weather(city_name) await weather.finish(city_weather) # 在這里編寫獲取天氣信息的函數 async def get_weather(city: str) -> str: return f"{city}的天氣是..."
開源協議:MIT
開源地址:https://github.com/nonebot/nonebot2
開發教程:https://nb2.baka.icu/docs/tutorial/create-project