機器人簡單介紹
飛書群中的自定義機器人是通過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。
擴充應用場景
伺服器監測報警
天氣情況、生日提醒和新聞資訊等的推送
個人開發應用的使用者回報
輕量級的埋點統計