Name | nonebot-plugin-uninfo JSON |
Version |
0.9.0
JSON |
| download |
home_page | None |
Summary | Universal Information Model for Nonebot2 |
upload_time | 2025-07-28 13:40:42 |
maintainer | None |
docs_url | None |
author | None |
requires_python | >=3.9 |
license | MIT |
keywords |
|
VCS |
|
bugtrack_url |
|
requirements |
No requirements were recorded.
|
Travis-CI |
No Travis.
|
coveralls test coverage |
No coveralls.
|
<div align="center">
<a href="https://nonebot.dev/">
<img src="https://nonebot.dev/logo.png" width="200" height="200" alt="nonebot">
</a>
# nonebot-plugin-uninfo
_✨ [Nonebot2](https://github.com/nonebot/nonebot2) 多平台的会话信息(用户、群组、频道)获取插件 ✨_
<p align="center">
<img src="https://img.shields.io/github/license/RF-Tar-Railt/nonebot-plugin-uninfo" alt="license">
<img src="https://img.shields.io/badge/python-3.9+-blue.svg" alt="Python">
<img src="https://img.shields.io/badge/nonebot-2.3.0+-red.svg" alt="NoneBot">
<a href="https://pypi.org/project/nonebot-plugin-uninfo">
<img src="https://badgen.net/pypi/v/nonebot-plugin-uninfo" alt="pypi">
</a>
</p>
</div>
本插件提供了多个模型,可以从不同适配器的 `Bot` 和 `Event` 中提取与会话相关的属性
## 安装
- 使用 nb-cli
```
nb plugin install nonebot-plugin-uninfo
```
- 使用 pip
```
pip install nonebot-plugin-uninfo
```
## 使用
### 获取 `Session`:
```python
from nonebot_plugin_uninfo import get_session
@matcher.handle()
async def handle(bot: Bot, event: Event):
session = await get_session(bot, event)
```
或使用依赖注入的形式:
```python
from nonebot_plugin_uninfo import Uninfo, UniSession, Session
@matcher.handle()
async def handle(session: Session = UniSession()):
...
@matcher.handle()
async def handle1(session: Uninfo):
...
```
### 拉取用户/群组/频道列表:
```python
from nonebot_plugin_uninfo import SceneType, QryItrface
@matcher.handle()
async def handle(interface: QryItrface):
users = await interface.get_users()
groups = await interface.get_scenes(SceneType.GROUP)
members = await interface.get_members(groups[0].type, groups[0].id)
```
### 使用内建的 `Permission`:
```python
from nonebot import on_command
from nonebot_plugin_uninfo import ADMIN
matcher = on_command("inspect", permission=ADMIN())
```
## 模型定义
### `User`
| 属性 | 类型 | 含义 | 备注 |
|----------|-------------|-------|------|
| `id` | str | 用户 id | |
| `name` | str \| None | 用户名称 | |
| `nick` | str \| None | 用户昵称 | 好友备注 |
| `avatar` | str \| None | 用户头像 | |
| `gender` | str | 用户性别 | |
### `Scene`
| 属性 | 类型 | 含义 | 备注 |
|----------|---------------|-------|-------------------------------------------------|
| `id` | str | 场景 id | |
| `type` | SceneType | 场景类型 | 可分为 `Private`, `Group`, `Guild` 和 `Channel_XXX` |
| `name` | str \| None | 场景名称 | |
| `avatar` | str \| None | 场景图标 | |
| `parent` | Scene \| None | 父级场景 | 适用于频道的二级群组场景, 或针对临时会话的来源群组 |
### `Member`
| 属性 | 类型 | 含义 | 备注 |
|-------------|------------------|---------|-------------------------------|
| `user` | User | 成员的用户信息 | |
| `nick` | str \| None | 成员昵称 | |
| `role` | str \| None | 成员角色组 | 当可能存在多个角色组时,此处会使用 level 最高的那个 |
| `mute` | MuteInfo \| None | 成员禁言信息 | |
| `joined_at` | datetime \| None | 成员加入时间 | |
### `Session`
| 属性 | 类型 | 含义 | 备注 |
|------------|----------------|--------|--------------------|
| `self_id` | str | 机器人 id | |
| `adapter` | str | 适配器名称 | |
| `scope` | str | 适配器范围 | 相比 adapter 更指向实际平台 |
| `scene` | Scene | 事件场景 | |
| `user` | User | 用户信息 | |
| `member` | Member \| None | 成员信息 | 仅适用于群组,频道场景 |
| `operator` | Member \| None | 操作者信息 | 仅适用于群组,频道场景 |
## 示例
```python
from nonebot_plugin_uninfo import Uninfo
from nonebot import on_command
matcher = on_command("inspect", aliases={"查看"}, priority=1)
@matcher.handle()
async def inspect(session: Uninfo):
texts = [
f"平台名: {session.adapter} | {session.scope}",
f"用户ID: {session.user.name + ' | ' if session.user.name else ''}{session.user.id}",
f"自身ID: {session.self_id}",
f"事件场景: {session.scene.type.name}",
f"频道 ID: {session.scene.name + ' | ' if session.scene.name else ''}{session.scene.id}"
]
if session.scene.parent:
texts.append(f"群组 ID: {session.scene.parent.name + ' | ' if session.scene.parent.name else ''}{session.scene.parent.id}")
if session.member:
texts.append(f"成员 ID: {session.member.nick + ' | ' if session.member.nick else ''}{session.member.id}")
await matcher.send("\n".join(texts))
```
## 支持的 adapter
- [x] OneBot v11
- [x] OneBot v12
- [x] Console
- [x] Kook (Kaiheila)
- [ ] Github
- [x] Telegram
- [x] Feishu
- [x] Discord
- [x] QQ
- [x] Satori
- [x] DoDo
- [x] Kritor
- [x] Mirai
- [ ] Tailchat
- [x] Mail
- [x] WXMP
- [ ] heybox
- [x] Milky
- [x] EFChat
## 相关插件
- [nonebot-plugin-alconna](https://github.com/nonebot/plugin-alconna) 强大的 Nonebot2 命令匹配拓展,支持富文本/多媒体解析,跨平台消息收发
## 鸣谢
- [nonebot-plugin-session](https://github.com/noneplugin/nonebot-plugin-session) 与 [nonebot-plugin-userinfo](https://github.com/noneplugin/nonebot-plugin-userinfo) 项目的灵感来源以及部分实现的参考
Raw data
{
"_id": null,
"home_page": null,
"name": "nonebot-plugin-uninfo",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": null,
"author": null,
"author_email": "RF-Tar-Railt <rf_tar_railt@qq.com>",
"download_url": "https://files.pythonhosted.org/packages/61/e4/9e4e90d7bd667cab4260f1705034746a02518bc3c87328aff2d67fef070a/nonebot_plugin_uninfo-0.9.0.tar.gz",
"platform": null,
"description": "<div align=\"center\">\n\n <a href=\"https://nonebot.dev/\">\n <img src=\"https://nonebot.dev/logo.png\" width=\"200\" height=\"200\" alt=\"nonebot\">\n </a>\n\n# nonebot-plugin-uninfo\n\n_\u2728 [Nonebot2](https://github.com/nonebot/nonebot2) \u591a\u5e73\u53f0\u7684\u4f1a\u8bdd\u4fe1\u606f(\u7528\u6237\u3001\u7fa4\u7ec4\u3001\u9891\u9053)\u83b7\u53d6\u63d2\u4ef6 \u2728_\n\n<p align=\"center\">\n <img src=\"https://img.shields.io/github/license/RF-Tar-Railt/nonebot-plugin-uninfo\" alt=\"license\">\n <img src=\"https://img.shields.io/badge/python-3.9+-blue.svg\" alt=\"Python\">\n <img src=\"https://img.shields.io/badge/nonebot-2.3.0+-red.svg\" alt=\"NoneBot\">\n <a href=\"https://pypi.org/project/nonebot-plugin-uninfo\">\n <img src=\"https://badgen.net/pypi/v/nonebot-plugin-uninfo\" alt=\"pypi\">\n </a>\n</p>\n\n</div>\n\n\u672c\u63d2\u4ef6\u63d0\u4f9b\u4e86\u591a\u4e2a\u6a21\u578b\uff0c\u53ef\u4ee5\u4ece\u4e0d\u540c\u9002\u914d\u5668\u7684 `Bot` \u548c `Event` \u4e2d\u63d0\u53d6\u4e0e\u4f1a\u8bdd\u76f8\u5173\u7684\u5c5e\u6027\n\n## \u5b89\u88c5\n\n- \u4f7f\u7528 nb-cli\n\n```\nnb plugin install nonebot-plugin-uninfo\n```\n\n- \u4f7f\u7528 pip\n\n```\npip install nonebot-plugin-uninfo\n```\n\n## \u4f7f\u7528\n\n### \u83b7\u53d6 `Session`\uff1a\n\n```python\nfrom nonebot_plugin_uninfo import get_session\n\n@matcher.handle()\nasync def handle(bot: Bot, event: Event):\n session = await get_session(bot, event)\n```\n\n\u6216\u4f7f\u7528\u4f9d\u8d56\u6ce8\u5165\u7684\u5f62\u5f0f\uff1a\n\n```python\nfrom nonebot_plugin_uninfo import Uninfo, UniSession, Session\n\n@matcher.handle()\nasync def handle(session: Session = UniSession()):\n ...\n\n@matcher.handle()\nasync def handle1(session: Uninfo):\n ...\n```\n\n### \u62c9\u53d6\u7528\u6237/\u7fa4\u7ec4/\u9891\u9053\u5217\u8868\uff1a\n\n```python\nfrom nonebot_plugin_uninfo import SceneType, QryItrface\n\n@matcher.handle()\nasync def handle(interface: QryItrface):\n users = await interface.get_users()\n groups = await interface.get_scenes(SceneType.GROUP)\n members = await interface.get_members(groups[0].type, groups[0].id)\n```\n\n### \u4f7f\u7528\u5185\u5efa\u7684 `Permission`:\n\n```python\nfrom nonebot import on_command\nfrom nonebot_plugin_uninfo import ADMIN\n\nmatcher = on_command(\"inspect\", permission=ADMIN())\n```\n\n## \u6a21\u578b\u5b9a\u4e49\n\n### `User`\n\n| \u5c5e\u6027 | \u7c7b\u578b | \u542b\u4e49 | \u5907\u6ce8 |\n|----------|-------------|-------|------|\n| `id` | str | \u7528\u6237 id | |\n| `name` | str \\| None | \u7528\u6237\u540d\u79f0 | |\n| `nick` | str \\| None | \u7528\u6237\u6635\u79f0 | \u597d\u53cb\u5907\u6ce8 |\n| `avatar` | str \\| None | \u7528\u6237\u5934\u50cf | |\n| `gender` | str | \u7528\u6237\u6027\u522b | |\n\n### `Scene`\n\n| \u5c5e\u6027 | \u7c7b\u578b | \u542b\u4e49 | \u5907\u6ce8 |\n|----------|---------------|-------|-------------------------------------------------|\n| `id` | str | \u573a\u666f id | |\n| `type` | SceneType | \u573a\u666f\u7c7b\u578b | \u53ef\u5206\u4e3a `Private`, `Group`, `Guild` \u548c `Channel_XXX` |\n| `name` | str \\| None | \u573a\u666f\u540d\u79f0 | |\n| `avatar` | str \\| None | \u573a\u666f\u56fe\u6807 | |\n| `parent` | Scene \\| None | \u7236\u7ea7\u573a\u666f | \u9002\u7528\u4e8e\u9891\u9053\u7684\u4e8c\u7ea7\u7fa4\u7ec4\u573a\u666f, \u6216\u9488\u5bf9\u4e34\u65f6\u4f1a\u8bdd\u7684\u6765\u6e90\u7fa4\u7ec4 |\n\n### `Member`\n\n| \u5c5e\u6027 | \u7c7b\u578b | \u542b\u4e49 | \u5907\u6ce8 |\n|-------------|------------------|---------|-------------------------------|\n| `user` | User | \u6210\u5458\u7684\u7528\u6237\u4fe1\u606f | |\n| `nick` | str \\| None | \u6210\u5458\u6635\u79f0 | |\n| `role` | str \\| None | \u6210\u5458\u89d2\u8272\u7ec4 | \u5f53\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u89d2\u8272\u7ec4\u65f6\uff0c\u6b64\u5904\u4f1a\u4f7f\u7528 level \u6700\u9ad8\u7684\u90a3\u4e2a |\n| `mute` | MuteInfo \\| None | \u6210\u5458\u7981\u8a00\u4fe1\u606f | |\n| `joined_at` | datetime \\| None | \u6210\u5458\u52a0\u5165\u65f6\u95f4 | |\n\n### `Session`\n\n| \u5c5e\u6027 | \u7c7b\u578b | \u542b\u4e49 | \u5907\u6ce8 |\n|------------|----------------|--------|--------------------|\n| `self_id` | str | \u673a\u5668\u4eba id | |\n| `adapter` | str | \u9002\u914d\u5668\u540d\u79f0 | |\n| `scope` | str | \u9002\u914d\u5668\u8303\u56f4 | \u76f8\u6bd4 adapter \u66f4\u6307\u5411\u5b9e\u9645\u5e73\u53f0 |\n| `scene` | Scene | \u4e8b\u4ef6\u573a\u666f | |\n| `user` | User | \u7528\u6237\u4fe1\u606f | |\n| `member` | Member \\| None | \u6210\u5458\u4fe1\u606f | \u4ec5\u9002\u7528\u4e8e\u7fa4\u7ec4,\u9891\u9053\u573a\u666f |\n| `operator` | Member \\| None | \u64cd\u4f5c\u8005\u4fe1\u606f | \u4ec5\u9002\u7528\u4e8e\u7fa4\u7ec4,\u9891\u9053\u573a\u666f |\n\n## \u793a\u4f8b\n\n```python\nfrom nonebot_plugin_uninfo import Uninfo\nfrom nonebot import on_command\n\nmatcher = on_command(\"inspect\", aliases={\"\u67e5\u770b\"}, priority=1)\n\n\n@matcher.handle()\nasync def inspect(session: Uninfo):\n texts = [\n f\"\u5e73\u53f0\u540d: {session.adapter} | {session.scope}\",\n f\"\u7528\u6237ID: {session.user.name + ' | ' if session.user.name else ''}{session.user.id}\",\n f\"\u81ea\u8eabID: {session.self_id}\",\n f\"\u4e8b\u4ef6\u573a\u666f: {session.scene.type.name}\",\n f\"\u9891\u9053 ID: {session.scene.name + ' | ' if session.scene.name else ''}{session.scene.id}\"\n ]\n if session.scene.parent:\n texts.append(f\"\u7fa4\u7ec4 ID: {session.scene.parent.name + ' | ' if session.scene.parent.name else ''}{session.scene.parent.id}\")\n if session.member:\n texts.append(f\"\u6210\u5458 ID: {session.member.nick + ' | ' if session.member.nick else ''}{session.member.id}\")\n await matcher.send(\"\\n\".join(texts))\n```\n\n## \u652f\u6301\u7684 adapter\n\n- [x] OneBot v11\n- [x] OneBot v12\n- [x] Console\n- [x] Kook (Kaiheila)\n- [ ] Github\n- [x] Telegram\n- [x] Feishu\n- [x] Discord\n- [x] QQ\n- [x] Satori\n- [x] DoDo\n- [x] Kritor\n- [x] Mirai\n- [ ] Tailchat\n- [x] Mail\n- [x] WXMP\n- [ ] heybox\n- [x] Milky\n- [x] EFChat\n\n## \u76f8\u5173\u63d2\u4ef6\n\n- [nonebot-plugin-alconna](https://github.com/nonebot/plugin-alconna) \u5f3a\u5927\u7684 Nonebot2 \u547d\u4ee4\u5339\u914d\u62d3\u5c55\uff0c\u652f\u6301\u5bcc\u6587\u672c/\u591a\u5a92\u4f53\u89e3\u6790\uff0c\u8de8\u5e73\u53f0\u6d88\u606f\u6536\u53d1\n## \u9e23\u8c22\n\n- [nonebot-plugin-session](https://github.com/noneplugin/nonebot-plugin-session) \u4e0e [nonebot-plugin-userinfo](https://github.com/noneplugin/nonebot-plugin-userinfo) \u9879\u76ee\u7684\u7075\u611f\u6765\u6e90\u4ee5\u53ca\u90e8\u5206\u5b9e\u73b0\u7684\u53c2\u8003",
"bugtrack_url": null,
"license": "MIT",
"summary": "Universal Information Model for Nonebot2",
"version": "0.9.0",
"project_urls": null,
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "0190e1b914bf19f5f596c27c908928d49ca8cfc5e655a8d6cd6b6ffa34e8c602",
"md5": "266e3766c97435e0718cddf83a7eb7db",
"sha256": "2b4ac326d3325cb1ad4d52d3ee28cbec21a8ad17cc666b36d0880a3b4914e891"
},
"downloads": -1,
"filename": "nonebot_plugin_uninfo-0.9.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "266e3766c97435e0718cddf83a7eb7db",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 63962,
"upload_time": "2025-07-28T13:40:41",
"upload_time_iso_8601": "2025-07-28T13:40:41.637062Z",
"url": "https://files.pythonhosted.org/packages/01/90/e1b914bf19f5f596c27c908928d49ca8cfc5e655a8d6cd6b6ffa34e8c602/nonebot_plugin_uninfo-0.9.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "61e49e4e90d7bd667cab4260f1705034746a02518bc3c87328aff2d67fef070a",
"md5": "f8707f22caefa3f896c8cf8d56afce5e",
"sha256": "466d8c972367a7b06221465986254a7f12ae8c4510586c6e006dcb2da261e486"
},
"downloads": -1,
"filename": "nonebot_plugin_uninfo-0.9.0.tar.gz",
"has_sig": false,
"md5_digest": "f8707f22caefa3f896c8cf8d56afce5e",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 39734,
"upload_time": "2025-07-28T13:40:42",
"upload_time_iso_8601": "2025-07-28T13:40:42.761914Z",
"url": "https://files.pythonhosted.org/packages/61/e4/9e4e90d7bd667cab4260f1705034746a02518bc3c87328aff2d67fef070a/nonebot_plugin_uninfo-0.9.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-28 13:40:42",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "nonebot-plugin-uninfo"
}