java快速构建飞书API消息推送、消息加急等功能

文章目录

  • 飞书机器人
    • 自定义机器人
    • 自定义应用机器人
  • 自定义应用发送消息
    • 普通文本 text
    • 富文本 post
    • 图片 image
    • 文件 file
    • 语音 audio
    • 视频 media
    • 消息卡片 interactive
    • 分享群名片 share_chat
    • 分享个人名片 share_user
  • 批量发送消息
  • 消息加急
    • 发送应用内加急
    • 发送短信加急
  • 发送电话加急
  • springboot核心代码实现

在这里插入图片描述

给指定用户或者会话一對一发送消息
支持文本、富文本、可交互的消息卡片、群名片、个人名片、图片、视频、音频、文件、表情包

飞书机器人

自定义机器人

在这里插入图片描述

自定义机器人是一种只能在当前群聊中使用的机器人。
你可以在 群设置>群机器人 面板中快捷创建一个自定义机器人,无需经过租户管理员审核,即可在当前群聊中通过调用webhook地址的方式完成消息推送。由于自定义机器人无需经过租户管理员审核即可使用,使用上的便捷性也限制了其使用范围:

  • 只能在被添加的群聊内使用,不能与机器人单聊
  • 只能对群聊进行单向的消息推送,不能调用飞书丰富的开放接口,获取任何用户、租户信息等
    在这里插入图片描述

自定义应用机器人

应用机器人需要在 开发者后台 中创建,申请发布并经过租户的应用管理员审核通过后,即可使用。在应用发布范围内的用户,可以直接与你创建的机器人单聊,或在 群设置>群机器人 面板中将这个机器人添加进群聊使用。应用机器人受本租户的应用管理员管控。在应用管理员进行权限审核后,应用机器人可以调用飞书丰富的开放接口,获取、使用用户和租户资源。
PS:应用机器人需要提前申请-管理员审核
在这里插入图片描述

自定义应用发送消息

普通文本 text

{"receive_id": "ou_7d8a6e6df7621556ce0d21922b676706ccs","content": "{\"text\":\" test content\"}", // 文本内容"msg_type": "text"
}// 如果需要文本中进行换行,需要增加转义
{"receive_id": "oc_xxx","content": "{\"text\":\"firstline \\n second line  \"}","msg_type": "text"
}// 文本消息@用法说明,user_id字段需填入open_id,union_id 或 user_id来@指定人
{"receive_id": "oc_xxx","content": "{\"text\":\"<at user_id=\\\"ou_xxxxxxx\\\"></at> text content\"}","msg_type": "text"
}

在这里插入图片描述

富文本 post

富文本可以在一条消息中同时支持文字、At、图片、视频、超链接等元素。
一个富文本可分多个段落(由多个[]组成),每个段落可由多个元素组成,每个元素由tag和相应的字段描述组成。主要图片元素必须是独立的一个段落。

{"receive_id": "oc_820faa21d7ed275b53d1727a0feaa917","content": "{\"zh_cn\":{\"title\":\"我是一个标题\",\"content\":[[{\"tag\":\"text\",\"text\":\"第一行 :\"},{\"tag\":\"a\",\"href\":\"http://www.feishu.cn\",\"text\":\"超链接\"},{\"tag\":\"at\",\"user_id\":\"ou_1avnmsbv3k45jnk34j5\",\"user_name\":\"tom\"}],[{\"tag\":\"img\",\"image_key\":\"img_7ea74629-9191-4176-998c-2e603c9c5e8g\"}],[{\"tag\":\"text\",\"text\":\"第二行:\"},{\"tag\":\"text\",\"text\":\"文本测试\"}],[{\"tag\":\"img\",\"image_key\":\"img_7ea74629-9191-4176-998c-2e603c9c5e8g\"}]]}}","msg_type": "post"
}

在这里插入图片描述

图片 image

{"receive_id": "oc_xxx","content": "{\"image_key\": \"img_7ea74629-9191-4176-998c-2e603c9c5e8g\"}",// 图片Key,可通过 上传图片 接口获取image_key。"msg_type": "image"
}

文件 file

{"receive_id": "oc_820faa21d7ed275b53d1727a0feaa917","content": "{\"file_key\":\"file_v2_xxx\"}",// 文件Key,可通过上传文件接口获取文件的 file_key。"msg_type": "file"
}

语音 audio

{"receive_id": "oc_xxx","content": "{\"file_key\":\"file_v2_xxx\"}",// 语音文件Key,可通过上传文件接口获取音频文件的 file_key。"msg_type": "audio"
}

视频 media

{"receive_id": "oc_xxx","content": "{\"file_key\":\"file_v2_xxx\",\"image_key\":\"img_v2_xxx\"}",// 视频文件Key,可通过上传文件接口获取视频文件的 file_key。// 视频封面图片Key,可通过上传图片接口获取图片的image_key。"msg_type": "media"
}

消息卡片 interactive

务必注意content消息内容的构建!!

// 使用卡片JSON发送
{"receive_id": "oc_820faa21d7ed275b53d1727a0feaa917","content": "{\"config\":{\"wide_screen_mode\":true},\"elements\":[{\"alt\":{\"content\":\"\",\"tag\":\"plain_text\"},\"img_key\":\"img_7ea74629-9191-4176-998c-2e603c9c5e8g\",\"tag\":\"img\"},{\"tag\":\"div\",\"text\":{\"content\":\"你是否曾因为一本书而产生心灵共振,开始感悟人生?\\n你有哪些想极力推荐给他人的珍藏书单?\\n\\n加入 **4·23 飞书读书节**,分享你的**挚爱书单**及**读书笔记**,**赢取千元读书礼**!\\n\\n📬 填写问卷,晒出你的珍藏好书\\n😍 想知道其他人都推荐了哪些好书?马上[入群围观](https://open.feishu.cn/)\\n📝 用[读书笔记模板](https://open.feishu.cn/)(桌面端打开),记录你的心得体会\\n🙌 更有惊喜特邀嘉宾 4月12日起带你共读\",\"tag\":\"lark_md\"}},{\"actions\":[{\"tag\":\"button\",\"text\":{\"content\":\"立即推荐好书\",\"tag\":\"plain_text\"},\"type\":\"primary\",\"url\":\"https://open.feishu.cn/\"},{\"tag\":\"button\",\"text\":{\"content\":\"查看活动指南\",\"tag\":\"plain_text\"},\"type\":\"default\",\"url\":\"https://open.feishu.cn/\"}],\"tag\":\"action\"}],\"header\":{\"template\":\"turquoise\",\"title\":{\"content\":\"📚晒挚爱好书,赢读书礼金\",\"tag\":\"plain_text\"}}}","msg_type": "interactive"}// 使用卡片模板template_id发送
{"receive_id": "ou_7d8a6exxxxccs","msg_type": "interactive","content": "{\"type\": \"template\", \"data\": { \"template_id\": \"ctp_xxxxxxxxxxxx\", \"template_variable\": {\"article_title\": \"这是文章标题内容\"} } }"}

在这里插入图片描述

分享群名片 share_chat

{"receive_id": "oc_xxx","content": "{\"chat_id\":\"oc_xxx\"}", // 群ID,获取方式请参见群ID 说明。"msg_type": "share_chat"
}

分享个人名片 share_user

{"receive_id": "oc_820faa21d7ed275b53d1727a0feaa917","content": "{\"user_id\":\"ou_xxx\"}",// 只支持Open ID,且机器人必须对该用户可见,用户的Open ID获取方式请参见了解更多:如何获取 Open ID。"msg_type": "share_user"
}

批量发送消息

给多个用户或者多个部门中的成员发送消息。
注意事项:
应用需要启用机器人能力
接口权限说明:必须拥有获取与发送单聊、群组消息权限,或者以应用的身份发消息权限至少拥有一个批量发送消息权限:给用户发送需要拥有 给多个用户批量发消息 权限给部门成员发送需要拥有 给一个或多个部门的成员批量发消息 权限
通过该接口发送的消息 不支持更新以及回复等操作
只能发送给用户,无法发送给群组
异步接口,会有一定延迟,每个应用待发送的消息按顺序处理,请合理安排批量发送范围和顺序。
单个应用每天通过该接口发送的总消息条数不超过50

消息加急

发送应用内加急

对指定消息进行应用内加急
注意事项:需要开启机器人能力不支持加急批量消息只能加急机器人自己发送的消息加急时机器人需要在加急消息所在的群中加急用户的未读加急总数不能超过200

发送短信加急

对指定消息进行应用内加急与短信加急
注意事项:需要开启机器人能力只能加急机器人自己发送的消息加急时机器人仍需要在加急消息所在的群组中加急用户的未读加急总数不能超过200条通过接口产生的短信加急将消耗企业的加急额度,请慎重调用

发送电话加急

对指定消息进行应用内加急与电话加急。
注意事项:需要开启机器人能力只能加急机器人自己发送的消息加急时机器人需要在加急消息所在的群组中加急用户的未读加急总数不能超过200条通过接口产生的电话加急将消耗企业的加急额度,请慎重调用

springboot核心代码实现

/** Copyright © 2020-2021 Nimbus Corporation All rights reserved.** 使本项目源码前请仔细阅读以下协议内容,如果你同意以下协议才能使用本项目所有的功能,* 否则如果你违反了以下协议,有可能陷入法律纠纷和赔偿,作者保留追究法律责任的权利.** 1、本代码为商业源代码,只允许已授权内部人员查看使用* 2、任何人员无权将代码泄露或者授权给其他未被授权人员使用* 3、任何修改请保留原始作者信息,不得擅自删除及修改** 请保留以上版权信息,否则作者将保留追究法律责任.*/package com.nimbus.messagecenter.util;import com.alibaba.nacos.shaded.com.google.common.collect.Lists;
import com.lark.oapi.Client;
import com.lark.oapi.service.contact.v3.model.BatchGetIdUserReq;
import com.lark.oapi.service.contact.v3.model.BatchGetIdUserReqBody;
import com.lark.oapi.service.contact.v3.model.BatchGetIdUserResp;
import com.lark.oapi.service.contact.v3.model.BatchGetIdUserRespBody;
import com.lark.oapi.service.contact.v3.model.UserContactInfo;
import com.lark.oapi.service.im.v1.model.CreateMessageReq;
import com.lark.oapi.service.im.v1.model.CreateMessageReqBody;
import com.lark.oapi.service.im.v1.model.CreateMessageResp;
import com.lark.oapi.service.im.v1.model.UrgentAppMessageReq;
import com.lark.oapi.service.im.v1.model.UrgentAppMessageResp;
import com.lark.oapi.service.im.v1.model.UrgentPhoneMessageReq;
import com.lark.oapi.service.im.v1.model.UrgentPhoneMessageResp;
import com.lark.oapi.service.im.v1.model.UrgentReceivers;
import com.lark.oapi.service.im.v1.model.UrgentSmsMessageReq;
import com.lark.oapi.service.im.v1.model.UrgentSmsMessageResp;
import com.nimbus.common.data.model.api.ApiResultDto;
import lombok.extern.slf4j.Slf4j;import java.util.ArrayList;
import java.util.List;
import java.util.Objects;/*** FeiShuUtil.** @author zhupeng* @version 1.0.0, 2024/4/9* @since 2024/4/9*/
@Slf4j
public class FeiShuUtil {/*** 通过手机号获取飞书用户信息.** @param phones     手机号* @param userIdType 用户ID类型,openid或user_id.* @param client     飞书客户端* @return 用户信息列表*/public static List<UserContactInfo> getFeiShuUsersByPhones(List<String> phones, String userIdType, Client client) {List<UserContactInfo> userContactInfos = new ArrayList<>();// 批量查询最多一次查询50个List<List<String>> splitPhones = Lists.partition(phones, 50);for (List<String> phone : splitPhones) {BatchGetIdUserReq req = BatchGetIdUserReq.newBuilder().userIdType(userIdType).batchGetIdUserReqBody(BatchGetIdUserReqBody.newBuilder().mobiles(phone.toArray(new String[0])).build()).build();BatchGetIdUserResp resp;try {resp = client.contact().user().batchGetId(req);} catch (Exception e) {throw new RuntimeException(e);}if (!resp.success()) {log.error("code:{}, msg:{}, regId:{}", resp.getCode(), resp.getMsg(), resp.getRequestId());}BatchGetIdUserRespBody data = resp.getData();if (Objects.nonNull(data)) {userContactInfos.addAll(List.of(data.getUserList()));}}return userContactInfos;}/*** 给指定用户发飞书消息.** @param receiveId     消息接收人:飞书用户id或飞书群号* @param content       消息内容* @param msgType       消息类型* @param receiveIdType 消息接收者id类型:open_id/user_id/union_id/email/chat_id* @param client        飞书客户端* @return 消息发送结果*/public static ApiResultDto sendFeiShuMessage(String receiveId, String content, String msgType, String receiveIdType, Client client) {CreateMessageReq req = CreateMessageReq.newBuilder().receiveIdType(receiveIdType).createMessageReqBody(CreateMessageReqBody.newBuilder().receiveId(receiveId)               // 消息接收人.msgType(msgType)                   // 消息类型.content(content)                   // 消息内容.build()).build();CreateMessageResp resp;try {resp = client.im().message().create(req);} catch (Exception e) {throw new RuntimeException(e);}if (!resp.success()) {log.error("code:{}, msg:{}, regId:{}", resp.getCode(), resp.getMsg(), resp.getRequestId());return ApiResultDto.failed(resp.getCode(), resp.getMsg());}return ApiResultDto.success(resp.getData());}/*** 针对某个消息给某个人进行消息加急,目前使用飞书用户user_id识别用户.** @param messageId  消息id* @param receiveIds 接收人id* @param client     飞书客户端* @return 处理结果*/public static ApiResultDto sendUrgentAppMessage(String messageId, List<String> receiveIds, Client client) {// 发起请求UrgentAppMessageReq req = UrgentAppMessageReq.newBuilder().messageId(messageId).userIdType("user_id").urgentReceivers(UrgentReceivers.newBuilder().userIdList(receiveIds.toArray(new String[0])).build()).build();UrgentAppMessageResp resp;try {resp = client.im().message().urgentApp(req);} catch (Exception e) {throw new RuntimeException(e);}if (!resp.success()) {log.error("code:{}, msg:{}, regId:{}", resp.getCode(), resp.getMsg(), resp.getRequestId());return ApiResultDto.failed(resp.getCode(), resp.getMsg());}return ApiResultDto.success(resp.getData());}/*** 针对某个消息给某个人进行短信加急,目前使用飞书用户user_id识别用户.** @param messageId  消息id* @param receiveIds 接收人id* @param client     飞书客户端* @return 处理结果*/public static ApiResultDto sendUrgentSmsMessage(String messageId, List<String> receiveIds, Client client) {// 发起请求UrgentSmsMessageReq req = UrgentSmsMessageReq.newBuilder().messageId(messageId).userIdType("user_id").urgentReceivers(UrgentReceivers.newBuilder().userIdList(receiveIds.toArray(new String[0])).build()).build();UrgentSmsMessageResp resp;try {resp = client.im().message().urgentSms(req);} catch (Exception e) {throw new RuntimeException(e);}if (!resp.success()) {log.error("code:{}, msg:{}, regId:{}", resp.getCode(), resp.getMsg(), resp.getRequestId());return ApiResultDto.failed(resp.getCode(), resp.getMsg());}return ApiResultDto.success(resp.getData());}/*** 针对某个消息给某个人进行电话加急,目前使用飞书用户user_id识别用户.** @param messageId  消息id* @param receiveIds 接收人id* @param client     飞书客户端* @return 处理结果*/public static ApiResultDto sendUrgentPhoneMessage(String messageId, List<String> receiveIds, Client client) {// 发起请求UrgentPhoneMessageReq req = UrgentPhoneMessageReq.newBuilder().messageId(messageId).userIdType("user_id").urgentReceivers(UrgentReceivers.newBuilder().userIdList(receiveIds.toArray(new String[0])).build()).build();UrgentPhoneMessageResp resp;try {resp = client.im().message().urgentPhone(req);} catch (Exception e) {throw new RuntimeException(e);}if (!resp.success()) {log.error("code:{}, msg:{}, regId:{}", resp.getCode(), resp.getMsg(), resp.getRequestId());return ApiResultDto.failed(resp.getCode(), resp.getMsg());}return ApiResultDto.success(resp.getData());}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/306367.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文复现:nn.L1Loss()

nn.L1Loss() 是 PyTorch 中的一个损失函数&#xff0c;属于 torch.nn 模块的一部分。它计算预测值和真实值之间差的绝对值的平均值&#xff0c;也就是 L1 距离&#xff08;或曼哈顿距离&#xff09;。这个损失函数常用于回归任务&#xff0c;特别是当你希望减少异常值对总体损失…

核心api实操-Activiti7从入门到专家(5)

背景 上一节已经搭建了&#xff0c;具体的开发环境&#xff0c;数据库&#xff0c;并且找了一个可以用bpmnjs流程设计器&#xff0c;这一些&#xff0c;我们对核心api做个基础的实操&#xff0c;有个感性的认知&#xff0c;另外对数据库和基本数据流动有个理解。 部署 模板部…

深度学习pytorch实战第P2周:CIFAR10彩色图片识别

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 零、引言&#xff08;温故而知新&#xff…

智能合约平台开发指南

随着区块链技术的普及&#xff0c;智能合约平台已经成为了这个领域的一个重要趋势。智能合约可以自动化执行合同条款&#xff0c;大大减少了执行和监督合同条款所需的成本和时间。那么&#xff0c;如何开发一个智能合约平台呢&#xff1f;以下是一些关键步骤。 一、选择合适的区…

MySQL学习笔记2——基础操作

基础操作 一、增删改查1、添加数据2、删除数据3、修改数据4、查询语句 二、主键三、外键和连接1、外键2、连接 一、增删改查 1、添加数据 INSERT INTO 表名[(字段名[,字段名]…)] VALUES (值的列表); --[]表示里面的内容可选添加数据分为插入数据记录和插入查询结果 插入数据…

AI+BI,欢迎数据分析进入大模型时代

过去一年大模型应用集中爆发&#xff0c;中关村科金作为领先的对话式AI技术解决方案提供商&#xff0c;基于各个行业真实的业务痛点&#xff0c;围绕营销、服务与运营场景&#xff0c;创新打造和升级了知识助手、投顾助手、智能陪练等大模型应用&#xff0c;全面赋能客户经理展…

【INNODB引擎篇】深奥探究Innodb存储引擎

&#x1f525;作者主页&#xff1a;小林同学的学习笔录 &#x1f525;mysql专栏&#xff1a;小林同学的专栏 目录 1.InnoDB引擎 1.1 逻辑存储结构 1.2 架构 1.2.1 概述 1.2.2 内存结构 1.2.3 磁盘结构 1.2.4 后台线程 1.3 事务原理 1.3.1 事务基础 1.3.2 redo log 1.…

鸿蒙TypeScript学习第12天【Map对象】

1、TypeScript Map 对象 Map 对象保存键值对&#xff0c;并且能够记住键的原始插入顺序。 任何值(对象或者原始值) 都可以作为一个键或一个值。 Map 是 ES6 中引入的一种新的数据结构&#xff0c;可以参考gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md 2、创…

【架构-九】数据库反规范化设计

什么是反规范化设计&#xff1f; 反规范化是指为了提高数据库的性能或满足特定需求而向数据库中增加冗余数据的过程。与数据库规范化设计正好相反&#xff0c;反规范化的目的是减少查询的复杂度&#xff0c;加快数据检索的速度。主要的反规范化手段如下&#xff1a; 优点&am…

YOLOv8打印模型结构配置信息并查看网络模型详细参数:参数量、计算量(GFLOPS)

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Python3.7编程之病毒

基础篇 什么是病毒 病毒&#xff0c;指的是一些通过非法手段获取系统的一些权限&#xff0c;然后进行破坏或者盗取。 病毒分为两类&#xff1a; 1、破坏型 这类病毒往往会将系统弄的乱七八糟&#xff0c;比如把你的U盘删光&#xff0c;把你的系统背景调成黑客图片&#xff0c…

python 的join函数

join函数是一个对字符串处理的函数 字符串.join(str)的含义是把字符串加入到str的每一个间隙里面 如 str1234 ,.join(str) #打印的结果为 1,2,3,4

类和对象【一】类和对象简介

文章目录 C的类与C语言结构体的区别【引入类】类的定义类体中的成员函数的实现类中的访问限定符C中class和struct的区别 类的作用域类的实例化类中成员的存储位置类的大小 C的类与C语言结构体的区别【引入类】 类里面不仅可以定义变量还可以定义函数 例 类具有封装性【将在该…

abap 字符超过255的显示

大家都知道SAP ALV的一个单元格最大显示的长度就是255 意思就是你的这个字段在内表里面即使是超过255位&#xff0c;也无法只能显示255 如果客户的需求是需要看到完整的消息内容&#xff0c; 最简单的就是将整个程序的数据右键导出到excle中去查看 如果客户执意需要在ALV中…

python+django教师业绩考评考核评分系统flask

在设计过程中&#xff0c;将参照一下国内外的一些同类网站&#xff0c;借鉴下他们的一些布局框架&#xff0c;将课题要求的基本功能合理地组织起来&#xff0c;形成友好、高效的交互过程。开发的具体步骤为&#xff1a;   第一步&#xff0c;进行系统的可行性分析&#xff0c…

佛山市人工智能产业生态交流会:实在智能Agent引领“智造浪潮”

制造业&#xff0c;实体经济的核心&#xff0c;技术创新的先锋&#xff0c;供给侧结构性改革的关键。在新一轮产业竞争中&#xff0c;数字化转型成为制造业升级的必由之路&#xff0c;是引领未来的重要抓手。 为促进数字经济赋能实体经济&#xff0c;加快人工智能技术的推广应用…

汇编入门--基础知识(1)

1.汇编语言的概念 汇编语言是一种低级编程语言&#xff0c;它与计算机的机器语言非常接近&#xff0c;但比机器语言更易于人类阅读和理解。汇编语言是用一系列的助记符来表示机器语言的操作码和操作数。每种计算机体系结构&#xff08;如x86、ARM等&#xff09;都有自己的汇编语…

CCD机器视觉在工业生产中起到什么作用?

CCD机器视觉尺寸测量是基于相对测量方法&#xff0c;通过可追溯性、放大校准、自动边缘提升和屏幕图像测量来计算实际尺寸。在精密测量中&#xff0c;放大倍数必须达到35倍或更高&#xff0c;才能达到微米级的精度。此时&#xff0c;视线宽度小于5mm。对于大于5mm的物体&#x…

小型时间继电器ST3PA-C DC24V 带插座PF085A 导轨安装 JOSEF约瑟

ST3P系列时间继电器 系列型号 ST3PF-2Z(JSZ3F-2Z) 5s AC110V ST3PF(JSZ3F) 10s AC48V ST3PC-1(AH3-3) 5s DC24V ST3PC-1(AH3-3) 2h AC220V ST3PC-F(JSZ3C-F) AC380V ST3PA-E(JSZ3A-E) DC24V ST3PA-F(JSZ3A-F) DC24V ST3PF(JSZ3F) 10s AC36V ST3PC-1(AH3-3) 10s AC24V ST3PC-1…

Linux使用C语言实现Socket编程

Socket编程 这一个课程的笔记 相关文章 协议 Socket编程 高并发服务器实现 线程池 网络套接字 socket: &#xff08;电源&#xff09;插座&#xff08;电器上的&#xff09;插口&#xff0c;插孔&#xff0c;管座 在通信过程中, 套接字是成对存在的, 一个客户端的套接字, 一个…