Package Information
Released: 1 mo ago
Downloads: 0 weekly / 0 monthly
Latest Version: 1.0.1
Author: libin0019
Documentation
n8n-nodes-wecom-approval
一个 N8N 1.x 社区节点插件,用于批量导出企业微信「审批」应用的审批流数据。
基于企业微信官方 OA 审批接口实现,核心链路为:
GET /cgi-bin/gettoken— 获取 access_token(进程级缓存)POST /cgi-bin/oa/getapprovalinfo— 按日期范围批量获取审批单号(自动分页)POST /cgi-bin/oa/getapprovaldetail— 按审批单号获取审批详情
功能特性
- ✅ 完成日期 + 通过状态过滤:按审批「通过时间」范围(完成日期)过滤已通过单据;因企业微信仅支持按提交时间拉取,插件采用「回溯拉取 + 客户端按通过时间精确过滤」
- ✅ 多条件过滤:审批状态(默认「已通过」)、审批模板、申请人、部门、审批类型
- ✅ 直接查单:支持按审批单号(可多个,逗号分隔)跳过批量查询直接取详情
- ✅ 自动分页:基于
new_cursor/new_next_cursor游标分页,pageSize上限 100 - ✅ 容错与限流:access_token 缓存与过期自动刷新、接口限流(45009/45033)指数退避重试、网络错误重试、业务错误码解析
- ✅ 结构化输出:字段命名清晰、层级合理,并额外附加
_text可读时间与扁平化内容明细,兼容 N8N 数据流转
目录结构
n8n-nodes-wecom-approval/
├── package.json # n8n 注册块(nodes/credentials 入口)
├── tsconfig.json
├── credentials/
│ └── WeComApprovalApi.credentials.ts # 企业微信凭证(corpid / secret / agentid)
├── nodes/
│ └── WeComApproval/
│ ├── WeComApproval.node.ts # 节点实现
│ ├── WeComApproval.node.json # codex 元数据
│ └── wecomapproval.svg # 节点图标
├── scripts/
│ └── copy-assets.js # 构建后复制图标等静态资源
└── README.md
安装
1. 开发 / 本地安装
cd n8n-nodes-wecom-approval
npm install
npm run build # 输出到 dist/
# 将包链接到 n8n 的自定义节点目录(目录不存在则先创建)
mkdir -p ~/.n8n/custom
cd ~/.n8n/custom
npm link n8n-nodes-wecom-approval
然后启动 n8n(n8n start),在节点面板搜索「企业微信审批导出」即可。
2. 通过 n8n 社区节点安装(发布到 npm 后)
在 n8n 的 Settings → Community Nodes 中安装包名 n8n-nodes-wecom-approval。
凭证配置
新建「企业微信审批 API」凭证,填写:
| 字段 | 必填 | 说明 |
|---|---|---|
| 企业 ID(corpid) | ✅ | 「管理后台 - 我的企业 - 企业信息」中的企业 ID |
| 应用密钥(secret) | ✅ | 审批应用或已授权自建应用的 secret |
| AgentID | ⬜ | 可选,审批查询主要用 corpid + secret |
权限前置条件(重要)
调用审批接口前,需要在企业微信管理后台完成以下授权:
- 管理后台 → 应用管理 → 审批 → API → 可调用应用:将自建应用加入列表
- 管理后台 → 应用管理 → 审批 → API → 审批数据权限:授权应用允许查询审批单据
- 自建应用只能获取「应用可见范围内」成员提交的审批单
自 2023-12-01 起,不再支持使用系统应用 secret 调用审批接口,请使用审批应用或已授权的自建应用 secret。
节点参数
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
| 完成日期-开始 | dateTime | ✅ | — | 审批通过时间范围起点(通过时间 ≥ 此时间) |
| 完成日期-结束 | dateTime | ✅ | — | 审批通过时间范围终点(须晚于起点) |
| 拉取回溯天数 | number | ⬜ | 90 | 从完成日期起点向前回溯 N 天拉取提交记录,覆盖审批周期较长的单据 |
| 审批状态 | options | ⬜ | 已通过(2) | 1 审批中 / 2 已通过 / 3 已驳回 / 4 已撤销 / 6 通过后撤销 / 7 已删除 / 10 已支付 / 不限 |
| 审批模板 ID | string | ⬜ | 空 | filters.template_id |
| 申请人 userid | string | ⬜ | 空 | filters.creator |
| 部门 ID | string | ⬜ | 空 | filters.department |
| 审批类型 | options | ⬜ | 不限 | 请假/补卡/出差/外出/加班/调班/会议室/退款/红包报销 |
| 直接查询审批单号 | string | ⬜ | 空 | 填写后跳过日期范围查询,逗号分隔多个 |
| 获取审批详情 | boolean | ⬜ | true | 关闭仅返回单号列表 |
| 每页数量 | number | ⬜ | 100 | 企业微信上限 100 |
| 最大分页数 | number | ⬜ | 0 | 安全阀,0 为不限制 |
| 输出模式 | options | ⬜ | splitItems | 每条一个 Item / 合并单个 Item |
| 输出可读时间 | boolean | ⬜ | true | 附加 *_text 北京时间字段 |
输出 JSON 结构
输出模式:每条记录一个 Item(默认)
每条审批记录对应一个 item,json 结构如下:
{
"sp_no": "202409010001",
"sp_name": "请假申请",
"template_id": "ZLqk8pcsAoaXZ1eY56vpAgfX28MPdYU3ayMaSPHaaa",
"sp_status": 2,
"sp_status_text": "已通过",
"record_type": "1",
"record_type_text": "请假",
"apply_userid": "zhangsan",
"apply_partyid": 1,
"apply_time": 1725156000,
"apply_time_text": "2024-09-01 10:00:00",
"approve_time": 1725160000,
"approve_time_text": "2024-09-01 11:06:40",
"approver_userids": ["lisi"],
"content": [
{
"control": "Text",
"id": "Text-15111111111",
"title": "请假事由",
"value": { "text": "家中有事" },
"value_text": "家中有事"
},
{
"control": "DateRange",
"id": "DateRange-15111111112",
"title": "请假时间",
"value": {
"date_range": {
"type": "day",
"new_begin": 1725156000,
"new_end": 1725242400,
"new_duration": 86400
}
},
"value_text": "2024-09-01 10:00:00 ~ 2024-09-02 10:00:00"
}
],
"approval_steps": [
{
"sp_status": 2,
"sp_status_text": "已通过",
"approverattr": 1,
"approverattr_text": "或签",
"details": [
{
"userid": "lisi",
"speech": "同意",
"sp_status": 2,
"sp_status_text": "已通过",
"sptime": 1725160000,
"sptime_text": "2024-09-01 11:06:40",
"media_id": []
}
]
}
],
"notifyer": [],
"comments": [],
"apply_data": {
"contents": [
{
"control": "Text",
"id": "Text-15111111111",
"value": { "text": "家中有事" }
}
]
}
}
输出模式:合并为单个 Item
{
"summary": {
"total": 128,
"generated_at": "2024-09-01T12:00:00.000Z"
},
"records": [
{ "sp_no": "202409010001", "sp_name": "请假申请", "...": "..." }
]
}
字段说明
| 字段 | 类型 | 说明 |
|---|---|---|
sp_no |
string | 审批单号 |
sp_name |
string | 审批模板名称 |
template_id |
string | 审批模板 ID |
sp_status / sp_status_text |
number / string | 审批状态(数值 / 中文) |
record_type / record_type_text |
string / string | 审批类型(数值 / 中文) |
apply_userid / apply_partyid |
string / number | 申请人 userid / 部门 |
apply_time / apply_time_text |
number / string | 申请时间(时间戳 / 可读) |
approve_time / approve_time_text |
number / string | 通过时间(时间戳 / 可读) |
approver_userids |
string[] | 审批人 userid 列表 |
content |
array | 扁平化的内容明细(control/id/title/value/value_text) |
approval_steps |
array | 审批流各节点(含每个审批人的意见、时间) |
notifyer |
array | 抄送人 |
comments |
array | 审批评论 |
apply_data |
object | 原始审批申请数据(保真) |
说明:
value_text对常见控件(文本、数字、金额、单选/多选、成员、日期、时长等)做了可读文本提取,便于下游组件直接引用;复杂控件(明细表、假勤、附件等)会以 JSON 字符串形式返回,原始完整结构见apply_data。
企业微信 API 说明
| 接口 | 方法 | 频率限制 | 说明 |
|---|---|---|---|
/cgi-bin/gettoken |
GET | — | 获取 access_token,有效期 7200s |
/cgi-bin/oa/getapprovalinfo |
POST | 600 次/分 | 批量获取审批单号,单次最多 100 条 |
/cgi-bin/oa/getapprovaldetail |
POST | 600 次/分 | 获取审批单详情 |
约束:
starttime ~ endtime时间跨度不能超过 31 天(本插件自动切分)- 单次拉取审批单号上限 100(本插件自动分页)
- 自建应用只能获取应用可见范围内申请人提交的表单
getapprovalinfo的starttime/endtime仅支持按「提交时间」过滤,不支持按通过时间过滤;因此本插件的「完成日期」过滤 = 按提交时间回溯拉取(完成日期起点 - 回溯天数至完成日期终点)+ 拉取详情后按approve_time精确过滤,回溯天数由「拉取回溯天数」参数控制(默认 90 天)
开发
npm install
npm run build # 编译到 dist/
npm run lint # 代码检查
常见错误码
| errcode | 说明 | 处理建议 |
|---|---|---|
| 301055 | 无审批应用数据拉取权限 | 在「审批 - API - 审批数据权限」授权应用 |
| 301025 | 请求参数错误 | 检查日期/过滤条件格式 |
| 301026 | 批量拉取审批单内部接口失败 | 重试 |
| 301112 | 时间范围过大 | 缩小查询时间范围(本插件已自动切分) |
| 42001 / 42007 | access_token 过期/无效 | 自动刷新后重试 |
| 45009 / 45033 | 接口调用频率/并发超限 | 自动指数退避重试 |
License
MIT