在使用扣子(Coze)平台开发自定义插件时,有几项核心规范必须遵守:插件代码需运行于 Python 3.9 环境,代码结构中必须包含 main() 函数,并依赖 get_input() 与 set_output() 进行数据传递;仅支持标准库与 requests 库,严禁文件操作及第三方包;若涉及 HTTP 请求,务必提前开启插件开关,且超时时间不得超过 5 秒。

当你在扣子(Coze)平台尝试编写自定义插件,希望实现调用外部 API、处理用户输入或执行计算逻辑时,常常会卡在代码编写环节——不确定选用 JavaScript 还是 Python、如何组织代码结构、哪些接口必须实现、有哪些限制需要规避。本文将完整拆解整个开发流程。
确认运行环境与编程语言选择
进入插件编辑页面后,点击「添加工具」,在右侧面板的语言下拉菜单中务必选择 Python 3.9。若误选 JavaScript 或保持默认,系统将默认使用 JS 环境,此时写入 Python 语法会直接引发错误。
Python 3.9 是目前平台唯一支持的 Python 版本。该环境仅预装了标准库与 requests 库(前提是已开启 HTTP 插件),numpy、pandas 等第三方包均不被支持,文件读写操作同样不可用。
JavaScript 节点适合处理简单的字符串操作、正则提取、条件判断等轻量逻辑;但凡是涉及 HTTP 请求、随机数生成、JSON 解析等需要稳定 IO 控制的场景,都应当优先选用 Python。
Python 插件核心结构:三个关键要素缺一不可
所有 Python 代码必须完整包含以下三个组成部分:
① 定义 main() 函数;
② 使用 get_input('字段名') 获取上游传入的数据,字段名必须与前序节点输出的字段名完全一致;
③ 使用 set_output('字段名', 值) 返回处理结果,字段名需提前在元数据中声明为输出参数。
若遗漏 main() 函数定义,或未显式调用 main(),脚本会静默失败——平台不会报错,但输出结果为空。此外,print() 语句在日志中不可见,调试时只能借助 set_output() 临时输出中间值。
方法一:纯本地逻辑处理(无需网络请求)
直接在代码框中编写标准库逻辑,例如清洗手机号:
import re
def main():
input_text = get_input('text')
cleaned = re.sub(r'[^0-9]', '', input_text)
set_output('phone', cleaned)
main()
实现方式非常简单,直接将上述代码完整粘贴即可。需要注意 re.sub 正则中 [^0-9] 表示“匹配非数字字符”,相比 \D 更为稳妥,可有效避免 Unicode 数字的干扰。
方法二:发起 HTTP 请求(需预先开启插件)
第一步:返回工作流画布顶部,点击「设置」→「插件」→ 开启「HTTP Request」插件,然后保存设置。
第二步:在代码节点中调用 requests(平台已预装):
import requests
def main():
url = get_input('api_url')
res = requests.get(url, timeout=5)
set_output('status', res.status_code)
set_output('body', res.text[:200])
main()
timeout 参数必须设置为 ≤5 秒,否则平台将强制终止请求;响应体务必截取前 200 个字符,超长内容会触发输出校验失败。
方法三:解析 JSON 响应并提取字段
当 API 返回 JSON 格式数据时,无需手动调用 json.loads(res.text)——平台已自动完成 JSON 反序列化,直接使用 res.json() 即可:
import requests
def main():
url = get_input('api_url')
res = requests.get(url, timeout=5)
data = res.json()
set_output('title', data[0]['title'] if isinstance(data, list) and data else 'No title')
main()
这行 isinstance(data, list) and data 的判断至关重要:它能有效避免 API 返回单对象或空数组时,data[0] 抛出 IndexError 导致整个节点崩溃。处理 JSON 返回时加入此类防御性检查,能确保大多数接口稳定运行。
