天天看點

Python調用飛書發送消息

機器人簡單介紹

飛書群中的自定義機器人是通過webhook的形式将你要發送的消息即時發送到群聊中

在群聊中添加機器人

進入群聊,打開群設定,找到群機器人,并點選添加機器人。選擇custom bot(自定義機器人)加入群聊。

第一步:添加該機器人進群,設定機器人頭像、名稱和描述,然後點選下一步。

第二步:配置webhook,可根據需求選擇一種及以上安全設定的方式,也可不選,複制并儲存此頁面的參數,最後點選完成。

注意:一個群總共最多可添加 15 個機器人,可以隻添加15個custom bot(自定義機器人)。

使用機器人發送消息

請保管好 webhook 位址。 不要公布在 github、部落格等可公開查閱的網站上。位址洩露後可能被惡意調用發送垃圾資訊

最基本的發送消息

# python 3.9

import json

import requests

# 你複制的webhook位址

url = "https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxxxxxx"

payload_message = {

"msg_type": "text",

"content": {

"text": "你要發送的消息"

}

headers = {

'content-type': 'application/json'

response = requests.request("post", url, headers=headers, data=json.dumps(payload_message))

print(response.text)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

帶有安全設定的發送消息

方式一、自定義關鍵詞

最多可以設定10個關鍵詞,消息中至少包含其中1個關鍵詞才可以發送成功。

例如:添加了一個自定義關鍵詞:生日提醒

則這個機器人所發送的消息,必須包含 生日提醒 這個詞,才能發送成功。

# 自定義關鍵詞key_word

key_word = "你設定的關鍵詞"

"text": key_word + "你要發送的消息"

23

24

25

方式二、ip 白名單

最多設定 10 個 ip 位址或位址段。設定後,隻有來自ip位址範圍内的請求才會被正常處理。支援兩種設定方式:ip、ip段,暫不支援ipv6位址白名單,格式如下:

格式 說明

123.12.123.123 開發者的出口公網位址(非區域網路位址)

123.12.1.* 或 123.1.1.1/24 用cidr表示法表示的一個網段

方式三、簽名校驗

!!!注意:飛書的簽名校驗與其他的群機器人(釘釘、企業微信等)簽名校驗不同!!!

簽名的算法

首先擷取到的原始參數

參數 說明

timestamp 目前時間戳,機關是秒,與請求調用時間誤差不超過1小時

secret 密鑰,機器人安全設定頁面,簽名校驗一欄下面顯示的字元串

将原始參數通過計算獲得最終的簽名

使用 hmacsha256 算法計算簽名,再進行 base64 編碼,得到最終的簽名

待簽名的字元串(msg):""(空串)

簽名所需的密鑰(key):timestamp + “\n” + secret

雜湊演算法(digestmod):sha256

簽名計算代碼示例(python)

import base64

import hmac

import time

from hashlib import sha256

timestamp = str(round(time.time()))

secret = "你的密鑰"

key = f'{timestamp}\n{secret}'

key_enc = key.encode('utf-8')

msg = ""

msg_enc = msg.encode('utf-8')

hmac_code = hmac.new(key_enc, msg_enc, digestmod=sha256).digest()

sign = base64.b64encode(hmac_code).decode('utf-8')

print(timestamp)

print(sign)

# python 2.7

timestamp = long(round(time.time()))

key = '{}\n{}'.format(timestamp, secret)

key_enc = bytes(key).encode('utf-8')

msg_enc = bytes(msg).encode('utf-8')

簽名計算代碼示例(go)

func gensign(secret string, timestamp int64) (string, error) {

stringtosign := fmt.sprintf("%v", timestamp) + "\n" + secret

var data []byte

h := hmac.new(sha256.new, []byte(stringtosign))

_, err := h.write(data)

if err != nil {

return "", err

signature := base64.stdencoding.encodetostring(h.sum(nil))

return signature, nil

帶簽名校驗的實作

"timestamp": timestamp,

"sign": sign,

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

帶簽名校驗和自定義關鍵詞的實作

41

42

43

可發送的消息類型

自定義機器人添加完成後,就能向其 webhook 位址發送 post 請求,進而在群聊中推送消息了。支援推送的消息格式有文本、富文本、圖檔消息,也可以分享群名片等。

參數msg_type代表消息類型,可傳入:text(文本)/ post(富文本)/ image(圖檔)/ share_chat(分享群名片)/ interactive(消息卡片)。具體使用方法可檢視下文的官方文檔。

請求發送後的傳回資訊彙總

消息發送成功:{“extra”:null,“statuscode”:0,“statusmessage”:“success”}

webhook位址無效:{“code”:19001,“msg”:“param invalid: incoming webhook access token invalid”}

關鍵詞校驗失敗:{“code”:19024,“msg”:“key words not found”}

ip校驗失敗:{“code”:19022,“msg”:“ip not allowed”}

簽名校驗失敗:{“code”:19021,“msg”:“sign match fail or timestamp is not within one hour from current time”}

機器人的常見問題

自定義機器人的 webhook位址有 v1、v2 版本,如何相容?

答:請參考幫助文檔如何在群聊中使用機器人的附錄部分“舊版 webhook (自定義機器人) 使用說明”。同時,推薦使用v2版本的自定義機器人。

使用 webhook 的自定義機器人是否可以@單個成員、或者@所有人?

答:v2版本的自定義機器人,支援@單個成員、或者@所有人。

配置使用 webhook 的自定義機器人時,參數text是否有長度要求?

答:建議 json 的長度不超過 30k,序列化後的 pb 不超過 100k,圖檔最好小于 10mb。

擴充應用場景

伺服器監測報警

天氣情況、生日提醒和新聞資訊等的推送

個人開發應用的使用者回報

輕量級的埋點統計