axios发钉钉请求被拒因未满足Content-Type、JSON序列化、加签等要求:必须显式JSON.stringify()、带timestamp/sign(HMAC-SHA256生成)、正确Webhook URL及群配置校验。

为什么 axios 发请求总被钉钉拒绝?
直接用 axios.post() 调钉钉机器人 Webhook 地址,大概率返回 400 Bad Request 或 403 Forbidden —— 不是因为 URL 写错,而是钉钉要求必须带 Content-Type: application/json 且 payload 必须是合法 JSON 字符串(不能是 JS 对象),同时签名验证未通过时也会拒收。
- 确保 Webhook URL 末尾带
access_token=xxx,且未过期(有效期默认 7 天) - 若启用了「自定义关键词」或「加签」,必须在请求体中包含
timestamp和sign字段,否则直接 403 -
axios默认不自动序列化对象,要显式用JSON.stringify()包裹data - 别用
fetch直接发对象,Node 的fetch(如node-fetch)同样需要手动JSON.stringify
加签模式下怎么生成 sign?
钉钉加签要求用 HMAC-SHA256 算法,把 timestamp\nsecret 作为密钥,对 timestamp 字符串做哈希,再 Base64 编码。Node 自带 crypto 模块就能搞定,不用额外装包。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- 先取当前毫秒时间戳:
const timestamp = Date.now().toString() - 拼接待签名字符串:
const stringToSign = timestamp + '\n' + 'your_secret_here' - 计算签名:
const sign = crypto.createHmac('sha256', stringToSign).update(timestamp).digest('base64') - 最终请求体必须含
timestamp和sign字段,缺一不可
VSCode 里调试时如何快速验证请求是否成功?
别等写完逻辑再跑整个服务,直接建个 send-dingtalk.js 文件,在 VSCode 终端里 node send-dingtalk.js 执行,配合断点和 console.log 观察响应。
- 响应状态码不是 200?先检查 Webhook URL 是否复制完整(尤其注意有没有多出空格或换行)
- 响应体含
"errcode": 310000表示加签失败,核对timestamp和sign是否匹配、secret 是否抄错 - 响应体含
"errcode": 0但群里没收到消息?确认机器人是否被禁言、关键词是否触发、消息类型(text/markdown)是否符合群设置 - VSCode 调试时建议加
try/catch,捕获axios的error.response?.data,比只看error.message有用得多
发送 Markdown 消息要注意什么?
钉钉 Markdown 渲染很严格:标题必须顶格、列表缩进必须是 2 空格、代码块需用三个反引号且单独成行。发错格式不会报错,但内容全变成纯文本。
- 避免在
content字段里混用 HTML 标签(钉钉不支持) -
title字段仅对markdown类型生效,且不能含换行;text类型的title会被忽略 - 链接必须用
[文字](url)格式,<a href="...>无效 - 调试时先发最简 text 消息确认通路,再逐步加 Markdown 样式

















