You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Meet API获取会议结束时间及参与者权限问题求助

Google Meet实际结束时间获取与参与者权限问题解答

一、是否需要使用Reports API获取实际结束时间?

你当前通过Meet API拿到的latestEndTime字段,就是会议的实际结束时间。如果尝试多种Meet API方法后结果一致,说明这是该接口能返回的最准确数据。

至于Reports API:它属于Admin SDK的一部分,仅对Google Workspace域管理员开放,必须通过Admin Console配置权限后才能调用。如果你没有Admin Console权限,完全无法使用Reports API,所以这条路不可行,建议继续基于Meet API现有能力实现。

二、普通参与者无法获取会议数据的解决办法

Meet API的会议详情接口(如listConferenceRecords、listParticipants)默认仅对会议创建者或Workspace管理员开放权限,普通参与者直接调用会返回空数据或权限错误。可行的解决方式有以下几种:

  • 通过Calendar API间接获取基础信息:若普通参与者的日历中存在该会议,可调用Calendar API的events.get接口,获取会议的计划开始/结束时间(start/end字段),但无法拿到实际结束时间,除非创建者将会议结束状态同步至日历。
  • 创建者共享数据:让会议创建者的应用将会议实际结束时间同步至共享存储(如数据库),参与者的应用从该存储中读取数据,这是最直接的替代方案。
  • 使用Meet实时API:若需实时获取会议状态,可借助Meet实时API订阅会议状态变化,但需要会议创建者开启相关权限,且参与者必须处于会议中。

三、你的代码问题与优化建议

原代码存在的问题:

  1. listConferenceRecordsAsync的parent参数错误:该接口的parent应传入users/me(当前授权用户)或具体用户ID,而非conferenceId。
  2. 拼写错误:partisipants应为participants。
  3. 异步逻辑不严谨:嵌套循环中可能存在未正确处理的异步流程。

优化后的代码示例:

const { SpacesServiceClient, ConferenceRecordsServiceClient } = require("@google-apps/meet").v2; 
const { sendNotification } = require("../services/notification.service"); 

const processEvents = async (authClient) => { 
  const spacesClient = new SpacesServiceClient({ authClient }); 
  const meetingClient = new ConferenceRecordsServiceClient({ authClient }); 

  for (const event of events) { 
    if (!event.conferenceData?.conferenceId) continue;

    const conferenceId = event.conferenceData.conferenceId; 
    const spacesRequest = { name: `spaces/${conferenceId}` }; 

    try { 
      // 正确设置parent为当前用户,通过filter筛选目标会议
      const sessions = meetingClient.listConferenceRecordsAsync({ 
        parent: "users/me",
        filter: `conference_id="${conferenceId}"`
      }); 

      for await (const session of sessions) { 
        console.log("会议记录 ==> ", session);
        // 处理会议结束状态逻辑
        const meetingEnded = !!session.endTime;
        // 写入数据库逻辑...
        if (meetingEnded) {
          sendNotification("会议已结束");
        }

        // 获取参与者列表(修正拼写错误)
        const participants = meetingClient.listParticipants({ 
          parent: session.name 
        }); 

        for await (const participant of participants) { 
          console.log("参与者 ==> ", participant); 
        } 
      } 

      const spaces = await spacesClient.getSpace(spacesRequest); 
      console.log("空间信息 ==> ", spaces); 
      console.log("当前活跃会议 ==> ", spaces[0]?.activeConference); 
    } catch (error) { 
      console.error(`处理会议ID ${conferenceId}时出错:`, error); 
      // 捕获权限错误,给出明确提示
      if (error.code === 403) {
        console.log("当前用户无权限访问该会议详情");
      }
    } 
  } 
};

module.exports = { processEvents };

附:你作为创建者时获取的响应数据

{ 
  name: 'conferenceRecords/c00fb000-0000-40c9-9b0b-4b1bf1cd5c00/participants/000000000000000000000', 
  earliestStartTime: { seconds: '1722932647', nanos: 766303000 }, 
  latestEndTime: { seconds: '1722932745', nanos: 88111000 }, 
  signedinUser: { 
    user: 'users/000000000000000000000', 
    displayName: 'User Name' }, 
  user: 'signedinUser' 
}

内容的提问来源于stack exchange,提问作者user26677819

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 22:07:35