基於Python實現開發釘釘通知機器人

在項目協同工作或自動化流程完成時,我們需要用一定的手段通知自己或他人。比如說,當服務器CPU使用率達到90%,發送告警信息給多名項目成員、或是股票自動化交易成交時發送通知給自己等應用場景。通知的手段有很多,使用郵件、Telegram都可以實現,但是它們都有各自的缺點。

郵件通知的方式存在滯後性,而且容易覆蓋掉一些重要的郵件,整理起來非常繁瑣。Telegram 非常好用,幾個步驟就能創建一個機器人,可惜在國內無法使用,需要添加代理才能使用。

不過,前幾天發現釘釘的機器人其實和Telegram的相差無幾,用起來也相當舒服,因此今天給大傢帶來一個開發釘釘通知機器人的教程,非常簡單,門檻極低,任何人都能用,每個人都能學會。

1.準備

開始之前,你要確保Python和pip已經成功安裝在電腦上,如果沒有,可以訪問這篇文章:超詳細Python安裝指南 進行安裝。

(可選1) 如果你用Python的目的是數據分析,可以直接安裝Anaconda,它內置瞭Python和pip.

(可選2) 此外,推薦大傢用VSCode編輯器,它有許多的優點

Python 環境準備完成後,我們就可以來創建一個釘釘機器人瞭。

1.1 打開釘釘軟件,選擇 "", 再點擊右上角+號,選擇建場景群

1.2 這裡可以選擇任意一種群,我選擇瞭培訓群

1.3 群新建好後,點擊右上角的齒輪—群設置,點擊智能群助手。這裡你也可以修改群的名字,點擊名字右邊的鉛筆就能修改群名。

1.4 點擊添加機器人

1.5 點擊右上角的+號

1.7 然後輸入機器人名字,安全設置選擇加簽,這一字符串你需要拷貝下來,發通知的時候就是我們的 SECRET KEY.

1.8 點擊完成後,會彈出創建成功的框框,請把這串webhook的鏈接拷貝下來,並將access_token參數復制下來,這一串 access_token 我們發送消息的時候也需要用到。

機器人創建完畢後,會在群聊中出現,然後我們就可以開始編寫通知代碼瞭。

2.Python 釘釘機器人通知代碼

我們通過往 https://oapi.dingtalk.com/robot/send 地址發送 POST 請求的方式就能夠利用釘釘自定義機器人發送消息。釘釘機器人支持兩種消息內容:

  • 1. 純文本信息
  • 2. Markdown信息

簡單來講,如果你的消息隻有文本內容,就用第一種。如果你的消息內含圖片和自定義格式,就用第二種。

純文本消息,你的內容需要包含以下3種參數,並帶2個內容體:

參數列表:

  • 1. access_token: 創建成功後返回的webhook鏈接裡就有這個參數。
  • 2. sign: 就是我們選擇加簽安全設置中返回的SECRET.
  • 3. timestamp: 當前時間戳。

內容體包含:

  • 1. msgtype: 消息內容 text/markdown
  • 2. text: 文本內容

代碼如下,非常簡單:

# Python實用寶典
# 2021/11/13
import json
import hashlib
import base64
import hmac
import os
import time
import requests
from urllib.parse import quote_plus


class Messenger:
    def __init__(self, token=os.getenv("DD_ACCESS_TOKEN"), secret=os.getenv("DD_SECRET")):
        self.timestamp = str(round(time.time() * 1000))
        self.URL = "https://oapi.dingtalk.com/robot/send"
        self.headers = {'Content-Type': 'application/json'}
        secret = secret
        secret_enc = secret.encode('utf-8')
        string_to_sign = '{}\n{}'.format(self.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()
        self.sign = quote_plus(base64.b64encode(hmac_code))
        self.params = {'access_token': token, "sign": self.sign}

    def send_text(self, content):
        """
        發送文本
        @param content: str, 文本內容
        """
        data = {"msgtype": "text", "text": {"content": content}}
        self.params["timestamp"] = self.timestamp
        return requests.post(
            url=self.URL,
            data=json.dumps(data),
            params=self.params,
            headers=self.headers
        )

使用的時候,請註意token和secret你既可以通過環境變量配置,也可以直接傳入給Messenger:

if __name__ == "__main__":
    m = Messenger(
        token="你的token",
        secret="你的secret"
    )
    m.send_text("測試一下,今天天氣不錯")

然後運行這個腳本,就能獲取消息通知:

如果你隻需要文本通知,那麼到這裡就已經實現瞭,如果你還需要發送圖文消息或更多自定義內容體,請看下面的內容。

3.釘釘機器人支持Markdown

為瞭支持發送圖片消息和自定義的文字格式,我們需要配置更多的參數:

def send_md(self, title, content):
    """
    發送Markdown文本
    @param title: str, 標題
    @param content: str, 文本內容
    """
    data = {"msgtype": "markdown", "markdown": {"title": title, "text": content}}
    self.params["timestamp"] = self.timestamp
    return requests.post(
        url=self.URL,
        data=json.dumps(data),
        params=self.params,
        headers=self.headers
    )

msgtype參數改為markdown,並配置markdown的參數,包括:

  • 1. title: 標題
  • 2. content: markdown內容

這樣,就能支持發送markdown消息瞭,我們試一下:

# Python實用寶典
# 2021/11/13
import json
import hashlib
import base64
import hmac
import os
import time
import requests
from urllib.parse import quote_plus


class Messenger:
    def __init__(self, token=os.getenv("DD_ACCESS_TOKEN"), secret=os.getenv("DD_SECRET")):
        self.timestamp = str(round(time.time() * 1000))
        self.URL = "https://oapi.dingtalk.com/robot/send"
        self.headers = {'Content-Type': 'application/json'}
        secret = secret
        secret_enc = secret.encode('utf-8')
        string_to_sign = '{}\n{}'.format(self.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()
        self.sign = quote_plus(base64.b64encode(hmac_code))
        self.params = {'access_token': token, "sign": self.sign}

    def send_text(self, content):
        """
        發送文本
        @param content: str, 文本內容
        """
        data = {"msgtype": "text", "text": {"content": content}}
        self.params["timestamp"] = self.timestamp
        return requests.post(
            url=self.URL,
            data=json.dumps(data),
            params=self.params,
            headers=self.headers
        )

def send_md(self, title, content):
    """
    發送Markdown文本
    @param title: str, 標題
    @param content: str, 文本內容
    """
    data = {"msgtype": "markdown", "markdown": {"title": title, "text": content}}
    self.params["timestamp"] = self.timestamp
    return requests.post(
        url=self.URL,
        data=json.dumps(data),
        params=self.params,
        headers=self.headers
    )


if __name__ == "__main__":
    markdown_text = "\n".join(open("md_test.md", encoding="utf-8").readlines())
    m = Messenger(
        token="你的token",
        secret="你的secret"
    )
    m.send_text("測試一下,今天天氣不錯")
    m.send_md("測試Markdown", markdown_text)

效果如下:

效果還是不錯的,速度也非常快,一運行腳本,馬上就能收到通知消息。大傢可以在Python實用寶典公眾號後臺回復 釘釘 下載本文源代碼,也可以在下面的github鏈接中找到源代碼:https://github.com/Ckend/dd_notice

到此這篇關於基於Python實現開發釘釘通知機器人的文章就介紹到這瞭,更多相關Python釘釘通知機器人內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: