钉钉机器人:python发送消息-加签模式

看了一下钉钉开发文档,总体上比较简单,但是也碰到一个坑。但还是实现了。

1、代码

import time
import hmac
import hashlib
import base64
import urllib.parse
import requests
import json

URL ="https://oapi.dingtalk.com/robot/send?access_token=fe2f8af7f5c534ac74065d8ac2676cf22b5fa4a181b8e9dbb99d78*****"

 # 钉钉机器人文档说明
 # https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq

def get_timestamp_sign():
    timestamp = str(round(time.time() * 1000))
    secret = "SEC6886eee211cce899b269749c312bd38a220ef24b6f82b855c9040a13e6****" # 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: ",timestamp)
    print("sign:",sign)
    return (timestamp, sign)


def get_signed_url():
    timestamp, sign = get_timestamp_sign()
    webhook = URL + "&timestamp="+timestamp+"&sign="+sign
    return webhook

def get_webhook(mode):

    if mode == 0: # only 敏感字
       webhook = URL
    elif mode == 1 or  mode ==2 : # 敏感字和加签 或 # 敏感字+加签+ip
        # 加签: https://oapi.dingtalk.com/robot/send?access_token=XXXXXX&timestamp=XXX&sign=XXX
        webhook = get_signed_url()
    else:
        webhook = ""
        print("error! mode:   ",mode,"  webhook :  ",webhook)
    return webhook

def get_message(content,is_send_all):
    # 和类型相对应,具体可以看文档 :https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq 
    # 可以设置某个人的手机号,指定对象发送
    message = {
        "msgtype": "text", # 有text, "markdown"、link、整体跳转ActionCard 、独立跳转ActionCard、FeedCard类型等
        "text": { 
            "content": content # 消息内容
        },
        "at": {
            "atMobiles": [
                 "1862*8*****6", 
             ], 
            "isAtAll": is_send_all # 是否是发送群中全体成员
        }
    }
    print(message)
    return message

def send_ding_message(content,is_send_all):
    # 请求的URL,WebHook地址
    webhook = get_webhook(1) # 主要模式有 0 : 敏感字 1:# 敏感字 +加签 3:敏感字+加签+IP
    print("webhook: ",webhook)
    # 构建请求头部
    header = {
        "Content-Type": "application/json",
        "Charset": "UTF-8"
    }
    # 构建请求数据
    message = get_message(content,is_send_all)
    # 对请求的数据进行json封装
    message_json = json.dumps(message)
    # 发送请求
    info = requests.post(url=webhook, data=message_json, headers=header)
    # 打印返回的结果
    print(info.text)

if __name__ == "__main__":
    content     = "test,机器人测试,hello!" 
    is_send_all = False
    send_ding_message(content,is_send_all)

2、几个坑

(1) secret
在这里插入图片描述强烈建议钉钉开发文档中,在“重置”边上,加一个复制的功能。如果不加,也在旁边写一个请复制。

我的一个问题把secret是弄成了“SEC6886eee211cce899b2697”。其实,后面还有一大段呢。

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页