Webhooks
实时接收项目中的关键事件通知
通过 Webhook,您可以实时接收云词项目中的关键事件通知,实现与第三方系统的集成。目前 Webhooks 仅支持项目级别的配置。
支持的事件
以下是云词当前支持的 Webhook 事件列表(文案相关):
| 事件 | 说明 |
|---|---|
key.created | 创建文案 |
key.deleted | 删除文案 |
key.updated | 更新文案 |
key.imported | 导入文案 |
key.tags.created | 批量添加标签 |
key.tags.deleted | 批量删除标签 |
请求说明
当发生您订阅的事件时,云词会向您配置的 URL 发送一个 POST 请求。
请求头 (Headers)
请求包含以下自定义 HTTP 头,用于验证和识别请求:
| Header 字段 | 说明 | 示例值 |
|---|---|---|
User-Agent | 标识请求来源 | YunDict-Webhook/1.0 |
Content-Type | 数据格式,固定为 JSON | application/json |
X-YunDict-Event | 触发此次 Webhook 的事件类型 | project.created |
X-YunDict-Signature | (可选) HMAC-SHA256 签名,仅在设置 Secret 时存在 | d3b07384d113... |
安全验证 (签名)
如果在配置 Webhook 时设置了 Secret,我们会使用该 Secret 对请求体(Payload)进行 HMAC-SHA256 签名,并将签名值放在 X-YunDict-Signature 头中。
验证步骤:
- 获取请求头中的
X-YunDict-Signature - 使用您设置的 Secret 和接收到的原始请求体(JSON 字符串),计算 HMAC-SHA256 哈希值
- 将计算出的哈希值(hex 格式)与
X-YunDict-Signature进行比对。如果一致,则请求来自云词
Node.js 示例代码:
const crypto = require('crypto');
function verifySignature(payload, secret, signature) { const hash = crypto .createHmac('sha256', secret) .update(JSON.stringify(payload)) .digest('hex'); return hash === signature;}Python 示例代码:
import hmacimport hashlibimport json
def verify_signature(payload, secret, signature): hash_value = hmac.new( secret.encode(), json.dumps(payload).encode(), hashlib.sha256 ).hexdigest() return hash_value == signature数据格式 (Payload)
请求体是一个 JSON 对象,包含事件的详细信息。我们对所有事件的数据结构进行了统一标准化。
通用结构
{ "event": "事件名称", "team": { "name": "team_identifier", "displayName": "My Team Name" }, "project": { "name": "project_identifier", "displayName": "My Project Name" }, "operator": { "name": "User Name", "email": "user@example.com", "image": "https://avatar.url..." } // ... 其他事件特定字段}字段说明:
- event: 触发的事件名称(如
key.created,key.updated) - team: 事件所属的团队信息
- project: 事件所属的项目信息
- operator: (可选) 触发该事件的操作人信息
- …: 其他字段取决于具体的事件类型(如
key对象)
示例:文案创建事件
{ "event": "key.created", "team": { "name": "my-team", "displayName": "My Awesome Team" }, "project": { "name": "website-i18n", "displayName": "Website I18n Project" }, "operator": { "name": "John Doe", "email": "john@example.com", "image": "https://..." }, "key": { "id": 123, "name": "home.title", "tags": ["home", "header"] }}示例:文案更新事件
{ "event": "key.updated", "team": { "name": "my-team", "displayName": "My Awesome Team" }, "project": { "name": "website-i18n", "displayName": "Website I18n Project" }, "operator": { "name": "Jane Smith", "email": "jane@example.com", "image": "https://..." }, "key": { "id": 123, "name": "home.title", "tags": ["home", "header"] }}响应处理
您的服务器应在接收到请求后尽快返回 2xx 状态码(如 200 OK),以确认成功接收。
- 如果在一定时间内未收到成功响应,或者返回 4xx/5xx 错误,我们会记录为发送失败
- 建议您在接收到请求后先返回响应,再异步处理耗时的业务逻辑,避免请求超时
最佳实践:
// Express.js 示例app.post('/webhook', async (req, res) => { // 1. 立即返回 200 响应 res.status(200).send('OK');
// 2. 异步处理 webhook 数据 process.nextTick(() => { const { event, team, project, operator } = req.body; // 在这里处理您的业务逻辑 handleWebhookEvent(req.body); });});配置 Webhook
您可以在项目设置中配置 Webhook:
- 进入项目的设置页面
- 找到 “Webhooks” 选项
- 点击 “添加 Webhook”
- 填写 Webhook URL 和可选的 Secret
- 选择要订阅的事件
- 保存配置
故障排查
Webhook 未收到请求
- 检查 URL 是否可从公网访问
- 确认防火墙规则允许来自云词的请求
- 查看 Webhook 配置中的发送日志
签名验证失败
- 确认使用的 Secret 与配置的一致
- 检查是否使用原始请求体进行签名计算(不要解析后再序列化)
- 确认签名算法为 HMAC-SHA256
请求超时
- 确保您的服务器能在 5 秒内返回响应
- 建议使用异步处理方式,先返回响应再处理业务逻辑