自定義機器人使用指南
利用 n8n 打造飛書 RSS 推送機器人
文章目錄
- 自定義機器人使用指南
- 注意事項
- 功能介紹
- 在群組中添加自定義機器人
- 操作步驟
- 邀請自定義機器人進群。
- - 進入目標群組,在群組右上角點擊更多按鈕,并點擊 設置。
- - 在右側 設置 界面,點擊 群機器人。
- - 在 群機器人 界面點擊 添加機器人。
- - 在 添加機器人 對話框,找到并點擊 自定義機器人。
- - 設置自定義機器人的頭像、名稱與描述,并點擊 添加。
- 獲取自定義機器人的 webhook 地址,并點擊 完成。
- 測試調用自定義機器人的 webhook 地址,向所在群組發送消息。
- - 用任意方式向 webhook 地址發起一個 HTTP POST 請求。
- - 命令執行后,進入自定義機器人所在群組查看測試消息。
- 后續步驟
- 為自定義機器人添加安全設置
- 方式一:設置自定義關鍵詞
- - 在群組名稱右側點擊機器人圖標,打開機器人列表,找到自定義機器人并點擊進入配置頁面。
- - 在 安全設置 區域,選擇 自定義關鍵詞。
- - 在輸入框添加關鍵詞。
- - 點擊 保存,使生效配置。
- 方式二:設置 IP 白名單
- - 在群組名稱右側點擊機器人圖標,打開機器人列表,找到自定義機器人并點擊進入配置頁面。
- - 在 安全設置 區域,選擇 IP 白名單。
- - 在輸入框添加 IP 地址。
- - 點擊 保存,使配置生效。
- 方式三:設置簽名校驗
- - 在群組名稱右側點擊機器人圖標,打開機器人列表,找到自定義機器人并點擊進入配置頁面。
- - 在 安全設置 區域,選擇 簽名校驗。
- - 點擊 復制,復制秘鑰。
- - 點擊 保存,使配置生效。
- - 計算簽名字符串。
- Java 示例代碼
- Go 示例代碼
- Python 示例代碼
- - 獲取簽名字符串。
- 注意:在n8n中用crypto模塊獲取簽名字符串(配置方法???)
- HMAC 的正確用法是:
- 但是飛書提供的代碼是:
- 第一個參數key變成了timestamp和secret的拼接(用換行符),第二個參數msg為空。
- 所以我們節點配置如下:
- 完整工作流json代碼如下:
- 刪除自定義機器人
- 支持發送的消息類型說明
- 發送文本消息
- 發送富文本消息
- 發送群名片
- 發送圖片
- 發送飛書卡片
- 常見問題
- 如何實現 @ 指定人、@ 所有人?
- 如何獲得 @ 指定人時所需要的 open_id?
- 自定義機器人能響應用戶消息嗎?
- 如何撤回自定義機器人發送的消息?
自定義機器人使用指南
自定義機器人是一種只能在當前群聊中使用的機器人。該類機器人無需經過租戶管理員審核,即可在當前群聊中通過調用 webhook 地址的方式完成消息推送。本文主要介紹自定義機器人的使用方式。
注意事項
-
自定義機器人只能在當前群聊內使用,同一個自定義機器人無法添加到其他群聊。
-
你需要具備一定的服務端開發基礎,通過請求調用自定義機器人的 webhook 地址,實現消息推送功能。
-
自定義機器人在添加至群組后即可使用,無需租戶管理員審核。該特性提升了開發機器人的便攜性,但出于租戶數據安全考慮,也限制了自定義機器人的使用場景,自定義機器人不具有任何數據訪問權限。
-
如果你希望實現機器人群管理、獲取用戶信息等能力,建議參考開發卡片交互機器人,通過機器人應用實現。自定義機器人和機器人應用的能力對比,請參見能力對比。
-
自定義機器人的頻率控制和普通應用不同,為單租戶單機器人 100 次/分鐘,5 次/秒。建議發送消息盡量避開諸如 10:00、17:30 等整點及半點時間,否則可能出現因系統壓力導致的 11232 限流錯誤,導致消息發送失敗。
-
發送消息時,請求體的數據大小不能超過 20 KB。
功能介紹
企業存在給特定群組自動推送消息的場景,例如,推送監控報警、銷售線索、運營內容等。在該類場景下,你可以在群組中添加自定義機器人,自定義機器人默認提供 webhook,通過服務端調用 webhook 地址,即可將外部系統的消息通知即時推送到群組中。自定義機器人也包含了 自定義關鍵詞、IP 白名單 和 簽名 三種維度的安全配置,便于控制 webhook 的調用范圍。
自定義機器人消息推送示例,如下圖所示:
在群組中添加自定義機器人
操作步驟
邀請自定義機器人進群。
- 進入目標群組,在群組右上角點擊更多按鈕,并點擊 設置。
- 在右側 設置 界面,點擊 群機器人。
- 在 群機器人 界面點擊 添加機器人。
- 在 添加機器人 對話框,找到并點擊 自定義機器人。
- 設置自定義機器人的頭像、名稱與描述,并點擊 添加。
獲取自定義機器人的 webhook 地址,并點擊 完成。
機器人對應的 webhook 地址 格式如下:
https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxxxxxx
請妥善保存好此 webhook 地址,不要公布在 Gitlab、博客等可公開查閱的網站上,避免地址泄露后被惡意調用發送垃圾消息。
后續你可以在群組名稱右側點擊機器人圖片,進入自定義機器人詳情頁,管理自定義機器人的配置信息。
測試調用自定義機器人的 webhook 地址,向所在群組發送消息。
- 用任意方式向 webhook 地址發起一個 HTTP POST 請求。
你需要具備一定的服務端開發基礎,通過服務端 HTTP POST 請求方式調用 webhook 地址。以 curl 指令為例,請求示例如下。你可以通過 macOS 系統的終端,或者 Windows 系統的控制臺應用,執行以下命令進行測試。
macOS
curl -X POST -H "Content-Type: application/json" \-d '{"msg_type":"text","content":{"text":"request example"}}' \https://open.feishu.cn/open-apis/bot/v2/hook/****
Windows(cmd)
curl -X POST -H "Content-Type: application/json" -d "{\"msg_type\":\"text\",\"content\":{\"text\":\"request example\"}}" https://open.feishu.cn/open-apis/bot/v2/hook/****
Windows(PowerShell)
curl.exe -X POST -H "Content-Type: application/json" -d '{\"msg_type\":\"text\",\"content\":{\"text\":\"requestexample\"}}' https://open.feishu.cn/open-apis/bot/v2/hook/****
示例命令說明:
-
請求方式:POST
-
請求頭:Content-Type: application/json
-
請求體:
{"msg_type":"text","content":{"text":"request example"}}
-
webhook 地址:
https://open.feishu.cn/open-apis/bot/v2/hook/****
為示例值,你在實際調用時需要替換為自定義機器人真實的 webhook 地址。
向自定義機器人發送請求時,支持發送文本、富文本、群名片以及消息卡片等多種消息類型。各類消息類型的請求說明,參見支持發送的消息類型說明。
執行命令后:
-
如果請求成功,命令行將會回顯以下信息。
{"StatusCode": 0, //冗余字段,用于兼容存量歷史邏輯,不建議使用"StatusMessage": "success", //冗余字段,用于兼容存量歷史邏輯,不建議使用"code": 0,"data": {},"msg": "success" }
-
如果請求體格式錯誤,則會返回以下信息。
{"code": 9499,"msg": "Bad Request","data": {} }
你可以通過以下說明,檢查請求體是否存在問題。
-
請求體內容格式是否與各消息類型的示例代碼一致。
-
請求體大小不能超過 20 K。
-
- 命令執行后,進入自定義機器人所在群組查看測試消息。
后續步驟
成功添加自定義機器人后,推薦你為自定義機器人添加安全設置,以保證機器人接收請求的安全性。具體操作參見下文為自定義機器人添加安全設置。
為自定義機器人添加安全設置
在群組中添加自定義機器人后,你可以為機器人添加安全設置。安全設置用于保護自定義機器人不被惡意調用,例如,當 webhook 地址因保管不當而泄露后,可能會被惡意開發者調用發送垃圾信息。通過添加安全設置,只有在符合安全設置條件的情況下,才可以成功調用機器人。
目前提供的安全設置方式如下:
- 我們強烈建議為自定義機器人添加安全設置,以提高安全性。
- 在同一個自定義機器人中,你可以設置一個或多個方法。
-
自定義關鍵詞:只有包含至少一個關鍵詞的消息,可以成功發送。
-
IP 白名單:只有在白名單內的 IP 地址,可以成功請求 webhook 發送消息。
-
簽名校驗:設置簽名。發送的請求必須通過簽名校驗,才可以成功請求 webhook 發送消息。
方式一:設置自定義關鍵詞
- 在群組名稱右側點擊機器人圖標,打開機器人列表,找到自定義機器人并點擊進入配置頁面。
你也可以在群組設置中打開機器人列表。
- 在 安全設置 區域,選擇 自定義關鍵詞。
- 在輸入框添加關鍵詞。
最多可以同時設置 10 個關鍵詞,多個關鍵詞之間使用回車鍵間隔。設置后,只有包含至少一個關鍵詞的消息才會被成功發送。
例如,關鍵詞設置了 應用報警 與 項目更新,則請求 webhook 發送的消息內容需要至少包含 應用報警 或 項目更新 其中一個關鍵詞。
設置關鍵詞后,如果發送請求時自定義關鍵詞校驗失敗,則會返回以下信息。
// 關鍵詞校驗失敗
{"code": 19024,"msg": "Key Words Not Found"
}
- 點擊 保存,使生效配置。
注意:自定義關鍵詞只對 text、title 這類文本參數值生效。例如,發送富文本消息時包含超鏈接標簽 {"tag":"a","text":"請查看","href":"http://www.example.com/"}
,則自定義關鍵詞只過濾 text 參數值,不會過濾 href 參數值。
(看不懂啥意思!)
方式二:設置 IP 白名單
- 在群組名稱右側點擊機器人圖標,打開機器人列表,找到自定義機器人并點擊進入配置頁面。
你也可以在群組設置中打開機器人列表。
- 在 安全設置 區域,選擇 IP 白名單。
- 在輸入框添加 IP 地址。
支持添加 IP 地址或地址段,最多可設置 10 個,使用回車鍵間隔。支持段輸入,例如 123.12.1.*
或 123.1.1.1/24
。設置后,機器人 webhook 地址只處理來自 IP 白名單范圍內的請求。
設置 IP 白名單后,白名單之外的 IP 地址請求 webhook 時會校驗失敗,并返回以下信息。
// IP校驗失敗
{"code": 19022,"msg": "Ip Not Allowed"
}
- 點擊 保存,使配置生效。
方式三:設置簽名校驗
- 在群組名稱右側點擊機器人圖標,打開機器人列表,找到自定義機器人并點擊進入配置頁面。
你也可以在群組設置中打開機器人列表。
- 在 安全設置 區域,選擇 簽名校驗。
選擇簽名校驗后,系統已默認提供了一個秘鑰。你也可以點擊 重置,更換秘鑰。
- 點擊 復制,復制秘鑰。
- 點擊 保存,使配置生效。
- 計算簽名字符串。
設置簽名校驗后,向 webhook 發送請求需要簽名校驗來保障來源可信。所校驗的簽名需要通過時間戳與秘鑰進行算法加密,即將timestamp + "\n" + 密鑰
當做簽名字符串,使用 HmacSHA256 算法計算空字符串的簽名結果,再進行 Base64 編碼。其中,timestamp是指距當前時間不超過 1 小時(3600 秒)的時間戳,時間單位:s。例如,1599360473。
本文提供了以下不同語言的代碼示例,用于計算獲得簽名字符串。
Java 示例代碼
package sign;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import org.apache.commons.codec.binary.Base64;
public class SignDemo {public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException {String secret = "demo";int timestamp = 1599360473;System.out.printf("sign: %s", GenSign(secret, timestamp));
}private static String GenSign(String secret, int timestamp) throws NoSuchAlgorithmException, InvalidKeyException {//把timestamp+"\n"+密鑰當做簽名字符串String stringToSign = timestamp + "\n" + secret;//使用HmacSHA256算法計算簽名Mac mac = Mac.getInstance("HmacSHA256");mac.init(new SecretKeySpec(stringToSign.getBytes(StandardCharsets.UTF_8), "HmacSHA256"));byte[] signData = mac.doFinal(new byte[]{});return new String(Base64.encodeBase64(signData));}
}
Go 示例代碼
func GenSign(secret string, timestamp int64) (string, error) {//timestamp + key 做sha256, 再進行base64 encodestringToSign := fmt.Sprintf("%v", timestamp) + "\n" + secretvar data []byteh := 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
}
Python 示例代碼
import hashlib
import base64
import hmac
def gen_sign(timestamp, secret):# 拼接timestamp和secretstring_to_sign = '{}\n{}'.format(timestamp, secret)hmac_code = hmac.new(string_to_sign.encode("utf-8"), digestmod=hashlib.sha256).digest()# 對結果進行base64處理sign = base64.b64encode(hmac_code).decode('utf-8')return sign
- 獲取簽名字符串。
以 Java 示例代碼為例,獲取當前時間戳以及密鑰后,運行程序獲得簽名字符串。
獲取簽名字符串后,在向 webhook 發送請求時,需要加上時間戳(timestamp)和簽名字符串(sign)字段信息。示例配置如下所示。
// 開啟簽名驗證后發送文本消息
{"timestamp": "1599360473", // 時間戳。"sign": "xxxxxxxxxxxxxxxxxxxxx", // 得到的簽名字符串。"msg_type": "text","content": {"text": "request example"}
}
如果發送請求時校驗失敗,你可以通過以下說明排查問題。
所使用的時間戳距離發送請求的時間已間隔 1 小時以上,簽名已過期。
服務器時間與標準時間有較大偏差,導致簽名過期。請注意檢查、校準你的服務器時間。
簽名不匹配導致的校驗不通過,將返回以下信息。
// 簽名校驗失敗
{"code": 19021,"msg": "sign match fail or timestamp is not within one hour from current time"
}
注意:在n8n中用crypto模塊獲取簽名字符串(配置方法???)
HMAC 的正確用法是:
hmac.new(key=secret, msg=data, digestmod=hashlib.sha256)
但是飛書提供的代碼是:
string_to_sign = '{}\n{}'.format(timestamp, secret)
hmac_code = hmac.new(string_to_sign.encode("utf-8"), digestmod=hashlib.sha256).digest()
第一個參數key變成了timestamp和secret的拼接(用換行符),第二個參數msg為空。
所以我們節點配置如下:
{"timestamp": "{{Math.round(new Date().getTime()/1000)}}",
}
{{ $json.timestamp + '\n' + 'XRkoNa93xgcXy5ZwB77PLh'}}
完整工作流json代碼如下:
{"nodes": [{"parameters": {"method": "POST","url": "https://open.feishu.cn/open-apis/bot/v2/hook/************************","sendBody": true,"specifyBody": "json","jsonBody": "={\n \"timestamp\": \"{{ $json.timestamp}}\",\n \"sign\": \"{{ $json.sign}}\",\n \"msg_type\": \"text\",\n \"content\": {\n \"text\": \"request example\"\n }\n}","options": {}},"type": "n8n-nodes-base.httpRequest","typeVersion": 4.2,"position": [496,0],"id": "0cf5fa50-e7ef-405d-b1c9-5edc1dc49889","name": "HTTP Request"},{"parameters": {},"type": "n8n-nodes-base.manualTrigger","typeVersion": 1,"position": [-176,0],"id": "2fc6c5ad-97ae-41ab-b932-6fdfb8481b8e","name": "When clicking ‘Execute workflow’"},{"parameters": {"action": "hmac","type": "SHA256","value": "=","dataPropertyName": "sign","secret": "={{ $json.timestamp + '\\n' + 'XRkoNa93xgcX**************'}}","encoding": "base64"},"type": "n8n-nodes-base.crypto","typeVersion": 1,"position": [272,0],"id": "5d2be349-404f-4b4d-9acf-b6674c293774","name": "Crypto"},{"parameters": {"mode": "raw","jsonOutput": "={\n \"timestamp\": \"{{Math.round(new Date().getTime()/1000)}}\",\n}\n","options": {}},"type": "n8n-nodes-base.set","typeVersion": 3.4,"position": [48,0],"id": "5206a964-60f9-4fa2-9e84-874b6086f467","name": "Edit Fields"}],"connections": {"When clicking ‘Execute workflow’": {"main": [[{"node": "Edit Fields","type": "main","index": 0}]]},"Crypto": {"main": [[{"node": "HTTP Request","type": "main","index": 0}]]},"Edit Fields": {"main": [[{"node": "Crypto","type": "main","index": 0}]]}},"pinData": {},"meta": {"instanceId": "7dad39b1efdec274b0305a8cf49ffedcd26ca40b0ec7aafcaf3eb4e9d058f099"}
}
刪除自定義機器人
在飛書群組的 設置 中,打開 群機器人 列表,找到需要刪除的自定義機器人,在卡片右側點擊刪除圖標。
支持發送的消息類型說明
向自定義機器人 webhook 地址發送 POST 請求時,支持推送的消息格式有 文本、富文本、圖片消息 以及 群名片 等,本章節介紹各消息類型的請求格式與展示效果。
發送文本消息
請求消息體示例
{"msg_type": "text","content": {"text": "新更新提醒"}
}
實現效果
參數說明
-
參數 msg_type 值為對應消息類型的映射關系,文本消息的 msg_type 對應值為 text。
-
參數 content 包含消息內容,文本消息的消息內容參數說明如下表所示。
字段 類型 是否必填 示例值 描述 text string 是 Test content 文本內容。
文本消息的 @ 用法
// @ 單個用戶
<at user_id="ou_xxx">名字</at>
// @ 所有人
<at user_id="all">所有人</at>
- @ 單個用戶時,user_id字段需填入用戶的 Open ID 或 User ID,且必須是有效值(僅支持 @ 自定義機器人所在群的群成員),否則取名字展示,并不產生實際的 @ 效果。
在外部群聊中,僅支持使用 Open ID @ 單個用戶,不支持 User ID。
- @ 所有人時,必須滿足所在群開啟 @ 所有人功能。
文本消息 @ 用法示例
{"msg_type": "text","content": {"text": "<at user_id=\"ou_xxx\">Tom</at> 新更新提醒"}
}
發送富文本消息
富文本消息是指包含文本、超鏈接、圖標等多種文本樣式的復合文本信息。
請求消息體示例
{"msg_type": "post","content": {"post": {"zh_cn": {"title": "項目更新通知","content": [[{"tag": "text","text": "項目有更新: "}, {"tag": "a","text": "請查看","href": "http://www.example.com/"}, {"tag": "at","user_id": "ou_18eac8********17ad4f02e8bbbb"}]]}}}
}
實現效果
參數說明
參數 msg_type 值為對應消息類型的映射關系,富文本消息的 msg_type 對應值為 post。
參數 content 包含消息內容,文本消息的消息內容參數說明如下表所示。
字段 | 類型 | 是否必填 | 示例值 | 描述 |
---|---|---|---|---|
post | object | 是 | none | 富文本消息。 |
∟ zh_cn | object | 是 | none | zh_cn、en_us 分別是富文本的中、英文配置,富文本消息中至少需要包含一種語言的配置。包含的參數說明,參見下文的《zh_cn、en_us 字段說明表》。 |
∟ en_us | object | 是 | none | zh_cn、en_us 分別是富文本的中、英文配置,富文本消息中至少需要包含一種語言的配置。包含的參數說明,參見下文的《zh_cn、en_us 字段說明表》。 |
zh_cn、en_us 字段說明表。
字段 | 類型 | 是否必填 | 示例值 | 描述 |
---|---|---|---|---|
title | string | 否 | Test title | 富文本消息的標題。 |
content | []paragraph | 是 | [[{“tag”: “text”,“text”: “text content”}]] | 富文本消息內容。由多個段落組成,每個段落為一個[]節點,其中包含若干個節點。 |
富文本支持的標簽和參數說明
文本標簽:text
字段 | 類型 | 是否必填 | 示例值 | 描述 |
---|---|---|---|---|
text | string | 是 | Text content | 文本內容。 |
un_escape | boolean | 否 | false | 表示是否 unescape 解碼。默認值為 false,未用到 unescape 時可以不填。 |
超鏈接標簽:a
字段 | 類型 | 是否必填 | 示例值 | 描述 |
---|---|---|---|---|
text | string | 是 | 測試地址 | 超鏈接的文本內容。 |
href | string | 是 | https://open.feishu.cn | 默認的鏈接地址,你需要確保鏈接地址的合法性,否則消息會發送失敗。 |
@ 標簽:at
字段 | 類型 | 是否必填 | 示例值 | 描述 |
---|---|---|---|---|
user_id | string | 是 | ou_18eac85d35a26****02e8bbbb | 用戶的 Open ID 或 User ID。 - @ 單個用戶時,user_id字段必須是有效值(僅支持 @ 自定義機器人所在群的群成員)。 - @ 所有人時,填 all。 |
user_name | string | 否 | Jian Li | 用戶名稱。 |
圖片標簽:img
字段 | 類型 | 是否必填 | 示例值 | 描述 |
---|---|---|---|---|
image_key | string | 是 | d640eeea-4d2f-4cb3-88d8-c96fa5**** | 圖片的唯一標識。可通過 上傳圖片 接口獲取 image_key。 |
發送群名片
機器人只能分享其所在群的群名片。
請求消息體示例
{"msg_type": "share_chat","content":{"share_chat_id": "oc_f5b1a7eb27ae2****339ff"}
}
實現效果
參數說明
字段 | 類型 | 是否必填 | 示例值 | 描述 |
---|---|---|---|---|
share_chat_id | string | 是 | oc_f5b1a7eb27ae2****339ff | 群 ID。獲取方式請參見 群 ID 說明。 |
發送圖片
請求消息體示例
{"msg_type":"image","content":{"image_key": "img_ecffc3b9-8f14-400f-a014-05eca1a4310g"}
}
實現效果
參數說明
字段 | 類型 | 是否必填 | 示例值 | 描述 |
---|---|---|---|---|
image_key | string | 是 | img_ecffc3b9-8f14-400f-a014-05eca1a4310g | 圖片Key。可通過 上傳圖片 接口獲取 image_key。 |
發送飛書卡片
飛書卡片是一種輕量的消息推送應用,可由按鈕、圖片等多種組件搭建而成。了解飛書卡片,參考飛書卡片概述。了解如何使用自定義機器人發送由搭建工具搭建的卡片模板(template),參考使用自定義機器人發送飛書卡片。
注意事項
通過自定義機器人發送的消息卡片,只支持通過按鈕、文字鏈方式跳轉 URL,不支持點擊后回調信息到服務端的請求回調交互。
在飛書卡片中如果需要 @ 某一用戶,則需要注意:自定義機器人僅支持通過 Open ID 或 User ID 實現 @ 用戶,暫不支持email、union_id等其他方式。
發送卡片時,需要將消息體的 content 字符串替換為 card 結構體,并對整個請求消息體進行 JSON 轉義。
請求消息體示例
{"msg_type": "interactive","card": {"schema": "2.0","config": {"update_multi": true,"style": {"text_size": {"normal_v2": {"default": "normal","pc": "normal","mobile": "heading"}}}},"body": {"direction": "vertical","padding": "12px 12px 12px 12px","elements": [{"tag": "markdown","content": "西湖,位于中國浙江省杭州市西湖區龍井路1號,杭州市區西部,匯水面積為21.22平方千米,湖面面積為6.38平方千米。","text_align": "left","text_size": "normal_v2","margin": "0px 0px 0px 0px"},{"tag": "button","text": {"tag": "plain_text","content": "🌞更多景點介紹"},"type": "default","width": "default","size": "medium","behaviors": [{"type": "open_url","default_url": "https://baike.baidu.com/item/%E8%A5%BF%E6%B9%96/4668821","pc_url": "","ios_url": "","android_url": ""}],"margin": "0px 0px 0px 0px"}]},"header": {"title": {"tag": "plain_text","content": "今日旅游推薦"},"subtitle": {"tag": "plain_text","content": ""},"template": "blue","padding": "12px 12px 12px 12px"}}
}
以上消息體壓縮并轉義的結果如下所示,你可將其放入 CURL 命令中的請求體中查看效果:
{\"msg_type\":\"interactive\",\"card\":{\"schema\":\"2.0\",\"config\":{\"update_multi\":true,\"style\":{\"text_size\":{\"normal_v2\":{\"default\":\"normal\",\"pc\":\"normal\",\"mobile\":\"heading\"}}}},\"body\":{\"direction\":\"vertical\",\"padding\":\"12px 12px 12px 12px\",\"elements\":[{\"tag\":\"markdown\",\"content\":\"西湖,位于中國浙江省杭州市西湖區龍井路1號,杭州市區西部,匯水面積為21.22平方千米,湖面面積為6.38平方千米。\",\"text_align\":\"left\",\"text_size\":\"normal_v2\",\"margin\":\"0px 0px 0px 0px\"},{\"tag\":\"button\",\"text\":{\"tag\":\"plain_text\",\"content\":\"🌞更多景點介紹\"},\"type\":\"default\",\"width\":\"default\",\"size\":\"medium\",\"behaviors\":[{\"type\":\"open_url\",\"default_url\":\"https://baike.baidu.com/item/%E8%A5%BF%E6%B9%96/4668821\",\"pc_url\":\"\",\"ios_url\":\"\",\"android_url\":\"\"}],\"margin\":\"0px 0px 0px 0px\"}]},\"header\":{\"title\":{\"tag\":\"plain_text\",\"content\":\"今日旅游推薦\"},\"subtitle\":{\"tag\":\"plain_text\",\"content\":\"\"},\"template\":\"blue\",\"padding\":\"12px 12px 12px 12px\"}}}
實現效果
相關操作
你可以通過飛書卡片搭建工具快速生成卡片,并獲取數據結構進行使用,從工具中生成的數據結構對應請求消息體中的 card 字段。
常見問題
如何實現 @ 指定人、@ 所有人?
你可以在機器人發送的普通文本消息(text)、富文本消息(post)、消息卡片(interactive)中,使用 at 標簽實現 @ 人效果。具體請求示意如下:
在普通文本消息(text)中 @ 人、@ 所有人
at標簽說明
// @ 指定用戶
<at user_id="ou_xxx">Name</at> //取值須使用 open_id 或 user_id 來 @ 指定人
// @ 多個指定用戶
<at user_id="ou_xxx1">Name1</at><at user_id="ou_xxx2">Name2</at> //取值須使用 open_id 或 user_id 來 @ 指定人
// @ 所有人
<at user_id="all">所有人</at>
請求體示意
{"msg_type": "text","content": {"text": "<at user_id = \"ou_f43d7bf0bxxxxxxxxxxxxxxx\">Tom</at> text content"}
}
在富文本消息(post)中 @ 人、@所有人:
at標簽說明
// @ 指定用戶
{"tag": "at","user_id": "ou_xxxxxxx", //取值須使用 open_id 或 user_id 來 @ 指定人"user_name": "tom"
}
// @ 多個指定用戶
{"tag": "at","user_id": "ou_xxxxxxx1", //取值須使用 open_id 或 user_id 來 @ 指定人"user_name": "tom1"
},
{"tag": "at","user_id": "ou_xxxxxxx2", //取值須使用 open_id 或 user_id 來 @ 指定人"user_name": "tom2"
}
// @ 所有人
{"tag": "at","user_id": "all", //取值使用"all"來at所有人"user_name": "所有人"
}
請求體示意
{"msg_type": "post","content": {"post": {"zh_cn": {"title": "我是一個標題","content": [[{"tag": "text","text": "第一行 :"},{"tag": "at","user_id": "ou_xxxxxx", //取值須使用 open_id 或 user_id 來 @ 指定人"user_name": "tom"}],[{"tag": "text","text": "第二行:"},{"tag": "at","user_id": "all","user_name": "所有人"}]]}}}
}
在消息卡片 (interactive) 中@人、@所有人
可以使用消息卡片Markdown內容中的at人標簽,標簽示意如下
// at 指定用戶
<at id=ou_xxx></at> //取值須使用 open_id 或 user_id 來 @ 指定人
// at 所有人
<at id=all></at>
請求體中的 card 內容示意:
{"msg_type": "interactive","card": {"elements": [{"tag": "div","text": {"content": "at所有人<at id=all></at> \n at指定人<at id=ou_xxxxxx></at>", //取值須使用 open_id 或 user_id 來 @ 指定人"tag": "lark_md"}}]}
}
如何獲得 @ 指定人時所需要的 open_id?
自定義機器人不需要租戶管理員審核即可向所在的群(包括外部群)發送消息。這一開發上的靈活性也限制自定義機器人不具有任何數據訪問權限,否則會在管理員不知情的條件下,泄露租戶的隱私信息.
基于這個前提,自定義機器人本身不能調用接口獲取用戶的 open_id,或直接通過用戶的郵箱、手機號來 @ 人(惡意開發者可能用這種方式掃出群成員的頭像、姓名等隱私信息)。因此,你可以開發一個機器人應用,使用以下受管控的方案獲得用戶的open_id,然后參考 怎么實現機器人 @ 人,在自定義機器人推送的消息中 @ 人。
方案一:通過郵箱或手機號反查用戶的open_id
你需要創建一個自建應用。
為應用申請權限。
通過手機號或郵箱獲取用戶 ID(contact:user.id:readonly),并創建應用版本,提交發版審核。
在版本發布審核通過后,調用通過手機號或郵箱獲取用戶 ID接口,即可通過用戶的手機號或郵箱獲取用戶的open_id。
方案二:解析用戶發送給機器人的帶 @ 人內容的消息,獲取目標用戶的 open_id
你需要創建一個自建應用。
完成以下應用配置操作。
為應用申請權限:獲取用戶發給機器人的單聊消息(im:message.p2p_msg)、獲取與發送單聊、群組消息(im:message)。
訂閱 消息與群組 分類下的接收消息事件。
為這個自建應用創建應用版本,提交發版審核。
在版本審核發布后,你可以在同機器人的單聊中發送 @ 某用戶的消息。解析接收消息事件的返回內容,其中的消息體內上報了被 @ 用戶的open_id信息。
自定義機器人能響應用戶消息嗎?
不能,自定義機器人只能用于在群聊中自動發送通知,不能響應用戶 @ 機器人的消息。如需實現機器人接收響應用戶消息的功能,建議使用應用機器人。
如何撤回自定義機器人發送的消息?
自定義機器人自身無法撤回自己發送的消息,必須由群聊內的群主或管理員進行撤回。撤回方式:
方式一:群聊的群主或管理員在飛書客戶端的群聊中直接撤回消息。
方式二:調用撤回消息接口,以群聊的群主或管理員身份調用該接口撤回消息。
相關問題
是否支持通過 OpenAPI 創建機器人?
同一個自定義機器人能在不同的群組使用嗎?
為什么我的機器人在飛書中搜不到?在群聊內添加機器人時也搜索不到?
如何將企業內部人員與外部客戶一鍵拉入群聊?
機器人發送消息時,如何實現 @所有人、@指定人?