钉钉机器人接入中,你应该知道的一些坑

常见错误问题

图片不展示

  • 图片必须是网络路径,本地路径的图片,base64好像是不行的

@指定的人不成功

以markdown格式举例,常用的@指定人的方式,一种是手机号,一种是通过userId来指定的

手机号@指定的人

手机号@指定的人,在atMobiles中填入手机号后,一定要在text字段中拼接手机号信息

  {
    "msgtype": "markdown",
    "markdown": {
      "title": `打包发布通知`,
      "text": `#### 应用发布成功 @150xxxxxxxx \n > ...`,
    },
    "at": {
      "atMobiles": ['150xxxxxxxx'],
      "atDingtalkIds": [],
      "isAtAll": false
    }
  }
userId@指定的人

userId@指定的人,官方文档好像没及时更新,使用atUserIds字段一直不会成功通知,换为atDingtalkIds就可以了。同时,userId的信息也需要拼接再text字段中

  {
    "msgtype": "markdown",
    "markdown": {
      "title": `打包发布通知`,
      "text": `#### 应用发布成功 @userId1,@userId2 \n > ...`,
    },
    "at": {
      "atMobiles": [],
      "atDingtalkIds": ['userId1', 'userId2'],
      "isAtAll": false
    }
  }

text字段中文本换行错误

对于多行文本换行,应该通过**\n\n**来换行

  const msgs = ['commit记录1', 'commit记录2', 'commit记录3']
  const desc = msgs.join('\n\n')
  {
    "msgtype": "markdown",
    "markdown": {
      "title": `打包发布通知`,
      "text": `#### 应用发布成功 ${desc}`,
    },
    "at": {
      "atMobiles": [],
      "atDingtalkIds": [],
      "isAtAll": false
    }
  }

使用方式

我这边是在node中做的钉钉机器人发送通知

  // robot.js
  #!/usr/bin/env node
  const https = require('https');

  module.exports = function(token) {
    return {
      send: function(message, callback) {
        const postData = JSON.stringify(message);
        const options = {
          hostname: 'api.dingtalk.com',
          port: 443,
          path: '/robot/send?access_token=' + token,
          method: 'POST',
          headers: {
            'Content-Type': 'application/json'
          }
        };
        const request = https.request(options, function(response) {
          const data = [];
          let count = 0;
          response.setEncoding('utf8');

          response.on('data', function(chunk) {
            data.push(chunk);
            count += chunk.length;
          });

          response.on('end', function() {
            let buffer;
            const length = data.length;

            if (length == 0) {
              buffer = new Buffer(0);
            } else if (length == 1) {
              buffer = data[0];
            } else {
              buffer = new Buffer(count);
              for (let index = 0, position = 0; index < length; index++) {
                let chunk = data[index];
                chunk.copy(buffer, position);
                position += chunk.length;
              }
            }

            const datastring = buffer.toString();
            const result = JSON.parse(datastring);
            if (result.errcode) {
              return callback(new Error(result.errmsg));
            }

            return callback(null, result);
          });
        });
        request.on('error', callback);

        request.write(postData);
        request.end();
      }
    };
  };
  // index.js
  #!/usr/bin/env node
  const robot = require('./robot')

  const robotConfig = {
    token: '',
    // 需要@人员手机号
    atMobiles: [],
    // 被@人的用户ID
    atUserIds: [],
    // 是否需要@所有人
    isAtAll: false,
    // 指定打包机器人
    robot: 1,
    // 打包编译开启进程数
    threads: 8,
    // 钉钉群通知关键字
    keyword: ['发布'],
  };

  const dingdingMessage = () => {
  const { token, atMobiles = [], atUserIds = [], isAtAll = false, keyword = [] } = robotConfig || {}
  const msgs = ['commit记录1', 'commit记录2', 'commit记录3'].join('\n\n')
  if (!token) {
    console.log('------钉钉机器人token不存在------')
    return false
  }
  if (!keyword.length) {
    console.log('------请填写钉钉机器人关键字------')
    return false
  }
  // 手机号列表
  const notify = atMobiles.length ? atMobiles.map(item => `@${item}`) : ''
  // userId列表
  const userIdList = atUserIds.length ? atUserIds.map(item => `@${item}`) : ''
  // 关键字列表
  const keywordList = keyword.join('')
  robot(token).send(
  {
    "msgtype": "markdown",
    "markdown": {
      "title": `打包发布通知${keywordList}`,
      "text": `#### 应用${projectConfig.projectname}发布${type ? '成功' : '失败'} ${notify} ${userIdList} \n > ${config.desc} \n\n 最近三条提交: \n\n ${msgs}`,
    },
    "at": {
      "atMobiles": atMobiles,
      "atDingtalkIds": atUserIds,
      "isAtAll": isAtAll
    }
    }, (err, data) => {
      if (err) {
        if (err.toString().indexOf('keywords not in content') !== -1) {
          console.log('------机器人关键词不匹配,请修改------')
        } else {
          console.error(err);
        }
        return
      }
      console.log(data);
      if (data.errcode === 0) {
        process.exit()
      }
    })
  }
<think>嗯,用户问的是如何接入钉钉机器人,我需要一步步解释清楚。首先,我得确定用户的使用场景,可能是企业或团队需要自动化通知,比如监控报警、任务提醒之类的。用户可能是开发人员或者管理员,需要技术指导。 首先,应该从创建钉钉机器人开始。要说明在钉钉群设置里找到智能群助手,然后添加机器人。这里需要详细步骤,比如选择自定义机器人,设置名字和安全设置。安全设置部分很重要,要解释加签和IP地址两种方式,以及如何生成签名。 然后,获取Webhook地址,用户需要这个地址来发送消息。接下来要给出一个发送消息的示例,用Python代码比较通用。代码里要包含时间戳和签名的生成方法,特别是加签的部分,因为用户可能在这里容易出错。还要提醒用户替换关键参数,比如access_token和secret。 最后,可能还需要提到注意事项,比如消息类型和支持的格式,以及安全建议。用户可能还想知道更多高级功能,比如不同消息类型的使用,或者如何优化通知。这部分可以作为扩展,但先确保基本流程清晰。</think>好的,我将分步骤为您讲解如何接入钉钉机器人: 一、创建钉钉机器人 1. 打开钉钉群设置 - 进入目标钉钉群 → 右上角「群设置」→「智能群助手」 2. 添加机器人 - 选择「添加机器人」→「自定义机器人」 - 设置机器人名称(例:监控报警机器人) - 选择安全设置(推荐以下两种): $$ \text{加签(Secret)}:需保存生成的密钥 $$ $$ \text{IP地址(段)}:限制调用来源IP $$ 3. 获取Webhook地址 - 创建完成后会生成类似URL: $$ \text{https://oapi.dingtalk.com/robot/send?access_token=xxxxxx} $$ 二、发送消息示例(Python) ```python import requests import time import hmac import hashlib import base64 import urllib.parse def send_dingtalk_message(): # 配置参数 access_token = "your_token" secret = "your_secret" timestamp = str(round(time.time() * 1000)) # 生成签名 secret_enc = secret.encode('utf-8') string_to_sign = f"{timestamp}\n{secret}" string_to_sign_enc = string_to_sign.encode('utf-8') hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest() sign = urllib.parse.quote_plus(base64.b64encode(hmac_code)) # 构造请求URL webhook = f"https://oapi.dingtalk.com/robot/send?access_token={access_token}&timestamp={timestamp}&sign={sign}" # 发送消息 headers = {"Content-Type": "application/json"} data = { "msgtype": "text", "text": { "content": "服务器CPU使用率超过90%!" } } response = requests.post(webhook, json=data, headers=headers) return response.json() ``` 三、注意事项 1. 消息类型支持: - Text(文本) - Markdown - Link(链接) - ActionCard(交互卡片) 2. 频率限制: $$ \text{每个机器人每分钟最多发送20条消息} $$ 3. 安全建议: - 优先使用加签方式 - 敏感信息建议加密传输 - 生产环境推荐绑定IP白名单 扩展应用场景: - 系统监控报警(如:使用Zabbix+钉钉机器人) - CI/CD流水线通知 - 每日报表推送 - 审批流程提醒 建议测试时先用测试群,验证消息格式和接收情况后再部署到生产环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值