在聊天中执行带有上下文的 Python 代码
Project description
📖 介绍
本插件旨在允许开发者在聊天中执行带有上下文的 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 |
exe_code__qbot_id |
否 | 无 | OneBot V11 发送 ark 卡片所需的官 Bot QQ 号 |
权限说明
对于 exe_code__user
中配置的用户,在私聊/任意群聊中均可触发命令。
对于 exe_code__group
中配置的群组,任意用户均可触发命令。
对于 NoneBot 默认配置项 SUPERUSERS
中配置的用户,在私聊/任意群聊中均可触发命令,且在执行环境中拥有额外管理权限。
🎉 使用
[!note]
以下说明将假设您已掌握基础的 Python 异步编程语法。
命令概览
-
code [代码]
在用户执行环境中执行代码。代码中包含的
at
消息段将被转换为用户ID
字符串。代码中包含的
图片
消息段将被转换为图片URL
字符串。具体处理逻辑参考
~matchers.depends:_ExtractCode
-
getraw
获取引用消息的消息段的文本形式。例:对于
OneBot V11
适配器,将返回消息的CQ码
。提供变量:
gem
、gurl
-
getmid
获取引用消息的消息 ID。提供变量:
gem
、gurl
-
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
变量将被设置为执行者的 用户ID
,gid
变量将被设置为当前 群组ID
(私聊则为 None
)
api
中被 @export
装饰的方法将被导出到用户执行环境。例: print
,feedback
,help
,...
传入的代码经过一次异步函数包装后,可以正常执行异步代码。具体参考 ~context:Context._solve_code
。
对于供用户使用的接口方法,插件中使用 @descript
装饰器添加了描述。在执行代码时,可以通过 await help(api.method)
获取函数信息。
对于部分协议,插件提供了额外的接口,便于执行一些平台特化的操作。目前提供适配的协议:OneBot V11
、QQ
。
示例
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.08.01 v1.0.4
发送消息类接口改为返回 Task, 允许不等待消息返回
api.set_const
变量名添加 isidentifier 校验 -
2024.07.21 v1.0.2
修复消息混排处理
-
2024.07.21 v1.0.1
插件开源
鸣谢
- nonebot/nonebot2: 跨平台 Python 异步机器人框架
- nonebot/plugin-alconna: 跨平台的消息处理接口
- noneplugin/nonebot-plugin-session: 会话信息提取
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for nonebot_plugin_exe_code-1.0.4.tar.gz
Algorithm | Hash digest | |
---|---|---|
SHA256 | 19cfc9406b9524d9f6c33231df0f257d9174fd0693f1d223db9de25568de3d1a |
|
MD5 | 9dee985b505fc9348834aa766032478b |
|
BLAKE2b-256 | 9f1307011dbd52f0f507875b564259a505f92ae78b305c1db3870ebed0385e54 |
Hashes for nonebot_plugin_exe_code-1.0.4-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c4865083f27bf5901653b5a8bc152ab70d5e4b0fb4c37df11985b25167b5ac86 |
|
MD5 | 14dc45cce1ee7d99dcfc31066bbe5789 |
|
BLAKE2b-256 | b1a6dc33a1dea86b90ab94dc5a7324a836dd389696063e46aa9ab5fafa5b58ce |