學(xué)習(xí) Python 有段時間了,但總覺得欠缺點什么,想來想去還是缺少實戰(zhàn)的演練,編程從來都不是紙上談兵就能搞定的事情,必須從實踐中提高自己的熟練度和水平。
剛好最近有個想法,需要定時從某個網(wǎng)站上爬取一些有用的信息,然后通過釘釘推送。
關(guān)于釘釘開放API 我們這里不做過多的講述,想了解更多信息,可以 點擊這里 跳轉(zhuǎn)官網(wǎng)進行詳細(xì)了解。
這里我們將整個過程分為三步:
- 建立自己的釘釘消息接受群;
- 申請機器人;
- 通過Python 進行消息推送。
下面我們就這三部分別演示。
1. 建立消息群
在申請群之前首先要登錄釘釘賬號,然后建立自己的群聊,如下圖所示。
建立群聊

選擇群類型

然后一步步按照提示走下去即可。
2. 申請機器人
群申請成功之后,我們可以點擊群右上角的設(shè)置按鈕,進行機器人的申請和配置,如下圖所示:

點擊里面的 群智能助手 進行機器人的申請。

這里有很多機器人類型,我們選擇自定義機器人。這里已經(jīng)添加好了,就不再做演示,直接看機器人配置部分。

機器人配置主要看兩部分,一個是訪問地址及 Token 的獲取,另一個是 安全設(shè)置,前者保證你能將消息準(zhǔn)確發(fā)送到剛才新建的群里面,后者保證只有在滿足你設(shè)定的攔截條件后消息才能發(fā)送到群里面。
前者的樣式如下:
# xxx 代表具體的 token,每個群不一樣
https://oapi.dingtalk.com/robot/send?access_token=xxx
釘釘通過三種方式保證消息的安全發(fā)送,即下圖所示的關(guān)鍵字、加簽及 IP 白名單

我們這里選擇用第二種方式——加簽,需要將上圖中的 Webhook 地址 和 加簽 的內(nèi)容進行復(fù)制,等下第三步要用到。
3. 通過Python 進行消息推送
在官網(wǎng)上我們能夠找到 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)
以上代碼是加簽過程,其中用到的 secret 就是我們在第二部復(fù)制的加簽內(nèi)容,而最終生成的 timestamp 及 sign 就是我們要拼接到 webhook 地址后面的內(nèi)容。
要想成功發(fā)送消息到釘釘,加簽只是其中一步,接下來就需要通過 Python 發(fā)送消息。我們提供完整的示例代碼。
import json
import time
import hmac
import hashlib
import base64
import urllib.parse
import requests
def send(msg):
headers = {'Content-Type': 'application/json', "Charset": "UTF-8"}
# 這里替換為復(fù)制的完整 webhook 地址
prefix = 'https://oapi.dingtalk.com/robot/send?access_token=xxx '
timestamp = str(round(time.time() * 1000))
# 這里替換為自己復(fù)制過來的加簽秘鑰
secret = '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))
url = f'{prefix}×tamp={timestamp}&sign={sign}'
# 釘釘消息格式,其中 msg 就是我們要發(fā)送的具體內(nèi)容
data = {
"at": {
"isAtAll": False
},
"text": {
"content": msg
},
"msgtype": "text"
}
return requests.post(url=url, data=json.dumps(data), headers=headers).text
send("我就是我,顏色不一樣的火")
上述代碼中,除了漢字備注的部分,其余可視為固定寫法。
接下來,我們在 Python 環(huán)境中執(zhí)行代代碼,釘釘群里便可收到消息。
python3 dingding.py
