mirror of
https://github.com/nonebot/nonebot2.git
synced 2024-11-27 18:45:05 +08:00
Update docs
This commit is contained in:
parent
8d7f06fdde
commit
4c1d6bb4c5
21
docs/guide/code/awesome-bot-5/awesome/plugins/group_admin.py
Normal file
21
docs/guide/code/awesome-bot-5/awesome/plugins/group_admin.py
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
from none import on_request, RequestSession
|
||||||
|
from none import on_notice, NoticeSession
|
||||||
|
|
||||||
|
|
||||||
|
# 将函数注册为群请求处理器
|
||||||
|
@on_request('group')
|
||||||
|
async def _(session: RequestSession):
|
||||||
|
# 判断验证信息是否符合要求
|
||||||
|
if session.ctx['comment'] == '暗号':
|
||||||
|
# 验证信息正确,同意入群
|
||||||
|
await session.approve()
|
||||||
|
return
|
||||||
|
# 验证信息错误,拒绝入群
|
||||||
|
await session.reject('请说暗号')
|
||||||
|
|
||||||
|
|
||||||
|
# 将函数注册为群成员增加通知处理器
|
||||||
|
@on_notice('group_increase')
|
||||||
|
async def _(session: NoticeSession):
|
||||||
|
# 发送欢迎消息
|
||||||
|
await session.send('欢迎新朋友~')
|
87
docs/guide/code/awesome-bot-5/awesome/plugins/tuling.py
Normal file
87
docs/guide/code/awesome-bot-5/awesome/plugins/tuling.py
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
import json
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
import aiohttp
|
||||||
|
from aiocqhttp.message import escape
|
||||||
|
from none import on_command, CommandSession
|
||||||
|
from none import on_natural_language, NLPSession, NLPResult
|
||||||
|
from none.helpers import context_id
|
||||||
|
|
||||||
|
# 定义无法获取图灵回复时的「表达(Expression)」
|
||||||
|
EXPR_DONT_UNDERSTAND = (
|
||||||
|
'我现在还不太明白你在说什么呢,但没关系,以后的我会变得更强呢!',
|
||||||
|
'我有点看不懂你的意思呀,可以跟我聊些简单的话题嘛',
|
||||||
|
'其实我不太明白你的意思……',
|
||||||
|
'抱歉哦,我现在的能力还不能够明白你在说什么,但我会加油的~'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# 注册一个仅内部使用的命令,不需要 aliases
|
||||||
|
@on_command('tuling')
|
||||||
|
async def tuling(session: CommandSession):
|
||||||
|
# 获取可选参数,这里如果没有 message 参数,命令不会被中断,message 变量会是 None
|
||||||
|
message = session.get_optional('message')
|
||||||
|
|
||||||
|
# 通过封装的函数获取图灵机器人的回复
|
||||||
|
reply = await call_tuling_api(session, message)
|
||||||
|
if reply:
|
||||||
|
# 如果调用图灵机器人成功,得到了回复,则转义之后发送给用户
|
||||||
|
# 转义会把消息中的某些特殊字符做转换,以避免酷 Q 将它们理解为 CQ 码
|
||||||
|
await session.send(escape(reply))
|
||||||
|
else:
|
||||||
|
# 如果调用失败,或者它返回的内容我们目前处理不了,发送无法获取图灵回复时的「表达」
|
||||||
|
# session.send_expr() 内部会调用 none.expression.render()
|
||||||
|
# 该函数会将一个「表达」渲染成一个字符串消息
|
||||||
|
await session.send_expr(EXPR_DONT_UNDERSTAND)
|
||||||
|
|
||||||
|
|
||||||
|
@on_natural_language
|
||||||
|
async def _(session: NLPSession):
|
||||||
|
# 以置信度 60.0 返回 tuling 命令
|
||||||
|
# 确保任何消息都在且仅在其它自然语言处理器无法理解的时候使用 tuling 命令
|
||||||
|
return NLPResult(60.0, 'tuling', {'message': session.msg_text})
|
||||||
|
|
||||||
|
|
||||||
|
async def call_tuling_api(session: CommandSession, text: str) -> Optional[str]:
|
||||||
|
# 调用图灵机器人的 API 获取回复
|
||||||
|
|
||||||
|
if not text:
|
||||||
|
return None
|
||||||
|
|
||||||
|
url = 'http://openapi.tuling123.com/openapi/api/v2'
|
||||||
|
|
||||||
|
# 构造请求数据
|
||||||
|
payload = {
|
||||||
|
'reqType': 0,
|
||||||
|
'perception': {
|
||||||
|
'inputText': {
|
||||||
|
'text': text
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'userInfo': {
|
||||||
|
'apiKey': session.bot.config.TULING_API_KEY,
|
||||||
|
'userId': context_id(session.ctx, use_hash=True)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
group_unique_id = context_id(session.ctx, mode='group', use_hash=True)
|
||||||
|
if group_unique_id:
|
||||||
|
payload['userInfo']['groupId'] = group_unique_id
|
||||||
|
|
||||||
|
try:
|
||||||
|
# 使用 aiohttp 库发送最终的请求
|
||||||
|
async with aiohttp.ClientSession() as sess:
|
||||||
|
async with sess.post(url, json=payload) as response:
|
||||||
|
if response.status != 200:
|
||||||
|
# 如果 HTTP 响应状态码不是 200,说明调用失败
|
||||||
|
return None
|
||||||
|
|
||||||
|
resp_payload = json.loads(await response.text())
|
||||||
|
if resp_payload['results']:
|
||||||
|
for result in resp_payload['results']:
|
||||||
|
if result['resultType'] == 'text':
|
||||||
|
# 返回文本类型的回复
|
||||||
|
return result['values']['text']
|
||||||
|
except (aiohttp.ClientError, json.JSONDecodeError, KeyError):
|
||||||
|
# 抛出上面任何异常,说明调用失败
|
||||||
|
return None
|
@ -0,0 +1,43 @@
|
|||||||
|
from none import on_command, CommandSession
|
||||||
|
from none import on_natural_language, NLPSession, NLPResult
|
||||||
|
from jieba import posseg
|
||||||
|
|
||||||
|
from .data_source import get_weather_of_city
|
||||||
|
|
||||||
|
|
||||||
|
@on_command('weather', aliases=('天气', '天气预报', '查天气'))
|
||||||
|
async def weather(session: CommandSession):
|
||||||
|
city = session.get('city', prompt='你想查询哪个城市的天气呢?')
|
||||||
|
weather_report = await get_weather_of_city(city)
|
||||||
|
await session.send(weather_report)
|
||||||
|
|
||||||
|
|
||||||
|
@weather.args_parser
|
||||||
|
async def _(session: CommandSession):
|
||||||
|
stripped_arg = session.current_arg_text.strip()
|
||||||
|
if session.current_key:
|
||||||
|
session.args[session.current_key] = stripped_arg
|
||||||
|
elif stripped_arg:
|
||||||
|
session.args['city'] = stripped_arg
|
||||||
|
|
||||||
|
|
||||||
|
# on_natural_language 装饰器将函数声明为一个自然语言处理器
|
||||||
|
# keywords 表示需要响应的关键词,类型为任意可迭代对象,元素类型为 str
|
||||||
|
# 如果不传入 keywords,则响应所有没有被当作命令处理的消息
|
||||||
|
@on_natural_language(keywords=('天气',))
|
||||||
|
async def _(session: NLPSession):
|
||||||
|
# 去掉消息首尾的空白符
|
||||||
|
stripped_msg_text = session.msg_text.strip()
|
||||||
|
# 对消息进行分词和词性标注
|
||||||
|
words = posseg.lcut(stripped_msg_text)
|
||||||
|
|
||||||
|
city = None
|
||||||
|
# 遍历 posseg.lcut 返回的列表
|
||||||
|
for word in words:
|
||||||
|
# 每个元素是一个 pair 对象,包含 word 和 flag 两个属性,分别表示词和词性
|
||||||
|
if word.flag == 'ns':
|
||||||
|
# ns 词性表示地名
|
||||||
|
city = word.word
|
||||||
|
|
||||||
|
# 返回处理结果,三个参数分别为置信度、命令名、命令会话的参数
|
||||||
|
return NLPResult(90.0, 'weather', {'city': city})
|
@ -0,0 +1,2 @@
|
|||||||
|
async def get_weather_of_city(city: str) -> str:
|
||||||
|
return f'{city}的天气是……'
|
11
docs/guide/code/awesome-bot-5/bot.py
Normal file
11
docs/guide/code/awesome-bot-5/bot.py
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
from os import path
|
||||||
|
|
||||||
|
import none
|
||||||
|
|
||||||
|
import config
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
none.init(config)
|
||||||
|
none.load_plugins(path.join(path.dirname(__file__), 'awesome', 'plugins'),
|
||||||
|
'awesome.plugins')
|
||||||
|
none.run()
|
10
docs/guide/code/awesome-bot-5/config.py
Normal file
10
docs/guide/code/awesome-bot-5/config.py
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
from none.default_config import *
|
||||||
|
|
||||||
|
HOST = '0.0.0.0'
|
||||||
|
PORT = 8080
|
||||||
|
|
||||||
|
SUPERUSERS = {12345678}
|
||||||
|
COMMAND_START.add('')
|
||||||
|
NICKNAME = {'小明', '明明'}
|
||||||
|
|
||||||
|
TULING_API_KEY = ''
|
3
docs/guide/code/awesome-bot-5/requirements.txt
Normal file
3
docs/guide/code/awesome-bot-5/requirements.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
none-bot>=0.2.1
|
||||||
|
jieba
|
||||||
|
aiohttp
|
@ -1,3 +1,58 @@
|
|||||||
# 处理通知和请求
|
# 处理通知和请求
|
||||||
|
|
||||||
本章将以一个具有自动同意或拒绝入群请求、欢迎新成员、禁言不良成员等功能的群管插件为例,来教你编写通知和请求处理器。
|
除了聊天消息,酷 Q 还提供了加群请求、加好友请求、出入群通知、管理员变动通知等很多其它事件,很多时候我们需要利用这些事件来实现群管功能,这也是 QQ 机器人除聊天之外的另一个很重要的应用之一。
|
||||||
|
|
||||||
|
本章将介绍如何在插件中处理通知和请求。
|
||||||
|
|
||||||
|
::: tip 提示
|
||||||
|
本章的完整代码可以在 [awesome-bot-5](https://github.com/richardchien/none-bot/tree/master/docs/guide/code/awesome-bot-5) 查看。
|
||||||
|
:::
|
||||||
|
|
||||||
|
## 自动同意加群请求
|
||||||
|
|
||||||
|
首先我们可能需要机器人根据条件自动同意加群请求,从而不再需要管理员手动操作。
|
||||||
|
|
||||||
|
新建 `awesome/plugins/group_admin.py`,编写代码如下:
|
||||||
|
|
||||||
|
```python
|
||||||
|
from none import on_request, RequestSession
|
||||||
|
|
||||||
|
|
||||||
|
# 将函数注册为群请求处理器
|
||||||
|
@on_request('group')
|
||||||
|
async def _(session: RequestSession):
|
||||||
|
# 判断验证信息是否符合要求
|
||||||
|
if session.ctx['comment'] == '暗号':
|
||||||
|
# 验证信息正确,同意入群
|
||||||
|
await session.approve()
|
||||||
|
return
|
||||||
|
# 验证信息错误,拒绝入群
|
||||||
|
await session.reject('请说暗号')
|
||||||
|
```
|
||||||
|
|
||||||
|
这里首先 `on_request` 装饰器将函数注册为一个请求处理器,`group` 参数表示只处理群请求,这里各请求对应的参数值可以参考 [CoolQ HTTP API 插件的事件上报](https://cqhttp.cc/docs/#/Post?id=%E5%8A%A0%E5%A5%BD%E5%8F%8B%E8%AF%B7%E6%B1%82) 的 `request_type` 字段,目前有 `group` 和 `friend` 两种。
|
||||||
|
|
||||||
|
接着判断 `session.ctx['comment']` 是否是正确的暗号,`comment` 字段同样可以在上面 CoolQ HTTP API 插件的事件上报文档中找到,里面包含加群或加好友时的验证信息。
|
||||||
|
|
||||||
|
最后 `session.approve()` 和 `session.reject()` 分别用于同意和拒绝加群请求,如果都不调用,则忽略请求(其它管理员仍然可以处理请求)。
|
||||||
|
|
||||||
|
## 欢迎新成员
|
||||||
|
|
||||||
|
新成员入群之后,为了活跃气氛,我们可能希望机器人发一段欢迎消息。只需下面的代码即可实现:
|
||||||
|
|
||||||
|
```python
|
||||||
|
from none import on_notice, NoticeSession
|
||||||
|
|
||||||
|
|
||||||
|
# 将函数注册为群成员增加通知处理器
|
||||||
|
@on_notice('group_increase')
|
||||||
|
async def _(session: NoticeSession):
|
||||||
|
# 发送欢迎消息
|
||||||
|
await session.send('欢迎新朋友~')
|
||||||
|
```
|
||||||
|
|
||||||
|
::: warning 注意
|
||||||
|
这里最好预先判断一下是不是你想发送的群(通过 `session.ctx['group_id']`),否则机器人所在的任何群有新成员进入它都会欢迎。
|
||||||
|
:::
|
||||||
|
|
||||||
|
总的来说这些 `on_*` 装饰器用起来都是差不多的,这里的 `group_increase` 表示群成员增加,其它的通知类型可以参考 [CoolQ HTTP API 插件的事件上报](https://cqhttp.cc/docs/#/Post?id=%E5%8A%A0%E5%A5%BD%E5%8F%8B%E8%AF%B7%E6%B1%82) 的 `notice_type`。
|
||||||
|
Loading…
Reference in New Issue
Block a user