diff --git a/docs/usage/README.md b/docs/usage/README.md index e1d6f34..3aaedd2 100644 --- a/docs/usage/README.md +++ b/docs/usage/README.md @@ -75,7 +75,7 @@ sidebar: auto 直接克隆源代码需要自行编译前端,否则会出现无法使用管理后台等情况。 ::: ::: danger -本项目中使用了 Python 3.9 的语法,如果出现问题,请检查 Python 版本 +本项目中使用了 Python 3.10 的语法,如果出现问题,请检查 Python 版本 ::: 1. 首先安装 poetry:[安装方法](https://python-poetry.org/docs/#installation) @@ -88,6 +88,10 @@ sidebar: auto ### 作为插件使用 本部分假设大家会部署 nonebot2 +::: tip +参考教程 [nonebot2 部署](https://v2.nonebot.dev/docs/quick-start) +参考视频教程 [保姆级新手教学 - Well404](https://www.bilibili.com/video/BV1984y1b7JY) +::: #### 手动安装 @@ -122,6 +126,9 @@ sidebar: auto - `BISON_OUTER_URL`: 从外部访问服务器的地址,默认为`http://localhost:8080/bison/`,如果你的插件部署 在服务器上,建议配置为`http://<你的服务器ip>:8080/bison/` ::: warning + 请注意,该网址**并不能直接访问**Bison 的后台管理网页,正确的访问方法请参见[私聊机器人获取后台地址](#私聊机器人获取后台地址) + ::: + ::: tip 如果需要从外网或者 Docker 容器外访问后台页面,请确保`HOST=0.0.0.0` ::: - `BISON_FILTER_LOG`: 是否过滤来自`nonebot`的 warning 级以下的 log,如果你的 bot 只运行了这个插件可以考虑 @@ -179,16 +186,18 @@ sidebar: auto #### 私聊机器人获取后台地址 -`后台管理`,之后点击返回的链接 -如果你是 superuser,那么你可以管理所有群的订阅; -如果你是 bot 所在的群的其中部分群的管理,你可以管理你管理的群里的订阅; -如果你不是任意一个群的管理,那么 bot 将会报错。 +要管理订阅,请输入`后台管理`命令,然后点击回复中的链接。你的管理权限取决于你的身份: + +- 如果你是 superuser,你可以管理所有群的订阅; +- 如果你是某些群的管理员,你可以管理这些群的订阅; +- 如果你不是任何群的管理员,bot 会提示你无法执行此操作。 + ::: tip 可以和 bot 通过临时聊天触发 ::: ::: warning -网页的身份鉴别机制全部由 bot 返回的链接确定,所以这个链接并不能透露给别人。 -并且链接会过期,所以一段时间后需要重新私聊 bot 获取新的链接。 +bot 返回的链接是网页的唯一身份凭证,不要泄露给他人。 +链接有时效性,过期后需重新向 bot 索取新链接。 ::: #### 私聊机器人进行配置(需要 SUPERUER 权限) @@ -250,26 +259,26 @@ RSS 链接即为 uid ### 平台订阅标签(Tag) -社交平台中的 Tag 一般指使用井号(`#`)作为前缀,将关键词进行标记,方便用户进行搜索的功能。 -例子:`#明日方舟# #每日打卡#(weibo、bilibili) #baracamp(Twitter)` +Tag 是社交平台中一种常见的功能,它用井号(#)作为前缀,标记关键词,方便用户搜索相关内容。 +例如:`#明日方舟# #每日打卡#(微博、哔哩哔哩) #baracamp(推特)` -在 Bison 中,用户在添加平台账号订阅时(如果该平台提供有 hashtag 功能), -会进行`输入需要订阅/屏蔽tag`的步骤。 +在 Bison 中,用户可以在添加平台账号订阅时(如果该平台支持 hashtag 功能), +选择需要订阅或屏蔽的 Tag。 -如果需要订阅某些 tag,需要直接向 bison 发送需要订阅的一系列 tag,并使用空格进行分隔。 -例:`A1行动预备组 罗德厨房——回甘` +订阅 Tag 的方法是直接向 Bison 发送一系列 Tag,用空格分隔。 +例如:`A1行动预备组 罗德厨房——回甘` -如果需要屏蔽某些 tag,需要在需要屏蔽的 tag 前加上前缀`~`,对于复数的 tag,使用空格进行分隔。 -例:`~123罗德岛 ~莱茵生命漫画` +屏蔽 Tag 的方法是在 Tag 前加上前缀~,也用空格分隔。 +例如:`~123罗德岛 ~莱茵生命漫画` -可以综合运用以上规则进行同时订阅/屏蔽。 -例:`A1行动预备组 ~123罗德岛 罗德厨房——回甘 ~莱茵生命漫画` +订阅和屏蔽的 Tag 可以同时使用,按照上述方法发送即可。 +例如:`A1行动预备组 ~123罗德岛 罗德厨房——回甘 ~莱茵生命漫画` #### Tag 的推送规则 -每当 Bison 抓取到一条推送,推送中的 Tag 会经过一下检查: +Bison 在处理每条推送时,会按照以下规则检查推送中的 Tag: -- Bison 会对**需屏蔽 Tag**进行最优先检查,只要检测到本次推送中存在**任一**已记录的**需屏蔽 tag**,Bison 便会将该推送丢弃。 -- 上一个检查通过后,Bison 会对**需订阅 tag**进行检查,如果本次推送中存在**任一**已记录的**需订阅 tag**,Bison 便会将该推送发送到群中。 -- 当已记录的**需订阅 tag**为空时,只要通过了*第一条规则*的检查,Bison 就会将该推送发送到群中。 -- 当已记录的**需订阅 tag**不为空时,即使通过了*第一条规则*的检查,若本次推送不含**任何**已记录的**需订阅 tag**,Bison 也会将该推送丢弃。 +- 如果推送中含有任何已记录的**需屏蔽 Tag**,Bison 会直接**丢弃**该推送,不进行后续检查。 +- 如果推送中含有任何已记录的**需订阅 Tag**,Bison 会将该推送发送到群中,不管是否有其他 Tag。 +- 如果**没有记录**任何需订阅 Tag,Bison 会将所有通过第一条规则检查的推送发送到群中。 +- 如果记录了至少一个需订阅 Tag,Bison 会**丢弃所有**不含任何需订阅 Tag 的推送,即使通过了第一条规则检查。 diff --git a/nonebot_bison/admin_page/__init__.py b/nonebot_bison/admin_page/__init__.py index abe4b85..b6ada13 100644 --- a/nonebot_bison/admin_page/__init__.py +++ b/nonebot_bison/admin_page/__init__.py @@ -63,9 +63,10 @@ def init_fastapi(): if host in ["0.0.0.0", "127.0.0.1"]: host = "localhost" logger.opt(colors=True).info( - f"Nonebot test frontend will be running at: " + f"Nonebot Bison frontend will be running at: " f"http://{host}:{port}/bison" ) + logger.opt(colors=True).info(f"该页面不能被直接访问,请私聊bot 后台管理 以获取可访问地址") def register_get_token_handler(): diff --git a/tests/test_admin_page.py b/tests/test_admin_page.py new file mode 100644 index 0000000..584cadc --- /dev/null +++ b/tests/test_admin_page.py @@ -0,0 +1,66 @@ +from pathlib import Path +from unittest.mock import patch + +import pytest +from nonebug import App + +from .utils import fake_admin_user, fake_private_message_event + + +@pytest.mark.asyncio +async def test_command(app: App): + + from nonebot.adapters.onebot.v11.bot import Bot + from nonebot.adapters.onebot.v11.message import Message + + from nonebot_bison.admin_page import register_get_token_handler + from nonebot_bison.admin_page.token_manager import token_manager as tm + from nonebot_bison.plugin_config import plugin_config + + with patch.object(tm, "get_user_token", return_value="test_token"): + + register_get_token_handler() + + async with app.test_matcher() as ctx: + bot = ctx.create_bot(base=Bot) + + event_1 = fake_private_message_event( + message=Message("后台管理"), + sender=fake_admin_user, + to_me=True, + ) + ctx.receive_event(bot, event_1) + ctx.should_call_send( + event_1, f"请访问: {plugin_config.bison_outer_url}auth/test_token", True + ) + ctx.should_finished() + + event_2 = fake_private_message_event( + message=Message("管理后台"), sender=fake_admin_user, to_me=True + ) + ctx.receive_event(bot, event_2) + ctx.should_call_send( + event_2, f"请访问: {plugin_config.bison_outer_url}auth/test_token", True + ) + ctx.should_finished() + + +@pytest.mark.asyncio +async def test_log(app: App, tmp_path: Path): + import contextlib + import io + + from nonebot.log import default_format, logger + + from nonebot_bison.admin_page import init_fastapi + + log_path = tmp_path / "temp.log" + + logger.add(log_path, level="INFO", format=default_format, rotation="1 day") + with contextlib.redirect_stderr(io.StringIO()) as f: + init_fastapi() + + with log_path.open("r", encoding="utf-8") as f: + log = f.read() + assert "Nonebot Bison frontend will be running at" in log + assert "该页面不能被直接访问,请私聊bot 后台管理 以获取可访问地址" in log