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="...>%20%E6%97%A0%E6%95%88 %0A - %E8%B0%83%E8%AF%95%E6%97%B6%E5%85%88%E5%8F%91%E6%9C%80%E7%AE%80%20text%20%E6%B6%88%E6%81%AF%E7%A1%AE%E8%AE%A4%E9%80%9A%E8%B7%AF%EF%BC%8C%E5%86%8D%E9%80%90%E6%AD%A5%E5%8A%A0%20Markdown%20%E6%A0%B7%E5%BC%8F %0A










