Discourse Zoom

:discourse2: 摘要 Discourse Zoom 插件通过付费的 Zoom 订阅,帮助 Discourse 管理员和用户在 Discourse 平台内直接安排、管理和参与 Zoom 网络研讨会。
:hammer_and_wrench: 代码库链接 https://github.com/discourse/discourse-zoom
:open_book: 安装指南 如何在 Discourse 中安装插件

概述

此插件将 Zoom 网络研讨会集成到 Discourse 实例中。Zoom 网络研讨会可以与主题关联,Discourse 用户可以注册网络研讨会并在其开始时加入。

:warning: 由于 Zoom 已弃用 JWT 身份验证,自 2023 年 8 月 1 日起,该插件的身份验证机制已从 JWT(现已弃用,Zoom 将于 9 月 1 日移除)更改为服务器到服务器的 OAuth。现有插件用户需要更新其设置。

功能

  • 当 Zoom 网络研讨会开始时,“注册”按钮会自动切换为“加入”,点击后将使用 Zoom SDK 在 Discourse 社区内的专用端点启动网络研讨会
  • 在活动开始前 N 分钟自动提醒网络研讨会注册者(N 可在插件设置中配置,默认情况下提醒功能已关闭)
  • 管理员可以在 Discourse 中为网络研讨会添加小组成员
  • 管理员可以在 Discourse 中添加网络研讨会视频录制的链接,该链接将在活动结束后向用户显示
  • Zoom 活动主持人和小组成员将与 Discourse 用户账户关联

使用方法

要使用 Discourse Zoom 插件,首先需要在 Discourse 实例中安装它,并使用您的 Zoom 服务器到服务器 OAuth 应用凭据进行配置。设置好插件后,您可以通过创建新主题并将其与网络研讨会关联来创建新的 Zoom 网络研讨会。然后,用户可以直接从主题中注册网络研讨会。

安装

步骤 1:在 Discourse 实例中安装插件

您可以按照此处说明在 Discourse 实例中安装插件。

步骤 2:在 Zoom Marketplace 中创建服务器到服务器的 OAuth 应用


开始之前,您需要在 Zoom Marketplace 中创建一个服务器到服务器的 OAuth 应用。此应用将用于向 Zoom API 发出请求并通过 Webhooks 接收事件通知。


步骤 3:配置插件

安装插件后,进入您的 Discourse 站点设置,勾选 zoom enabled 复选框并保存。

从 Zoom Marketplace 进入 App Credentials(应用凭据)选项卡:

然后将值复制并粘贴到您的 Discourse 实例中对应的站点设置:

  • zoom s2s account id
  • zoom s2s client id
  • zoom s2s client secret

步骤 4:设置 Webhook 密钥令牌

在您的 Zoom 服务器到服务器 OAuth 应用的 Feature(功能)选项卡上,复制“Secret Token”(密钥令牌),并将其添加到您的 Discourse 站点的 zoom webhooks secret token 站点设置中。

步骤 5:启用事件订阅

仍在您的 Zoom 服务器到服务器 OAuth 应用的 Feature(功能)选项卡上,启用“Event Subscriptions”(事件订阅),然后点击 Add Event Subscription 按钮:

接下来,将“Event notification endpoint URL”(事件通知端点 URL)设置为:

https://YOURSITE.COM/zoom/webhooks/webinars.json

然后点击 + Add Events 按钮:

从事件类型列表中打开 Webinar(网络研讨会)选项卡,并勾选所有列出的事件。如果看不到 Webinar 事件权限,请查看如何启用权限

在您之前设置的“Event notification endpoint URL”下,找到 Validate 按钮:

如果一切正常,应显示 一个绿色的对勾图标,旁边写着“Validated”

最后,点击页面底部的 Save 按钮。

步骤 6:作用域

设置好事件订阅后,转到 Scopes(作用域)选项卡,点击 Add Scopes 按钮。在这里,您可以通过搜索表中给出的值、手动输入或使用部分值来选择以下作用域。例如,与其搜索 webinar:read:list_panelists:admin,不如搜索 webinar:read:,这样可以缩小显示范围,更容易找到所需的作用域。

在服务器到服务器 OAuth 应用的“作用域”选项卡下点击 Add Scopes 按钮,将弹出一个窗口:

在搜索作用域时,可以按完整或部分名称进行搜索。为了方便起见,您可以将下表中的每个作用域复制粘贴进去,或者在相应的选项卡下搜索它们:

用户

scope desc
user:read:user:admin 查看用户
user:read:email:admin 验证用户电子邮件
user:read:list_users:admin 查看用户列表

网络研讨会

scope desc
webinar:read:list_panelists:admin 查看网络研讨会的小组成员
webinar:read:list_absentees:admin 查看过往网络研讨会的缺席者
webinar:read:webinar:admin 查看网络研讨会
webinar:read:registrant:admin 查看网络研讨会的注册者
webinar:read:list_registrants:admin 查看网络研讨会的注册者列表
webinar:write:batch_registrants:admin 向网络研讨会添加注册者
webinar:delete:webinar:admin 删除网络研讨会
webinar:write:panelist 向网络研讨会添加小组成员
webinar:delete:registrant 移除网络研讨会的注册者
webinar:write:webinar 为用户创建网络研讨会
webinar:update:status 更新网络研讨会状态
webinar:delete:panelist 移除网络研讨会的小组成员
webinar:update:webinar 更新网络研讨会
webinar:write:registrant 向网络研讨会添加注册者

网络研讨会

scope desc
webinar:read:list_panelists:admin 查看网络研讨会的小组成员
webinar:read:list_absentees:admin 查看过往网络研讨会的缺席者
webinar:read:webinar:admin 查看网络研讨会
webinar:read:registrant:admin 查看网络研讨会的注册者
webinar:read:list_registrants:admin 查看网络研讨会的注册者列表
webinar:write:batch_registrants:admin 向网络研讨会添加注册者
webinar:delete:webinar:admin 删除网络研讨会
webinar:write:panelist 向网络研讨会添加小组成员
webinar:delete:registrant 移除网络研讨会的注册者
webinar:write:webinar 为用户创建网络研讨会
webinar:update:status 更新网络研讨会状态
webinar:delete:panelist 移除网络研讨会的小组成员
webinar:update:webinar 更新网络研讨会
webinar:write:registrant 向网络研讨会添加注册者

步骤 7:创建 Meeting SDK 应用

:warning: Zoom 已在其端进行了更改,我们正在努力更新指南。


SDK 会议应用用于对用户进行身份验证,以便用户可以加入网络研讨会会议。


首先创建一个 General App(通用应用),在 Select how the app is managed(选择应用管理方式)下,选择 User-managed(用户管理)。

在通用应用的 Basic Information(基本信息)选项卡中,将 Client ID/ SDK key 复制并粘贴到 zoom sdk key 字段,将 Client Secret/SDK secret 复制并粘贴到 zoom sdk secret 字段。

向下滚动,您会找到 OAuth Information(OAuth 信息)部分,在 OAuth Redirect URL 中填入您的站点 URL,例如 https://YOURSITE.com

步骤 8:指定应用用途

Features(功能)选项卡下选择 Embed(嵌入)子选项卡,启用 Meeting SDK

限制

该插件仅适用于不需要在 Zoom 中注册的网络研讨会。

关于破坏性变更的说明

由于 Zoom API 的弃用,旧版本的插件需要按照本文提到的步骤进行配置。

:discourse2: 由我们托管?此插件可在我们的企业版计划中使用。

63 个赞

非常感谢你为此付出的努力,这个功能太棒了!

我成功安装了插件,在 Zoom 中创建了 JWT 应用,并按照说明配置了我的 Discourse。不过,当我在编辑器中使用 Zoom 网络研讨会按钮将已安排的会议与帖子关联时,遇到了问题。

如果你能详细说明一下在“添加网络研讨会”下方的文本输入框中究竟需要输入什么,那就太好了。目前无论是会议 ID 还是完整 URL 对我来说似乎都无法正常工作。

另外,我注意到一个次要问题:管理员仪表板“插件”页面中链接的仓库地址指向的是 https://github.com/discourse-org/discourse-zoom,但实际上应该链接到 https://github.com/discourse/discourse-zoom。

2 个赞

这个概念很有趣,看起来能为社区成员带来不错的体验!

我很好奇,是否已经考虑过让该插件支持更通用(与供应商无关)的工作流程?例如,提供嵌入倒计时功能以指向特定日期和时间,指定主持人或嘉宾,链接到网络研讨会 URL,以及后续提供录播链接等。

Jiti(开源项目)是我心中想到的一个例子,但显然在这个领域还有多种选择。

2 个赞

您需要输入网络研讨会的 ID。如果您在模态窗口中仍无法添加事件,可以在网站的 /logs 日志中看到更多详细信息。此外,我也修复了您提到的 URL 问题,感谢您的反馈。

很遗憾,目前该插件尚不支持不依赖特定供应商的工作流程。不过,Zoom 的 API 调用已进行了抽象处理,因此只需付出一定努力,即可添加对其他供应商的支持(尽管此时需要将插件重命名为一个不那么像“Zoom”的名称)。

8 个赞

是否有可能为这个插件添加无需注册即可加入会议的功能,就像网络研讨会一样?做得太棒了!

7 个赞

既然 Zoom 要求所有会议/网络研讨会设置密码,我认为该插件已失效。我尝试创建了一个网络研讨会,但在加入时出现以下错误:‘您的连接已超时,无法加入会议。请检查网络连接并重试。’

3 个赞

我今天会调查一下。这可能是临时问题,Zoom 的网页客户端在其状态页面 status.zoom.us 上标记为“维护中”。

5 个赞

我想提一下,启用网络研讨会功能每月最低费用为 40.00 美元,外加每月 14.99 美元的专业版计划。祝好。

2 个赞

是的,很遗憾,Zoom 的 Web SDK 目前似乎处于离线状态。他们表示正在努力使其恢复在线(具体含义尚不明确)。

因此,目前我已在插件中添加了变通方案:当通过 SDK 加入网络研讨会失败时,现在将显示此屏幕:

8 个赞

供参考,我共同创立的一家合作社选择了 https://bigbluebutton.org/。自行托管的成本远低于 Zoom 网络研讨会账户。

11 个赞

你好,Penar,我刚刚注意到用户个人资料中有一个“网络研讨会”选项卡。作为管理员,我可以正常查看,但作为普通用户,我遇到了以下错误:

访问被拒绝

在尝试加载 [/topics/webinar-registrations/chris_murray.json](https://community.naturephotographers.network/topics/webinar-registrations/chris_murray.json) 时发生错误

日志显示:

错误:禁止访问
URL: https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js
行号:1
列号:267206
窗口位置:https://community.naturephotographers.network/u/chris_murray/activity


o/t</<@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:267206
o/t<@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:267309
o@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:267390
trigger@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:545370
A</e._onError/<@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:550247
f</t.invoke@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:490055
f</t.flush@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:489055
p</t.flush@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:491070
t</t._end@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:496499
t</t.end@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:493035
t</t._run@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:497037
t</t.run@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:493643
c@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:359842
i/r.error@https://community.naturephotographers.network/assets/application-54c82e8fd96fa4eb82fa7465a602da175078108feb909cfeec95f696f02b5854.js:1:203298
i@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:27754
fireWith@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:28522
l@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:78753
o/<@https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js:1:81055

1 个赞

我无法复现此问题。我在多个站点上进行了测试,使用了不同的用户名,包括在本地使用包含下划线的用户名进行测试。

是的,该插件使用的是 Zoom 的 WebSDK,它在某些浏览器中确实存在一些问题。

1 个赞

供参考,我刚才用这个功能做了一次网络研讨会,但“加入”按钮完全无法使用,所有参会者都收到了 Zoom 的超时错误。不过,我引导大家使用了常规的 Zoom 链接,一切正常。看来 WebSDK 存在不少问题。我们是否可以添加一个选项,允许用户手动输入“加入”按钮的链接,而不是依赖 WebSDK,毕竟它经常失败?

1 个赞

如果您已部署,Zoom SDK 应该可以正常工作,我上周已更新了该插件。不过,Zoom 已屏蔽所有旧版本,因此如果您近期未进行部署,这可能是原因所在。另外,将 Zoom 链接作为选项添加是合理的。

2 个赞

谢谢 Penar,我没想到还有更新,希望下次能解决这个问题。

想问个关于之后可以添加视频的问题:这是否仅适用于 Zoom 云端录制?如果我使用 Vimeo 或 YouTube,它会提示不支持该格式。只是好奇问问,问题不大,毕竟我可以直接把它包含在帖子中。

1 个赞

是的,该字段仅适用于直接视频文件的 URL。YouTube 或 Vimeo 的链接无法使用,但正如您所说,对于 YouTube/Vimeo 的链接,使用单框嵌入要方便得多。

3 个赞

参见:BigBlueButton video conference

1 个赞

使用了几次之后,想提供一些小小的反馈。

  1. “加入”按钮在 webinar 开始之前隐藏,用户体验不够友好。我在 webinar 开始前收到了多封邮件,询问加入链接在哪里,尽管我已在 webinar 描述和通知中明确说明:该按钮将在 webinar 开始时显示。但很多人并不仔细阅读。我个人更希望“加入”按钮始终可见;如果用户提前点击,系统只需提示 webinar 尚未开始,他们自然会回头查看实际开始时间。

  2. 是否可能支持预演环节?在 webinar 中,主持人和小嘉宾可以在正式面向参与者直播之前进行内部沟通。他们可以在此期间点击 Zoom 会议链接,系统会提示会议尚未开始,但他们会进入类似“等候室”的状态,并在我们正式开播时自动加入。这将大大减轻用户面临的问题。

3 个赞

抱歉让您久等了,David。

这里有一个设置可能可以帮到您:

如果您将其设置为 30,那么按钮将在 webinar 预定时间前 30 分钟显示。

您应该也可以使用上述设置来实现这一功能。据我上次检查,当演练环节转为正式活动时,Zoom 的 webhook 不会触发,这使得其他动态处理起来有些棘手。

3 个赞

谢谢 Penar,但这并不是真正的问题。

首先,我的“立即加入”按钮完全无法使用了:

以前它一直正常工作,但最近几周开始出现这种情况。我也没看到备用链接显示出来。

另外,还有一个之前提到过的独立问题,即练习模式的问题。当我遇到之前提到的问题时,情况是这样的:当我以练习模式启动网络研讨会时,无论将“在开始前 x 分钟加入 Zoom”设置为多少,加入按钮都不会出现,只有在真正开始直播时才会显示,而我通常希望在开始前 5 分钟才开始直播。理想情况下,加入按钮应该在设定的时间自动出现,这样参与者就会收到 Zoom 通知,提示网络研讨会尚未开始。

您能否提供一个选项,让注册按钮在设定时间直接切换为加入按钮,并直接指向 Zoom 链接?不需要备用链接,而是强制链接以完全绕过这个问题。再次感谢 Penar!