nonebot-plugin-uninfo


Namenonebot-plugin-uninfo JSON
Version 0.9.0 PyPI version JSON
download
home_pageNone
SummaryUniversal Information Model for Nonebot2
upload_time2025-07-28 13:40:42
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
licenseMIT
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"
}
        
Elapsed time: 0.63975s