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); } } }

相关新闻

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

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

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

2026/7/23 16:45:57 阅读更多 →
5种 Agent 协作互联模式深度解析:新手必备,收藏学习大模型核心技能!

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

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

2026/7/23 16:45:57 阅读更多 →
从 Kimi K3 的长上下文与 Agent 架构,看 GEO 语义匹配如何重构 AI 收录权重

从 Kimi K3 的长上下文与 Agent 架构,看 GEO 语义匹配如何重构 AI 收录权重

2026年7月,月之暗面发布 Kimi K3,参数规模达2.8万亿,具备100万 token 上下文窗口与原生视觉理解,并支持长时间自主运行的 Agent 模式。从工程视角看,这类超长上下文 自主检索模型的普及,正在改变 AI 搜索引…

2026/7/23 16:44:56 阅读更多 →

最新新闻

一个秒杀就把 MySQL 打挂了?我用 Redis + 异步削峰扛住了 100 倍流量

一个秒杀就把 MySQL 打挂了?我用 Redis + 异步削峰扛住了 100 倍流量

一个秒杀就把 MySQL 打挂了?我用 Redis 异步削峰扛住了 100 倍流量 📌 前言 “服务器竟然挂了?”——下午 14:00,秒杀准时开启,你盯着监控面板,QPS 瞬间飙到 3 万,数据库连接池爆满&#xff…

2026/7/23 16:53:59 阅读更多 →
F429-HAL-Usart(2026/7/23)

F429-HAL-Usart(2026/7/23)

目录 一、printf → fputc 完整流程图 二、两个实际细节 2.1 fputc 参数里的 FILE *f 为什么从来没用到? 2.2 超时值 0xFFFF vs 1000 的区别 三、分层架构总览 四、HAL_UART_Transmit vs HAL_UART_Receive 函数原型对比 对应到代码 一个比喻 超时值的小结 …

2026/7/23 16:53:59 阅读更多 →
【AI数字人形象定制黄金法则】:20年实战总结的7大避坑指南与3步高转化定制流程

【AI数字人形象定制黄金法则】:20年实战总结的7大避坑指南与3步高转化定制流程

更多请点击: https://codechina.net 第一章:AI数字人形象定制的底层逻辑与价值本质 AI数字人形象定制并非简单的图像合成或3D建模叠加,其底层逻辑建立在多模态感知、神经辐射场(NeRF)重建、参数化人脸模型&#xff08…

2026/7/23 16:53:59 阅读更多 →
AI客服系统优化:Agentic思维与5大实战技巧

AI客服系统优化:Agentic思维与5大实战技巧

1. 项目概述:当AI客服遇上Agentic思维去年夏天,我接手了一个濒临崩溃的智能客服系统改造项目。这个日均处理20万次咨询的系统,当时正面临37%的转人工率和大量用户投诉。在重构过程中,我发现传统基于固定流程的对话设计已经遇到天花…

2026/7/23 16:53:59 阅读更多 →
提升ChatGPT对话愉悦感:从技术工具到情感伙伴的优化路径

提升ChatGPT对话愉悦感:从技术工具到情感伙伴的优化路径

你有没有遇到过这种情况:和 ChatGPT 聊得正投入,突然它给出一个看似正确但细想又不太对劲的回答;或者你明明描述得很清楚,它却像没听懂一样反复确认;又或者你希望它能更懂你的情绪,而不仅仅是机械地完成任务…

2026/7/23 16:53:59 阅读更多 →
GPT-5.6与GPT-4对比:能力差异、API特性及办公应用分析

GPT-5.6与GPT-4对比:能力差异、API特性及办公应用分析

从 GPT-4 到 GPT-5.6,不只是版本号变了 过去大半年我一直在研究多模型集成方案,从自研搭建到开源 UI 部署,再到第三方平台,踩了不少坑。最近在 kulaai(titiai.cn) 上找到了一个比较省心的方案,…

2026/7/23 16:52:59 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻