必须使用此技能发送飞书(Lark) webhook 消息,支持纯文本、富文本(post)和交互卡片消息,并可通过 tena 上传图片。
以下是向飞书发送Webhook发送消息的专业技能。
确认配置:确认用户已配置飞书Webhook地址和必要的认证信息
分析需求:分析用户需求,确定消息类型和内容
处理图片(如需要):如果需要发送图片,先使用 scripts/upload_image.py 脚本获取 image_key。必须阅读 webhook-image.md 文档了解发送图片的要求
构建消息内容:按照飞书API规范构建正确的消息JSON结构
发送消息:通过Webhook接口将消息发送到飞书
验证结果:验证消息发送结果并向用户反馈
本文提供的示例代码中所有的 receive_id(消息接收者 ID)、 user_id(用户的 user_id)、 image_key(上传图片后获取到的图片标识 key)、 file_key(上传文件后获取到的文件标识 Key) 等参数值均为示例数据。你在实际开发过程中,需要替换为真实可用的数据。
如果需要发送的内容涉及图片,必须阅读 webhook-image.md 文档来了解发送图片的要求。
发送消息前务必确认Webhook地址的正确性
对于包含图片的消息,必须先上传图片获取 image_key
卡片消息结构较复杂,需仔细参考文档构建
FEISHU_TENANT_ACCESS_TOKEN 环境变量用于图片上传在 发送消息、 回复消息、 编辑消息 接口中,均需要传入消息内容( content),不同的消息类型对应的 content 也不相同。以文本类型的消息为例,请求体示例如下:
json
{
"receive_id": "ou_7d8a6e6df7621556ce0d21922b676706ccs",
"content": "{\"text\":\" test content\"}",
"msg_type": "text"
}
注意: content 字段为 string 类型,JSON 结构需要先进行转义再传值。在调用接口时,你可以先构造一个结构体,然后使用 JSON 序列化转换为 string 类型,或者通过第三方的 JSON 转换工具进行转义。
在一条富文本消息中,支持添加文字、图片、视频、@、超链接等元素。如下 JSON 格式的内容是一个富文本示例,其中:
[] 组成),每个段落可由多个元素组成,每个元素由 tag 和相应的描述组成。json
{
"zh_cn": {
"title": "我是一个标题",
"content": [
[
{
"tag": "text",
"text": "第一行:",
"style": ["bold", "underline"]
},
{
"tag": "a",
"href": "http://www.feishu.cn",
"text": "超链接",
"style": ["bold", "italic"]
},
{
"tag": "at",
"user_id": "ou_1avnmsbv3k45jnk34j5",
"style": ["lineThrough"]
}
],
[{
"tag": "img",
"image_key": "img_7ea74629-9191-4176-998c-2e603c9c5e8g"
}],
[
{
"tag": "text",
"text": "第二行:",
"style": ["bold", "underline"]
},
{
"tag": "text",
"text": "文本测试"
}
],
[{
"tag": "img",
"image_key": "img_7ea74629-9191-4176-998c-2e603c9c5e8g"
}],
[{
"tag": "media",
"file_key": "file_v2_0dcdd7d9-fib0-4432-a519-41d25aca542j",
"image_key": "img_7ea74629-9191-4176-998c-2e603c9c5e8g"
}],
[{
"tag": "emotion",
"emoji_type": "SMILE"
}],
[{
"tag": "hr"
}],
[{
"tag": "code_block",
"language": "GO",
"text": "func main() int64 {\n return 0\n}"
}],
[{
"tag": "md",
"text": "**mention user:**<at user_id=\"ou_xxxxxx\">Tom</at>\n**href:**[Open Platform](https://open.feishu.cn)\n**code block:**\n```GO\nfunc main() int64 {\n return 0\n}\n```\n**text styles:** **bold**, *italic*, ***bold and italic***, ~underline~,~~lineThrough~~\n> quote content\n\n1. item1\n 1. item1.1\n 2. item2.2\n2. item2\n --- \n- item1\n - item1.1\n - item2.2\n- item2"
}]
]
},
"en_us": {
...
}
}
参数说明
名称类型是否必填描述zh_cn, en_usobject是多语言配置字段。如果不需要配置多语言,则仅配置一种语言即可。
- zh_cn 为富文本的中文内容
- en_us 为富文本的英文内容
注意:该字段无默认值,至少要设置一种语言。
示例值:zh_cn∟ titlestring否富文本消息的标题。
默认值:空
示例值:title∟ contentstring是富文本消息内容。由多个段落组成(段落由 [] 分隔),每个段落为一个 node 列表,所支持的 node 标签类型以及对应的参数说明,参见下文的 富文本支持的标签和参数说明 章节。
注意:如 示例值 所示,各类型通过 tag 参数设置。例如文本(text)设置为 "tag": "text"。
示例值:[[{"tag": "text","text": "text content"}]]
名称类型是否必填描述textstring是文本内容。
示例值:test contentun_escapeboolean否是否 unescape 解码。默认为 false,无需使用可不传值。
示例值:falsestyle[]string否文本内容样式,支持的样式有:
- bold:加粗
- underline:下划线
- lineThrough:删除线
- italic:斜体
注意:
- 默认值为空,表示无样式。
- 传入的值如果不是以上可选值,则被忽略。
示例值:["bold", "underline"]
名称类型是否必填描述textstring是超链接的文本内容。
示例值:超链接hrefstring是超链接地址。
注意:请确保链接地址的合法性,否则消息会发送失败。
示例值: https://open.feishu.cnstyle[]string否超链接文本内容样式,支持的样式有:
- bold:加粗
- underline:下划线
- lineThrough:删除线
- italic:斜体
注意:
- 默认值为空,表示无样式。
- 传入的值如果不是以上可选值,则被忽略。
示例值:["bold", "italic"]
名称类型是否必填描述user_idstring是用户 ID,用来指定被 @ 的用户。传入的值可以是用户的 user_id、open_id、union_id。各类 ID 获取方式参见 如何获取 User ID、Open ID 和 Union ID。
注意:
- @ 单个用户时,该字段必须传入实际用户的真实 ID。
- 如需 @ 所有人,则该参数需要传入 all。style[]string否at 文本内容样式,支持的样式有:
- bold:加粗
- underline:下划线
- lineThrough:删除线
- italic:斜体
注意:
- 默认值为空,表示无样式。
- 传入的值如果不是以上可选值,则被忽略。
示例值:["lineThrough"]
名称类型是否必填描述image_keystring是图片 Key。通过 上传图片 接口可以获取到图片 Key(image_key)。
示例值:d640eeea-4d2f-4cb3-88d8-c964fab53987
名称类型是否必填描述file_keystring是视频文件的 Key。通过 上传文件 接口上传视频(mp4 格式)后,可以获取到视频文件 Key(file_key)。
示例值:file_v2_0dcdd7d9-fib0-4432-a519-41d25aca542jimage_keystring否视频封面图片的 Key。通过 上传图片 接口可以获取到图片 Key(image_key)。
默认值:空,表示无视频封面。
示例值:img_7ea74629-9191-4176-998c-2e603c9c5e8g
名称类型是否必填描述emoji_typestring是表情文案类型。可选值参见 表情文案说明。
示例值:SMILE
名称类型是否必填描述languagestring否代码块的语言类型。可选值有 PYTHON、C、CPP、GO、JAVA、KOTLIN、SWIFT、PHP、RUBY、RUST、JAVASCRIPT、TYPESCRIPT、BASH、SHELL、SQL、JSON、XML、YAML、HTML、THRIFT 等。
注意:
- 取值不区分大小写。
- 不传值则默认为文本类型。
示例值:GOtextstring是代码块内容。
示例值:func main() int64 {\n return 0\n}
富文本支持 tag 取值为 hr,表示一条分割线,该标签内无其他参数。
md 标签会独占一个或多个段落,不能与其他标签在同一行。md 标签仅支持发送, 获取消息内容 时将不再包含此标签,会根据 md 中的内容转换为其他相匹配的标签。md 标签内通过 text 参数设置 Markdown 内容。
名称类型是否必填描述textstring是Markdown 内容。支持的内容参见下表。
示例值:1. item1\n2. item2
在 text 参数内支持的语法如下表所示。
语法示例说明@ 用户<at user_id="ou_xxxxx">User</at>支持 @ 单个用户或所有人。
- @ 单个用户时,需要在 user_id 内传入实际用户的真实 ID。传入的值可以是用户的 user_id、open_id、union_id。各类 ID 获取方式参见 如何获取 User ID、Open ID 和 Union ID。
- 如需 @ 所有人,需要将 user_id 取值为 all。超链接[Feishu Open Platform](https://open.feishu.cn)在 Markdown 语法内, [] 用来设置超链接的文本内容、 () 用来设置超链接的地址。
注意:请确保链接地址的合法性,否则只发送文本内容部分。有序列表1. item1\n2. item2Markdown 配置说明:
- 每个编号的 . 符与后续内容之间要有一个空格。
- 每一列独立一行。如示例所示,可使用 \n 换行符换行。
- 支持嵌套多层级。
- 每个层级缩进 4 个空格,且编号均从 1. 开始。
- 可以与无序列表混合使用。无序列表- item1\n- item2Markdown 配置说明:
- 每列的 - 符与后续内容之间要有一个空格。
- 每一列独立一行。如示例所示,可使用 \n 换行符换行。
- 支持嵌套多层级。
- 每个层级缩进 4 个空格。
- 可以与有序列表混合使用,有序列表以 1. 开始编号。代码块```GO\nfunc main(){\n return\n}\n```代码块内容首尾需要使用 ``` 符号包裹,首部 ``` 后紧跟代码语言类型。支持的语言类型有 PYTHON、C、CPP、GO、JAVA、KOTLIN、SWIFT、PHP、RUBY、RUST、JAVASCRIPT、TYPESCRIPT、BASH、SHELL、SQL、JSON、XML、YAML、HTML、THRIFT 等(不区分大小写)。引用> demo引用内容。 > 符与后续内容之间要有一个空格。分割线\n --- \n如示例所示,前后需要各有一个 \n 换行符。加粗**加粗文本**配置说明:
- ** 符与加粗文本之间不能有空格。
- 加粗可以与斜体合用。例如 ***加粗+斜体***。
- 加粗的文本不支持再解析其他组件。例如文本为超链接则不会被解析。斜体*斜体文本*配置说明:
- * 符与加粗文本之间不能有空格。
- 斜体可以与加粗合用。例如 ***加粗+斜体***。
- 斜体的文本不支持再解析其他组件。例如文本为超链接则不会被解析。下划线~下划线文本~配置说明:
- ~ 符与下划线文本之间不能有空格。
- 下划线的文本不支持再解析其他组件。例如文本为超链接则不会被解析。
- 不支持与加粗、斜体、删除线合用。删除线~~删除线~~配置说明:
- ~~ 符与下划线文本之间不能有空格。
- 删除线的文本不支持再解析其他组件。例如文本为超链接则不会被解析。
- 不支持与加粗、斜体、下划线合用。
飞书卡片是一种可以灵活构建图文内容的消息类型: