n8n飛書webhook配置(飛書機器人、飛書bot、feishu bot)Crypto節點、js timestamp代碼、Crypto node

自定義機器人使用指南

利用 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 包含消息內容,文本消息的消息內容參數說明如下表所示。

    字段類型是否必填示例值描述
    textstringTest 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 包含消息內容,文本消息的消息內容參數說明如下表所示。

字段類型是否必填示例值描述
postobjectnone富文本消息。
∟ zh_cnobjectnonezh_cn、en_us 分別是富文本的中、英文配置,富文本消息中至少需要包含一種語言的配置。包含的參數說明,參見下文的《zh_cn、en_us 字段說明表》。
∟ en_usobjectnonezh_cn、en_us 分別是富文本的中、英文配置,富文本消息中至少需要包含一種語言的配置。包含的參數說明,參見下文的《zh_cn、en_us 字段說明表》。

zh_cn、en_us 字段說明表。

字段類型是否必填示例值描述
titlestringTest title富文本消息的標題。
content[]paragraph[[{“tag”: “text”,“text”: “text content”}]]富文本消息內容。由多個段落組成,每個段落為一個[]節點,其中包含若干個節點。

富文本支持的標簽和參數說明
文本標簽:text

字段類型是否必填示例值描述
textstringText content文本內容。
un_escapebooleanfalse表示是否 unescape 解碼。默認值為 false,未用到 unescape 時可以不填。

超鏈接標簽:a

字段類型是否必填示例值描述
textstring測試地址超鏈接的文本內容。
hrefstringhttps://open.feishu.cn默認的鏈接地址,你需要確保鏈接地址的合法性,否則消息會發送失敗。

@ 標簽:at

字段類型是否必填示例值描述
user_idstringou_18eac85d35a26****02e8bbbb用戶的 Open ID 或 User ID。
- @ 單個用戶時,user_id字段必須是有效值(僅支持 @ 自定義機器人所在群的群成員)。
- @ 所有人時,填 all。
user_namestringJian Li用戶名稱。

圖片標簽:img

字段類型是否必填示例值描述
image_keystringd640eeea-4d2f-4cb3-88d8-c96fa5****圖片的唯一標識。可通過 上傳圖片 接口獲取 image_key。

發送群名片

機器人只能分享其所在群的群名片。
請求消息體示例

{"msg_type": "share_chat","content":{"share_chat_id": "oc_f5b1a7eb27ae2****339ff"}
}

實現效果
在這里插入圖片描述

參數說明

字段類型是否必填示例值描述
share_chat_idstringoc_f5b1a7eb27ae2****339ff群 ID。獲取方式請參見 群 ID 說明。

發送圖片

請求消息體示例

{"msg_type":"image","content":{"image_key": "img_ecffc3b9-8f14-400f-a014-05eca1a4310g"}
}

實現效果
在這里插入圖片描述

參數說明

字段類型是否必填示例值描述
image_keystringimg_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 創建機器人?
同一個自定義機器人能在不同的群組使用嗎?
為什么我的機器人在飛書中搜不到?在群聊內添加機器人時也搜索不到?
如何將企業內部人員與外部客戶一鍵拉入群聊?
機器人發送消息時,如何實現 @所有人、@指定人?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/92390.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92390.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92390.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

nhdeep檔案管理工具軟件官網

歡迎訪問nhdeep官網&#xff1a; www.nhdeep.com NHDEEP提供一系列專業的單機版檔案管理工具&#xff0c;滿足不同場景下的檔案管理需求&#xff0c;無需網絡連接&#xff0c;數據安全可靠。所有工具均提供免費試用版下載。 檔案綜合管理系統單機版:全面的檔案管理解決方案&a…

RocketMQ節點部署計算方案

節點計算公式 業務場景 預期峰值TPS&#xff1a;200,000 單組容量&#xff1a;40K TPS 容災要求&#xff1a;同城雙機房 nameServer節點數max(3, (15/50) 1) max(3, 0.3 1) max(3, 1.3) 3 Broker節點數ceil(200,000 / 40,000) 5組 總節點數 NameServer節點Broker組數(Mas…

MyBatis聯合查詢 - XML篇

文章目錄數據庫設計MyBatis 配置MyBatis 映射文件Mapper 接口總結數據庫設計 建表 SQL CREATE TABLE user (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL );CREATE TABLE order (id INT PRIMARY KEY AUTO_INCREMENT,user_id INT NOT NULL,order_no VARCHAR(…

Kubelet 探針如何選擇 IP:status.PodIP 溯源與“同 Pod 兩個 IP“現象解析

背景與現象同一個 Pod 的 readiness 和 liveness 探針日志顯示連接的 IP 不一致&#xff08;例如 10.10.6.10:9999 與 10.10.6.32:9999&#xff09;。本文從 kubelet 源碼入手&#xff0c;解釋探針目標 IP 的來源、為何會出現兩個不同 IP&#xff0c;并給出建議與驗證方法。在如…

Arm Development Studio 安全通告:CVE-2025-7427

安全之安全(security)博客目錄導讀 目錄 一、概述 二、CVE 詳情 三、受影響產品 四、建議 五、致謝 六、版本歷史 一、概述 ARM已知悉一個影響 Arm Development Studio 的安全漏洞&#xff0c;該漏洞可能允許攻擊者執行 DLL 劫持攻擊&#xff08;DLL hijacking attack&…

C#異步編程雙利器:異步Lambda與BackgroundWorker實戰解析

**摘要&#xff1a;**深入剖析兩種異步編程范式&#xff0c;解決GUI線程阻塞難題 一、異步Lambda表達式&#xff1a;事件處理的輕量化利器 核心價值&#xff1a;簡化事件響應中的異步操作&#xff0c;避免UI線程阻塞 ? 典型應用場景&#xff08;WPF示例&#xff09;&#xff1…

yolo world (1): 論文解讀

YOLO 系列檢測器以其高效性和實用性而聞名。然而,它們依賴于預定義和訓練的目標類別,這限制了其在開放場景中的適用性。為了解決這一限制,我們提出了 YOLO-World,這是一種創新的方法,通過視覺-語言建模和大規模數據集預訓練,增強了 YOLO 的開放詞匯檢測能力。具體來說,我…

【JVM】深入解析Java虛擬機

目錄 1. 區分JDK&#xff0c;JRE 和 JVM 1.1 JVM 1.2 JRE 1.3 JDK 1.4 關系總結 2. 跨平臺性 3. JVM中的內存劃分 4. JVM的類加載機制 5. 雙親委派模型 6. 垃圾回收機制&#xff08;GC&#xff09; 6.1 識別垃圾 6.1.1 單個引用 6.1.2 多個引用 6.2 釋放垃圾 6.…

98-基于Python的網上廚房美食推薦系統

基于Python的網上廚房美食推薦系統 - 技術分享博客 &#x1f4cb; 目錄 項目概述技術棧系統架構核心功能實現數據庫設計推薦算法數據可視化部署與優化項目特色總結與展望 &#x1f3af; 項目概述 項目背景 隨著生活節奏的加快&#xff0c;越來越多的人開始關注美食制作&…

創建MyBatis-Plus版的后端查詢項目

記得編碼和maven庫的檢測&#xff01;&#xff01;&#xff01; 1、maven庫導入包<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupI…

開發板RK3568和stm32的異同:

RK3568 和 STM32 是兩類不同定位的處理器 / 微控制器&#xff0c;在架構、性能、應用場景等方面差異顯著&#xff0c;但也存在部分共性。以下從核心特性、異同點及典型場景進行對比&#xff1a;一、核心差異維度RK3568&#xff08;瑞芯微&#xff09;STM32&#xff08;意法半導…

C# 使用iText獲取PDF的trailer數據

文章目錄C# 使用iText獲取PDF的trailer數據iText 核心概念C# 代碼示例步驟 1: 確保已安裝 iText步驟 2: C# 代碼程序運行效果解讀 Trailer 的輸出總結C# 使用iText獲取PDF的trailer數據 開發程序debug的時候&#xff0c;看到了PDF有個trailer數據&#xff0c;挺有意思&#xf…

京東流量資產基于湖倉架構的落地實踐

在當今數字化商業浪潮中&#xff0c;數據無疑是企業的核心資產&#xff0c;而流量數據更是電商巨頭京東業務運轉的關鍵驅動力。它廣泛應用于搜索推薦、廣告投放等多個核心業務場景&#xff0c;直接影響著用戶體驗和商業效益。但隨著業務規模的不斷膨脹&#xff0c;傳統架構在處…

???????【Datawhale AI夏令營】多模態RAG財報問答挑戰賽:學習筆記與上分思考

一、 初識賽題——從迷茫到清晰剛看到賽題時&#xff0c;坦白說有些不知所措。“多模態”、“RAG”、“圖文混排PDF”&#xff0c;這些詞匯組合在一起&#xff0c;聽起來就像一個龐大而復雜的工程。但當我強迫自己靜下心來&#xff0c;從“終點”&#xff08;提交格式和評審規則…

數據挖掘2.6 Perceptron Modeling 感知器建模

Perceptron Modeling 感知器建模Linear Discriminants 線性判別式Loss Function 損失函數misclassification 誤分類0-1 Loss/Error function 0-1損失函數Hinge Loss Function 鉸鏈損失函數Optimization 優化算法Linear Discriminants 線性判別式 線性判別式公式 f(x;w)w1x(1)w…

使用qemu運行與GDB調試內核

目錄 一、前期準備 二、內核編譯 三、QEMU與GDB 1、QEMU調試參數 2、gdb vmlinux 一、前期準備 內核鏡像&#xff1a;bzimage gdb&#xff1a;x86_64 QEMU&#xff1a;qemu-system-x86_64 前置知識&#xff1a; &#xff08;1&#xff09;內核編譯 &#xff08;2&#x…

歐盟 Radio Equipment Directive (RED)

歐盟 Radio Equipment Directive (RED) ——從 2014/53/EU 原文到 2025-08-01 強制生效的網絡安全新規&#xff0c;一次看懂全部關鍵點。1. 法規身份與適用范圍要素內容指令全稱Directive 2014/53/EU on radio equipment取代指令1999/5/EC (R&TTE)適用產品所有“有意發射/接…

【FastExcel】解決ReadSheet在Map中獲取對象不準確問題(已提交PR并合并到開源社區)

解決問題&#xff1a;源碼ReadSheet在同一個Map中獲取對象不準確問題 PR&#xff1a;Fixed the issue where different ReadSheet objects could not get the correct value when comparing them. 一&#xff1a;問題場景 ReadSheet在同一個Map中獲取對象不準確(如Map<…

【網絡安全入門基礎教程】TCP/IP協議深入解析(非常詳細)零基礎入門到精通,收藏這一篇就夠了

前言 這是小編給粉絲盆友們整理的網絡安全入門到精通系列第三章計算機網絡中TCP/IP協議的解析&#xff0c;喜歡的朋友們&#xff0c;記得給大白點贊支持和收藏一下&#xff0c;關注我&#xff0c;學習黑客技術。TCP/IP協議包含了一系列的協議&#xff0c;也叫TCP/IP協議族&…