Skip to main content

在聊天中执行带有上下文的 Python 代码

Project description

nonebot-plugin-exe-code

✨ 在聊天中执行带有上下文的 Python 代码 ✨

license pypi python

uv isort black pyright ruff

commits codecov pre-commit pyright publish

NoneBot Registry Supported Adapters

📖 介绍

本插件旨在允许开发者在聊天中执行带有上下文的 Python 代码,从而对 NoneBot 框架进行运行时侵入式修改。

由于这种设计,插件具有极高的灵活性,但也伴随着高风险。

[!warning]

🚨 重要安全提示

插件在未经验证的情况下解析执行外部代码,存在较高的安全风险。执行用户输入的代码可能导致系统崩溃、数据泄露或其他不可预见的安全问题。

因此,请确保只有可信赖的开发者被授予执行代码的权限。

使用本插件即表示您已理解并接受上述风险,并将进行严格的权限管理和安全防护。

💿 安装

使用 nb-cli 安装 在 nonebot2 项目的根目录下打开命令行, 输入以下指令即可安装
nb plugin install nonebot-plugin-exe-code
使用包管理器安装 在 nonebot2 项目的插件目录下, 打开命令行, 根据你使用的包管理器, 输入相应的安装命令
pip
pip install nonebot-plugin-exe-code
pdm
pdm add nonebot-plugin-exe-code
poetry
poetry add nonebot-plugin-exe-code
conda
conda install nonebot-plugin-exe-code

打开 nonebot2 项目根目录下的 pyproject.toml 文件, 在 [tool.nonebot] 部分追加写入

plugins = ["nonebot_plugin_exe_code"]

⚙️ 配置

在 nonebot2 项目的 .env 文件中添加下表中的配置

配置项 必填 默认值 说明
exe_code__user [] 允许执行代码的用户 ID
exe_code__group [] 允许执行代码的群组 ID
可选配置

插件为 OneBot V11 适配器封装了发送 QQ官方机器人ark卡片消息 的接口,参考 这里

使用时需要在 .env 文件中添加如下配置,在 nonebot2 项目中配置 OneBot V11 适配器和 QQ 适配器,并连接到两个对应的 Bot 账号,并确保两者之间可以发送私聊消息。

配置项 必填 默认值 说明
exe_code__qbot_id OneBot V11 发送 ark 卡片所需的官 Bot QQ 号
exe_code__qbot_timeout 30.0 OneBot V11 发送 ark 卡片的超时时长(秒)

📄 权限说明

对于 exe_code__user 中配置的用户,在私聊/任意群聊中均可触发命令。

对于 exe_code__group 中配置的群组,任意用户均可触发命令。

对于 NoneBot 默认配置项 SUPERUSERS 中配置的用户,在私聊/任意群聊中均可触发命令,且在执行环境中拥有额外管理权限。

📦️ 数据存储

插件使用 nonebot/plugin-localstore 存储用户数据,存储位置参考 这里

🎉 使用

[!note]

以下说明将假设您已掌握基础的 Python 异步编程语法。

命令概览

  • code [代码] 在用户执行环境中执行代码。

    代码中包含的 at 消息段将被转换为 用户ID 字符串。

    代码中包含的 图片 消息段将被转换为 图片URL 字符串。

    具体处理逻辑参考 ~matchers.depends:_ExtractCode

  • getraw 获取引用消息的消息段的文本形式。

    例:对于 OneBot V11 适配器,将返回消息的 CQ码

    提供变量: gemgurl

  • getmid 获取引用消息的消息 ID。

    提供变量: gemgurl

  • getimg [varname] 获取指定的图片。

    PIL.Image.Image 格式保存至上下文的 [varname] 变量中。未指定时默认为 img

    提供变量: gurl

  • terminate [@someone] 中止指定用户的代码。

    未指定时为自己的代码。仅 SUPERUSERS 可用。

[!note]

对于上述 getxxx 命令,均可使用引用消息来指定传入的消息内容。

[!note]

gem: 传入消息内容的消息体,类型为适配器给出的消息类。

gurl: 当传入消息包含图片时,自动提取的图片 URL。

执行环境

用户执行环境保存于 ~context:Context._contexts,随 NoneBot 重启而重置。

用户执行环境由 初始环境 深拷贝生成,包含 UniMessage 及一些常用消息段。

在传入代码开始执行前,用户执行环境将获得一个 API 实例,变量名固定为 api。同时,qid 变量将被设置为执行者的 用户IDgid 变量将被设置为当前 群组ID (私聊则为 None)

api 中被 @export 装饰的方法将被导出到用户执行环境。例: printfeedbackhelpinput,...

传入的代码经过一次异步函数包装后,可以正常执行异步代码。具体参考 ~context:Context._solve_code

对于供用户使用的接口方法,插件中使用 @descript 装饰器添加了描述。在执行代码时,可以通过 await help(api.method) 获取函数信息。

对于部分协议,插件提供了额外的接口,便于执行一些平台特化的操作。目前提供适配的协议:OneBot V11QQ

示例

await feedback(At(qid) + " Hi there")  # 向当前会话发送消息
await user(qid).send(f"Hello {qid}")   # 向指定用户发送消息
await group(gid).send(f"Hello {gid}")  # 向指定群组发送消息

# 插件重写的 print 函数,用法同原 print
# print 的内容将写入缓冲区,在代码段执行结束后输出
print("test", end=" ")
print("NoneBot", "Plugin", sep="-")

# 使用 UniMessage 提供的 Receipt 操作发送的消息
receipt = await feedback("Recall in 3s...")
await sleep(3)          # 异步等待 3 秒
await receipt.recall()  # 撤回消息

📝 更新日志

更新日志
  • 2024.10.02 v1.1.2

    • 支持代码内使用 yield 返回多个值
    • get 类命令加锁
    • 执行结束删除导出变量
    • 修改 SUPERUERS 管理函数格式
    • ob11 & satori 可使用 api.mid 快捷获取 message_id
    • ob11 & satori 接口: set_reaction
  • 2024.09.22 v1.1.1

    • 优化平台消息类型获取
    • 重命名 ob11 群禁言接口: set_ban -> set_mute
    • 新增 satori 接口: 群禁言
    • 新增 ob11 接口: 上传文件
    • 移除依赖 userinfo
    • 使用 session 作为用户标识
  • 2024.09.07 v1.1.0

    • OneBot V11 适配器接口: 群名片, 群禁言, 资料卡点赞
    • 修复鉴权错误
  • 2024.08.24 v1.0.9

    • 修复 User.send_fwdtarget 错误
    • 修复 SendArkark_37 参数错误
    • 优化 getimg 提取图片逻辑, 限制回复提取递归次数
  • 2024.08.09 v1.0.8

  • 2024.08.09 v1.0.7

    • 使用 nonebot/plugin-localstore 存储插件数据
    • 回滚 v1.0.4 的消息发送接口修改
    • 修改 Python 版本需求为 >=3.10
  • 2024.08.04 v1.0.6

    • Context 添加字典操作
    • input 函数改为返回 UniMessage, 超时改为抛出 TimeoutError
    • 修复 help 函数获取单个方法信息时, 实例名显示错误
    • API._native_send 改为返回平台接口数据
  • 2024.08.01 v1.0.5

    • 新增函数 input, 用于从对话中获取输入
  • 2024.08.01 v1.0.4

    • 发送消息类接口改为返回 Task, 允许不等待消息返回

    • api.set_const 变量名添加 isidentifier 校验

  • 2024.07.21 v1.0.2

    • 修复消息混排处理
  • 2024.07.21 v1.0.1

    • 插件开源

鸣谢

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nonebot_plugin_exe_code-1.1.2.tar.gz (39.6 kB view details)

Uploaded Source

Built Distribution

nonebot_plugin_exe_code-1.1.2-py3-none-any.whl (35.7 kB view details)

Uploaded Python 3

File details

Details for the file nonebot_plugin_exe_code-1.1.2.tar.gz.

File metadata

File hashes

Hashes for nonebot_plugin_exe_code-1.1.2.tar.gz
Algorithm Hash digest
SHA256 d8fda387a81ce69e43e784b76eb6440782beba77db28756f0382e1d55115bcb9
MD5 b7c4ad4c75b9a1dc07957ccc473d57cc
BLAKE2b-256 6ca2f6d3c4ecd3002a13833d27322a294fec0f22094922dc476cc5406728ee86

See more details on using hashes here.

File details

Details for the file nonebot_plugin_exe_code-1.1.2-py3-none-any.whl.

File metadata

File hashes

Hashes for nonebot_plugin_exe_code-1.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 7bdc07b051691674c168692d726cd92e0ed2ee00125bdccb9d8c597bb6192466
MD5 7f4126b48121f8b578392cb8082d6f9a
BLAKE2b-256 94aafa2097bf9c737af0cf4e9f9cbeffe79f907f21dc9220c5de80603575418a

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page