尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Java集成飞书实现预约飞书视频会议功能
1. 背景与需求在企业办公场景中经常需要根据员工的工号自动创建或拉起飞书视频会议。本文介绍如何通过 Java 集成飞书开放平台的视频会议 API实现根据工号批量邀请参会人、创建并启动视频会议的功能。2. 前置准备2.1 飞书应用配置在飞书开放平台open.feishu.cn创建企业自建应用获取以下凭证App ID应用的唯一标识App Secret应用的密钥用于获取 tenant_access_token同时需要在应用权限中开启以下权限vc:meeting视频会议权限contact:user.employee_id:readonly通过工号查询用户信息2.2 Maven 依赖在项目的pom.xml中添加以下依赖dependency groupIdcom.larksuite.oapi/groupId artifactIdoapi-sdk/artifactId version2.5.3/version /dependency版本说明2.5.3 是飞书官方 SDK 的最新稳定版本相比 2.0.12 有更好的稳定性和更多功能支持。3. 核心实现Java集成飞书实现预约飞书视频会议功能实现步骤分1.获取自建应用token2.根据工号获取到用户id (userId)3.获取主日历信息4.创建对应日程-需要开启对应会议5.日程关联对应参会人员之后对应参会人员的日历里面就有对应的日程3.1 获取租户访问令牌-自建应用获取 tenant_access_token参考飞书文档自建应用获取 tenant_access_token - 服务端 API - 飞书开放平台权限要求无调用飞书接口都需要token: token又分应用token 和 用户token 现在介绍的是应用token在飞书开放平台open.feishu.cn创建企业自建应用获取以下凭证App ID应用的唯一标识App Secret应用的密钥用于获取 tenant_access_token/** * 获取 tenant_access_token */ public static String getTenantAccessToken() throws Exception { String url https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal; JSONObject reqBody new JSONObject(); reqBody.put(app_id, APP_ID); reqBody.put(app_secret, APP_SECRET); try (CloseableHttpClient httpClient HttpClients.createDefault()) { HttpPost post new HttpPost(url); post.setHeader(Content-Type, application/json;charsetutf-8); post.setEntity(new StringEntity(reqBody.toString(), StandardCharsets.UTF_8)); try (CloseableHttpResponse response httpClient.execute(post)) { String respText EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); JSONObject respJson JSON.parseObject(respText); int code respJson.getIntValue(code); if (code ! 0) { throw new RuntimeException(获取token失败 code: code msg: respJson.getString(msg)); } return respJson.getString(tenant_access_token); } } }3.2 批量获取员工列表参考飞书文档批量获取员工列表 - 服务端 API - 飞书开放平台权限要求directory:employee:list调用 API 获取员工列表/** * 根据工号数组批量查询 user_id */ public static ListString getUserIdsByJobNumbers(String tenantToken, ListString jobNumbers) throws Exception { ListString userIdList new ArrayList(); String url https://open.feishu.cn/open-apis/directory/v1/employees/filter; try (CloseableHttpClient httpClient HttpClients.createDefault()) { HttpPost post new HttpPost(url); post.setHeader(Authorization, Bearer tenantToken); post.setHeader(Content-Type, application/json;charsetutf-8); JSONObject reqBody new JSONObject(); JSONObject filter new JSONObject(); JSONArray conditions new JSONArray(); for (String jobNo : jobNumbers) { JSONObject cond new JSONObject(); cond.put(field, work_info.job_number); cond.put(operator, eq); cond.put(value, \jobNo\); conditions.add(cond); } filter.put(conditions, conditions); reqBody.put(filter, filter); JSONArray requiredFields new JSONArray(); requiredFields.add(base_info.user_id); reqBody.put(required_fields, requiredFields); JSONObject pageReq new JSONObject(); pageReq.put(page_size, 20); reqBody.put(page_request, pageReq); post.setEntity(new StringEntity(reqBody.toString(), StandardCharsets.UTF_8)); try (CloseableHttpResponse response httpClient.execute(post)) { String respText EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); JSONObject respJson JSON.parseObject(respText); int code respJson.getIntValue(code); if (code ! 0) { throw new RuntimeException(工号查用户失败 code: code msg: respJson.getString(msg)); } JSONObject data respJson.getJSONObject(data); JSONArray employees data.getJSONArray(abnormals); for (int i 0; i employees.size(); i) { JSONObject emp employees.getJSONObject(i); userIdList.add(emp.getString(id)); } return userIdList; } } }3.3 查询主日历信息参考飞书文档查询主日历信息 - 服务端 API - 飞书开放平台权限要求calendar:calendar:read(读取日历信息) 和 calendar:calendar:readonly获取日历、日程及忙闲信息/** * 获取个人主日历ID */ public static String getPrimaryCalendarId(String tenantToken, String hostUserId) throws Exception { String url https://open.feishu.cn/open-apis/calendar/v4/calendars/primary; try (CloseableHttpClient httpClient HttpClients.createDefault()) { HttpPost post new HttpPost(url); post.setHeader(Authorization, Bearer tenantToken); post.setHeader(Content-Type, application/json;charsetutf-8); JSONObject param new JSONObject(); param.put(user_id, hostUserId); post.setEntity(new StringEntity(param.toString(), StandardCharsets.UTF_8)); try (CloseableHttpResponse response httpClient.execute(post)) { String respText EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); JSONObject respJson JSON.parseObject(respText); int code respJson.getIntValue(code); if (code ! 0) { throw new RuntimeException(获取日历ID失败 code: code msg: respJson.getString(msg)); } JSONObject data respJson.getJSONObject(data); JSONArray calendarsArr data.getJSONArray(calendars); JSONObject itemObj calendarsArr.getJSONObject(0); JSONObject calendarObj itemObj.getJSONObject(calendar); return calendarObj.getString(calendar_id); } } }3.4 创建日程-默认创建会议参考飞书文档创建日程 - 服务端 API - 飞书开放平台权限要求calendar:calendar(更新日历及日程信息)和calendar:calendar.event:create创建日程/** * 核心创建日程方法入参统一 CalendarEventDTO */ public static JSONObject createEvent(String tenantToken, String calendarId, SentViaFeiShuConferenceDTO dto) throws Exception { String url https://open.feishu.cn/open-apis/calendar/v4/calendars/ calendarId /events; try (CloseableHttpClient httpClient HttpClients.createDefault()) { HttpPost post new HttpPost(url); post.setHeader(Authorization, Bearer tenantToken); post.setHeader(Content-Type, application/json;charsetutf-8); JSONObject event new JSONObject(); // 从DTO读取会议名称、备注 event.put(summary, dto.getSummary()); event.put(description, dto.getDescription()); event.put(timezone, Asia/Shanghai); // 从DTO读取起止时间并转时间戳 long startTs getTimeStamp(dto.getStartTime()); JSONObject startTime new JSONObject(); startTime.put(timestamp, String.valueOf(startTs)); startTime.put(timezone, Asia/Shanghai); event.put(start_time, startTime); long endTs getTimeStamp(dto.getEndTime()); JSONObject endTime new JSONObject(); endTime.put(timestamp, String.valueOf(endTs)); endTime.put(timezone, Asia/Shanghai); event.put(end_time, endTime); // 视频会议配置无assign_hosts消除193101报错 JSONObject vchat new JSONObject(); vchat.put(vc_type, vc); JSONObject meeting_settings new JSONObject(); // 主持人user_id作为视频owner String hostJob dto.getHostJobNumber(); // 这里先占位后面替换成查询后的hostUserId meeting_settings.put(owner_id, ); meeting_settings.put(join_meeting_permission, only_event_attendees); meeting_settings.put(allow_attendees_start, true); vchat.put(meeting_settings, meeting_settings); event.put(vchat, vchat); // 先查询全部user_id ListString allUserIdList dto.getAttendeeJobNumbersIds(); dto.setAttendeeJobNumbersIds(allUserIdList); // 拆分主持人、参会人ID String hostUserId dto.getHostUserId(); ListString memberIds allUserIdList.subList(1, allUserIdList.size()); // 修正视频owner_id为主持人真实user_id vchat.getJSONObject(meeting_settings).put(owner_id, hostUserId); // 组装参会人 JSONArray attendees buildAttendeeList(hostUserId, memberIds); event.put(attendees, attendees); // 参会人互相可见参与者列表 event.put(attendee_ability, can_see_others); event.put(visibility, default); post.setEntity(new StringEntity(event.toString(), StandardCharsets.UTF_8)); try (CloseableHttpResponse response httpClient.execute(post)) { String respText EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); JSONObject respJson JSON.parseObject(respText); System.out.println( 创建日程完整返回 ); System.out.println(respJson.toJSONString()); int code respJson.getIntValue(code); if (code ! 0) { throw new RuntimeException(创建日程失败 code: code msg: respJson.getString(msg)); } return respJson.getJSONObject(data); } } }3.35 关联参会人员参考飞书文档​​​​​​​添加日程参与人 - 服务端 API - 飞书开放平台权限要求calendar:calendar(更新日历及日程信息)和calendar:calendar.event:update更新日程/** * 给已存在的日程新增参会人 */ public static JSONObject addEventAttendees(String calendar_id, String event_id, String tenantToken,SentViaFeiShuConferenceDTO eventDTO) throws Exception { String url https://open.feishu.cn/open-apis/calendar/v4/calendars/ calendar_id /events/ event_id /attendees; try (CloseableHttpClient httpClient HttpClients.createDefault()) { HttpPost post new HttpPost(url); post.setHeader(Authorization, Bearer tenantToken); post.setHeader(Content-Type, application/json;charsetutf-8); JSONObject reqBody new JSONObject(); JSONArray attendeesArr new JSONArray(); JSONObject host new JSONObject(); host.put(type, user); host.put(user_id, eventDTO.getHostUserId()); attendeesArr.add(host); for (String userId : eventDTO.getAttendeeJobNumbersIds()) { JSONObject attendee new JSONObject(); attendee.put(type, user); attendee.put(user_id, userId); attendeesArr.add(attendee); } reqBody.put(attendees, attendeesArr); post.setEntity(new StringEntity(reqBody.toString(), StandardCharsets.UTF_8)); try (CloseableHttpResponse response httpClient.execute(post)) { String respText EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8); JSONObject respJson JSON.parseObject(respText); System.out.println( 新增参会人返回完整响应 ); System.out.println(respJson.toJSONString()); int code respJson.getIntValue(code); if (code ! 0) { throw new RuntimeException(新增参会人失败 code: code msg: respJson.getString(msg)); } return respJson.getJSONObject(data); } } }
RELATED

相关推荐

鸿蒙 PC Markdown 编辑器设置持久化模型:Preferences、类型收敛与失败降级

鸿蒙 PC Markdown 编辑器设置持久化模型:Preferences、类型收敛与失败降级

鸿蒙 PC Markdown 编辑器设置持久化模型:Preferences、类型收敛与失败降级 编辑器设置的价值不在于面板上能点,而在于选择能够跨会话稳定恢复,又不会因为旧值、损坏值或写入失败破坏文档工作流。OhMarkdown 当前持久化自动保存策略、图片资源…

📅 2026/8/22 1:46:31
5种 Agent 协作互联模式深度解析:新手必备,收藏学习大模型核心技能!

5种 Agent 协作互联模式深度解析:新手必备,收藏学习大模型核心技能!

本文详细介绍了五种 Agent 协作互联模式,包括 As Tool、Handoff、Hierarchical、Group Chat 和 Blackboard。文章通过对比分析各模式在控制权、上下文、Token 成本、可观测性等方面的优劣势,帮助读者建立选型直觉。特别强调了 As Tool 模式的广泛应用和调…

📅 2026/8/22 18:36:27
从 PoC 到生产:2026 CXL 内存扩展方案选型检查清单与厂商对比

从 PoC 到生产:2026 CXL 内存扩展方案选型检查清单与厂商对比

CXL 内存扩展正在从概念验证走向生产验证。AI 训练、推理服务、内存数据库、实时分析和 HPC 任务不断推高单机内存需求,但单纯堆 DRAM 会带来高成本和资源闲置。CXL 为服务器提供了新的内存扩展路径,也让“内存池化”和“软件定义内存”成为数据中心规划…

📅 2026/8/22 18:36:28
MORE NEWS

更多资讯

📰

三级网络技术备考:用Python处理历年真题PDF,生成考点统计与错题卡

简介:这份资源是《全国计算机等级考试三级网络技术历年真题》PDF,主要面向备考计算机三级网络技术的考生,旨在通过历年真题练习熟悉题型、巩固考点并检验复习效果。整个资源包仅有1个PDF文件,大小为448KB,轻量易下载&a…

📰

Jetson Orin开发环境深度调优:SSD稳定性与Ubuntu Focal内核适配

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

AgentScope 2.0 实战指南:半天构建一套可信的多智能体系统

AgentScope 2.0 实战指南:半天构建一套可信的多智能体系统 【免费下载链接】agentscope Build and run agents you can see, understand and trust. 项目地址: https://gitcode.com/GitHub_Trending/ag/agentscope 先说选型结论:做生产级多智能体…

📰

Daft Common Crawl 实战教程:从网页语料到句子级文本嵌入的完整流水线

Daft Common Crawl 实战教程:从网页语料到句子级文本嵌入的完整流水线 【免费下载链接】Daft High-performance data engine for AI and multimodal workloads. Process images, audio, video, and structured data at any scale 项目地址: https://gitcode.com/G…

📰

锂电池MES必须以电芯ID为核心重构数据骨架

简介:本资源是一份面向锂电池制造企业数字化转型实践者的MES系统整体解决方案PPT,聚焦设备联机与制造执行两大核心模块,解决产线自动化集成难、工艺过程管控弱、产品全链路追溯难等痛点。文件为单个8.28MB的PPTX格式演示文稿,内容…

📰

SLG服务器开发:菱形瓦片与笛卡尔坐标互转原理与落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬