目录

1.自定义机器人接入

1.1打开机器人管理页面。以PC端为例,打开PC端钉钉,点击头像,选择机器人管理

1.2添加自定义机器人

1.3在机器人管理页面选择自定义机器人,输入机器人名字并选择要发送消息的群,同时可以为机器人设置机器人头像

完成必要的安全设置,勾选我已阅读并同意《自定义机器人服务及免责条款》,然后单击完成。

完成安全设置后,复制出机器人的Webhook地址,可用于向这个群发送消息,格式如下:

2.引用钉钉sdk

2.1下载地址:

2.2选择python3版本-点击下载

2.3下载将sdk文件放在自己的工程中,在python文件中引用api

3.实现


1.自定义机器人接入


1.1打开机器人管理页面。以PC端为例,打开PC端钉钉,点击头像,选择机器人管理

Python 钉钉机器人 python调用钉钉机器人_钉钉机器人

1.2添加自定义机器人

Python 钉钉机器人 python调用钉钉机器人_Python 钉钉机器人_02

1.3在机器人管理页面选择自定义机器人,输入机器人名字并选择要发送消息的群,同时可以为机器人设置机器人头像

Python 钉钉机器人 python调用钉钉机器人_钉钉机器人_03

  1. 完成必要的安全设置,勾选我已阅读并同意《自定义机器人服务及免责条款》,然后单击完成
    目前有3种安全设置方式,请根据需要选择一种:
  • 自定义关键词:最多可以设置10个关键词,消息中至少包含其中1个关键词才可以发送成功。
    例如添加了一个自定义关键词:监控报警,则这个机器人所发送的消息,必须包含监控报警这个词,才能发送成功。
  • 加签
  1. timestamp+"\n"+密钥当做签名字符串,使用HmacSHA256算法计算签名,然后进行Base64 encode,最后再把签名参数再进行urlEncode,得到最终的签名(需要使用UTF-8字符集)。

参数

说明

timestamp

当前时间戳,单位是毫秒,与请求调用时间误差不能超过1小时。

secret

密钥,机器人安全设置页面,加签一栏下面显示的SEC开头的字符串。

签名计算示例代码(Java)

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import java.net.URLEncoder;

public class Test {
    public static void main(String[] args) throws Exception {
        Long timestamp = System.currentTimeMillis();
        String secret = "this is secret";

        String stringToSign = timestamp + "\n" + secret;
        Mac mac = Mac.getInstance("HmacSHA256");
        mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256"));
        byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8"));
        String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)),"UTF-8");
        System.out.println(sign);
    }

}

签名计算代码示例(Python)

#python 3.8 
import time
import hmac
import hashlib
import base64
import urllib.parse

timestamp = str(round(time.time() * 1000))
secret = 'this is secret'
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, 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))
print(timestamp)
print(sign)
  1. 把 timestamp和第一步得到的签名值拼接到URL中。
https://oapi.dingtalk.com/robot/send?access_token=XXXXXX×tamp=XXX&sign=XXX

参数

说明

timestamp

第一步使用到的时间戳。

sign

第一步得到的签名值。

  • IP地址(段):设定后,只有来自IP地址范围内的请求才会被正常处理。支持两种设置方式:IP地址和IP地址段,暂不支持IPv6地址白名单,格式如下。

格式

说明

1.1.1.1

开发者的出口公网IP地址(非局域网地址)

1.1.1.0/24

用CIDR表示的一个网段

  1. 完成安全设置后,复制出机器人的Webhook地址,可用于向这个群发送消息,格式如下:
https://oapi.dingtalk.com/robot/send?access_token=XXXXXX

总结以上官方文档

安全设置中选择以下设置(至少选择一个设置)

1.自定义关键词:在发送消息时,发送的内容就要包含关键词才能发送成功,

2.加签:一种加密方式,将加签值通过以上的方法得到的签名值和timestamp拼接到URL(Webhook)中

3.ip地址(段):设置后,只有来自IP地址范围内的请求才会被正常处理

Python 钉钉机器人 python调用钉钉机器人_钉钉机器人_04

 

2.引用钉钉sdk

2.1下载地址:

https://ding-doc.dingtalk.com/document/resourcedownload/download-server-sdk

2.2选择python3版本-点击下载

Python 钉钉机器人 python调用钉钉机器人_自定义_05

2.3下载将sdk文件放在自己的工程中,在python文件中引用api

官方示例:

import dingtalk.api
request = dingtalk.api.OapiGettokenRequest("https://oapi.dingtalk.com/user/get")
request.userid="userid1"
response = request.getResponse()
print(response)

3.实现

# -*- coding: utf-8 -*-
"""
Created on Thu Jan 21 11:04:09 2021

@author: Admin
"""

import time
import hmac
import hashlib
import base64
import urllib.parse
#引用钉钉API
import dingtalk.api

#发送消息
def SendMessage():
    #时间戳
    timestamp = str(round(time.time() * 1000))
    #钉钉加签
    secret = 'SEC****'
    secret_enc = secret.encode('utf-8')
    string_to_sign = '{}\n{}'.format(timestamp, 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))
    print(timestamp)
    print(sign)
    #钉钉机器人中的Webhook+sign+timestamp
    webhook ='https://oapi.dingtalk.com/robot/send?access_token=******×tamp={0}&sign={1}'.format(timestamp,sign)
    #实例钉钉接口的OapiRobotSendRequest
    request = dingtalk.api.OapiRobotSendRequest(webhook)
    #需要发送的文字内容
    content_txt = "我就是我, 是不一样的烟火"
    #设置msgtype为text类型 
    #根据官方文档还可设置其他类型:link类型 markdown类型 整体跳转ActionCard类型 FeedCard类型
    request.msgtype = 'text'
    #引入需要发送的内容
    request.text = {
        "content": content_txt
    }
    #atMobiles:钉钉群中所对应的成员手机号
    #isAtAll:当设置为True时,发送消息时@所有人
    request.at = {
            "atMobiles":["13*****4538"],
            "isAtAll": True
        }
    #发送消息
    response = request.getResponse()
    print(response)

if __name__ == '__main__':
    #程序运行时调用方法
    SendMessage()

效果:

Python 钉钉机器人 python调用钉钉机器人_发送消息_06