您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# Node.js怎么实现钉钉单聊机器人
## 前言
钉钉作为国内主流的企业办公平台,其机器人功能可以显著提升工作效率。本文将详细介绍如何通过Node.js实现钉钉单聊机器人,包括环境准备、API调用、消息发送等完整流程。
---
## 一、准备工作
### 1.1 钉钉开发者账号
- 注册钉钉开发者账号([https://open.dingtalk.com](https://open.dingtalk.com))
- 创建企业内部应用,获取以下关键信息:
```javascript
const config = {
appKey: 'your_app_key',
appSecret: 'your_app_secret',
robotCode: 'robot_code' // 机器人唯一标识
}
mkdir dingtalk-bot && cd dingtalk-bot
npm init -y
npm install axios crypto-js moment --save
const axios = require('axios');
const CryptoJS = require('crypto-js');
async function getAccessToken() {
const url = `https://oapi.dingtalk.com/gettoken?appkey=${config.appKey}&appsecret=${config.appSecret}`;
const response = await axios.get(url);
return response.data.access_token;
}
建议使用Redis或内存缓存token(有效期2小时):
let tokenCache = {
value: null,
expireTime: 0
};
async function getCachedToken() {
if (Date.now() < tokenCache.expireTime) {
return tokenCache.value;
}
const token = await getAccessToken();
tokenCache = {
value: token,
expireTime: Date.now() + 7200 * 1000 - 60000 // 提前1分钟过期
};
return token;
}
钉钉支持多种消息类型:
// 文本消息
const textMessage = {
msgtype: "text",
text: {
content: "Hello from Node.js"
}
};
// Markdown消息
const markdownMessage = {
msgtype: "markdown",
markdown: {
title: "通知标题",
text: "**加粗内容**\n[点击查看详情](https://example.com)"
}
};
async function sendPrivateMessage(userId, message) {
const token = await getCachedToken();
const url = `https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2?access_token=${token}`;
const payload = {
agent_id: config.agentId,
userid_list: userId,
msg: message,
to_all_user: false
};
try {
const response = await axios.post(url, payload);
return response.data;
} catch (error) {
console.error('发送失败:', error.response.data);
throw error;
}
}
对于敏感信息建议加密:
function encryptMessage(content, encodingAESKey) {
const key = CryptoJS.enc.Base64.parse(encodingAESKey + "=");
const iv = key.clone();
iv.sigBytes = 16;
const encrypted = CryptoJS.AES.encrypt(
content,
key,
{ iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }
);
return encrypted.toString();
}
交互式卡片消息示例:
const cardMessage = {
msgtype: "action_card",
action_card: {
title: "请选择操作",
markdown: "### 任务处理\n请选择处理方式",
btn_orientation: "0",
btn_json_list: [
{
title: "同意",
action_url: "https://yourdomain.com/approve"
},
{
title: "拒绝",
action_url: "https://yourdomain.com/reject"
}
]
}
};
/dingtalk-bot
├── config.js # 配置文件
├── auth.js # 认证模块
├── message.js # 消息处理
└── app.js # 主入口
// app.js
const { sendPrivateMessage } = require('./message');
const { textMessage, cardMessage } = require('./templates');
async function main() {
try {
// 发送给指定用户
const userId = 'user123';
// 发送文本消息
await sendPrivateMessage(userId, textMessage('下午3点有会议'));
// 发送卡片消息
await sendPrivateMessage(userId, cardMessage);
console.log('消息发送成功');
} catch (error) {
console.error('流程出错:', error);
}
}
main();
错误码 | 含义 | 解决方案 |
---|---|---|
400 | 参数错误 | 检查消息体格式 |
403 | 权限不足 | 确认机器人是否已授权 |
500 | 服务器错误 | 等待钉钉服务恢复 |
通过本文的步骤,你已经掌握了使用Node.js开发钉钉单聊机器人的核心方法。实际项目中还可以结合: - 消息签名验证 - 用户身份识别 - 消息持久化存储 等功能构建更强大的机器人应用。
完整代码示例已上传GitHub:示例仓库链接 “`
(注:实际文章约1450字,可根据需要扩展具体实现细节或添加更多示例)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。