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일에 제거 예정)에서 서버 간(Server-to-Server) OAuth로 변경되었습니다. 플러그인의 기존 사용자는 설정을 업데이트해야 합니다.

기능

  • Zoom 웹세미나가 시작되면 “등록” 버튼이 자동으로 "참가"로 전환되며, 클릭하면 Discourse 커뮤니티 내 전용 엔드포인트에서 Zoom SDK를 사용하여 웹세미나가 실행됩니다.
  • 이벤트 시작 N분 전에 웹세미나 등록자에게 자동으로 알림을 보냅니다 (N은 플러그인 설정에서 구성할 수 있으며, 기본적으로 알림은 꺼져 있습니다).
  • 관리자는 Discourse에서 웹세미나에 패널리스트(panelist)를 추가할 수 있습니다.
  • 관리자는 Discourse에서 웹세미나의 녹화 영상 링크를 추가할 수 있으며, 이는 이벤트 종료 후 사용자에게 표시됩니다.
  • Zoom 이벤트 호스트와 패널리스트는 Discourse 사용자 계정과 연결됩니다.

사용 방법

Discourse Zoom 플러그인을 사용하려면 먼저 Discourse 인스턴스에 플러그인을 설치하고 Zoom 서버 간 OAuth 앱 자격 증명으로 구성해야 합니다. 플러그인 설정이 완료되면 새 주제를 생성하고 웹세미나와 연결하여 새 Zoom 웹세미나를 만들 수 있습니다. 사용자는 주제에서 직접 웹세미나에 등록할 수 있습니다.

설치

1단계: Discourse 인스턴스에 플러그인 설치

여기의 지침을 따라 Discourse 인스턴스에 플러그인을 설치할 수 있습니다.

2단계: Zoom 마켓플레이스에서 서버 간 OAuth 앱 생성


시작하려면 Zoom 마켓플레이스에서 서버 간 OAuth 앱을 생성해야 합니다. 이 앱은 Zoom API에 요청을 보내고 Webhooks를 통해 이벤트 알림을 수신하는 데 필요합니다.


3단계: 플러그인 구성

플러그인 설치 후 Discourse 사이트 설정으로 이동하여 zoom enabled 체크박스를 확인하고 저장하세요.

Zoom 마켓플레이스에서 App Credentials(앱 자격 증명) 탭으로 이동합니다:

그런 다음 값을 복사하여 Discourse 인스턴스의 해당 사이트 설정에 붙여넣습니다:

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

4단계: 웹훅 시크릿 토큰 설정

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 버튼을 찾습니다:

모든 것이 정상 작동했다면 A checkmark icon with "Validated" in green 이 표시되어야 합니다.

마지막으로 페이지 하단의 Save 버튼을 선택합니다.

6단계: 스코프(Scopes)

이벤트 구독을 설정한 후 Scopes 탭으로 이동하고 Add Scopes 버튼을 클릭합니다. 여기에서 테이블에 제공된 값으로 검색하거나, 부분 값을 사용하여 수동으로 다음 스코프를 선택합니다. 예를 들어 webinar:read:list_panelists:admin 대신 webinar:read:으로 검색하면 표시되는 요소가 줄어 필요 항목을 찾기 쉬워집니다.

서버 간 OAuth 앱의 스코프 탭에서 Add Scopes 버튼을 클릭하면 창이 나타납니다:

검색 상자에서 전체 이름 또는 부분 이름으로 검색합니다. 이를 쉽게 하려면 각 스코프를 아래 테이블에 복사하여 붙여넣거나 해당 탭에서 검색할 수 있습니다:

Users(사용자)

scope desc
user:read:user:admin 사용자 보기
user:read:email:admin 사용자 이메일 확인
user:read:list_users:admin 사용자 목록 보기

Webinar(웹세미나)

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 웹세미나에 등록자 추가

Webinar(웹세미나)

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단계: 미팅 SDK 앱 생성

:warning: Zoom 측에서 변경 사항이 있어 가이드 업데이트를 진행 중입니다.


SDK 미팅 앱은 사용자가 웹세미나 미팅에 참여할 수 있도록 사용자를 인증합니다.


General App(일반 앱)을 생성하여 시작하고, Select how the app is managed(앱 관리 방식 선택)에서 User-managed(사용자 관리)를 선택합니다.

일반 앱의 Basic Information(기본 정보) 탭에서 Client ID/ SDK keyzoom sdk key 필드에, Client Secret/SDK secretzoom sdk secret 필드에 복사하여 붙여넣습니다.

아래로 스크롤하면 OAuth Information 섹션을 찾을 수 있으며, OAuth Redirect URL에 사이트의 URL을 입력합니다. 예를 들어, https://YOURSITE.com.

8단계: 앱 사용 지정

Features 탭에서 Embed 하위 탭을 선택하고 Meeting SDK를 활성화합니다.

제한 사항

이 플러그인은 Zoom에서 등록이 필요하지 않은 웹세미나에서만 작동합니다.

파괴적 변경 사항에 대한 공지

Zoom API의 비활성화로 인해 플러그인의 이전 인스턴스는 이 게시물에 언급된 단계를 따라 구성해야 합니다.

:discourse2: 우리가 호스팅하고 있나요? 이 플러그인은 Enterprise 플랜에서 사용할 수 있습니다.

63개의 좋아요

Thanks so much for working on this, great feature!

I was able to install the plugin, create the JWT app in Zoom, and configure my discourse as described.
However, I am running into problems when using the Zoom Webinar button in the composer to associate a scheduled meeting with the post.

It would be great if you could please add an explanation what exactly one has to enter in the text input under “Add Webinar” . Neither the meeting ID or full URL seem to work for me.

Another minor issue I noticed: The repository URL linked to in the “Plugins” page of the admin dashboard points to https://github.com/discourse-org/discourse-zoom, whereas it should be linking to GitHub - discourse/discourse-zoom: Integrate Zoom events in Discourse. · GitHub

2개의 좋아요

Interesting concept, and looks like a nice experience for community members!

I’m curious if there’s been any thought yet to allowing a more generic (vendor-agnostic) workflow with this plugin; basically to offer the same embedding of a countdown timer to a specific time and date, specifying a host and/or panelist, link to the webinar URL, later links to recordings, etc.

Jiti (open source) would be the example that I had in mind but there are obviously several options in this space.

2개의 좋아요

You need to enter the webinar ID. In your site’s logs in /logs, you should be able to see more details if it still can’t add the event in the modal window. I also fixed the URL issue you mentioned, thanks for reporting that.

Unfortunately, no, this currently does not provide a vendor-agnostic workflow. The Zoom API calls are abstracted though, so it’s possible to add support for another vendor with a bit of effort (although, the plugin would need to be renamed to something less zoom-y).

8개의 좋아요

Is there any possibility of adding meeting support w/out registration to this plugin as well as webinars? Great work!

7개의 좋아요

Now that Zoom requires a password for all meetings/webinars I think the plugin is broken. I tried creating a webinar and when I join it gives this error Your connection has timed out and you cannot join the meeting. Verify your network connectivity and try again.

3개의 좋아요

I will look into this today. It’s possible this is a temporary issue, the web client for Zoom is marked as “under maintenance” on their Status page at status.zoom.us.

5개의 좋아요

I just want to mention that use of webinars is $40.00 a month minimum to enable + $14.99 a month Pro plan. Cheers.

2개의 좋아요

Yes, unfortunately it looks like Zoom’s Web SDK is offline for now. They say they are working on bringing it back online (not quite sure what that means).

For the moment, then, I have added a workaround to the plugin, when joining a webinar, it will now show this screen when joining via SDK fails:

8개의 좋아요

FYI, a cooperative I co-founded went for https://bigbluebutton.org/. Self-hosting cost us a lot less than a Zoom webinar account.

11개의 좋아요

Hi Penar, I just noticed there is a Webinar tab in the users profile, as an admin I can view this as expected, but as a regular user I get this error

Access Denied

while trying to load [/topics/webinar-registrations/chris_murray.json](https://community.naturephotographers.network/topics/webinar-registrations/chris_murray.json)

From the logs:

Error: Forbidden
Url: https://community.naturephotographers.network/assets/ember_jquery-57d09ec67e9e407d9b0d42aa1fefd1a470c45310d953b07793a3ca8adc6ec599.js
Line: 1
Column: 267206
Window Location: 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개의 좋아요

I can’t reproduce this, tested on multiple sites with different usernames, including locally with a username containing an underscore.

Yes, the plugin uses Zoom’s WebSDK, and it has issues in some browsers.

1개의 좋아요

FYI I just did a webinar using this and the Join button didn’t work at all, everyone got a timeout from Zoom, but I directed everyone to the regular zoom link which worked fine. So it seems the WebSDK is having lots of problems. Maybe we could have an option to put in the url for the join button rather than relying on the websdk since it is failing?

1개의 좋아요

The Zoom SDK should work if you deploy, I updated the plugin last week. They did block all previous versions though so if you haven’t deployed recently that could explain it. And adding the zoom link as an option makes sense.

2개의 좋아요

Thanks Penar, I didn’t realize there was an update, hopefully that will fix it for next time.

Question about the video you can add afterwards; does this only work for Zoom cloud recordings? If I use Vimeo or Youtube it says it’s not a supported format. Just curious, not a big deal since I can just include it in the post.

1개의 좋아요

Oh yes, that fields only works with a URL to a direct video file. Youtube or Vimeo won’t work, but as you say, it’s much easier to use oneboxing for Youtube/Vimeo URLs.

3개의 좋아요

See: BigBlueButton video conference

1개의 좋아요

Just a little feedback after using this a few times now.

  1. The join button being hidden until the webinar starts is not user friendly, I get several emails before the webinar starts asking where the link to join is even though I’ve spelled it out in the webinar description and the notification that it will appear when the webinar starts, people just don’t read. Personally I would prefer to have the join button always visible, if they click on it early it will just tell them the webinar hasn’t started yet and they will look back to see what time it really starts.

  2. Would it be possible to support practice sessions? With a webinar you have the option for this where the host and panelists can talk to each other beforehand without being live for the participants. They can click the link for the zoom meeting during this time and they will get a notice telling them that the meeting has not started yet but they’re in sort of a waiting room, and it automatically joins as soon as we go live. This would alleviate a lot of problems for users.

3개의 좋아요

Apologies for the delay, David.

There is a setting that can probably help you here:

If you set this to 30, then the button will show up 30 minutes before the scheduled time of the webinar.

You should be able to use this with the setting above too. Last I checked, the Zoom webhooks don’t fire when the practice session turns into a full event, so that makes the other dynamic a little tricky.

3개의 좋아요

Thanks Penar, but that’s not quite the issue.

First off, my Join now button is no longer working at all:

In the past it was working, but this started in the past couple weeks. I also don’t see the fallback link showing up either.

Then, a separate problem which I was describing before was the practice mode issue. When I did have the previously mentioned issue, it worked like this: when I start the webinar in practice mode the join button does not come on, no matter what zoom join x mins before start is set to, it would only show up when I actually start broadcasting, which I like to do only 5 mins prior to the start. Ideally the Join button would come on whenever the setting is set to, then they would get the zoom notification that the webinar hasn’t started yet.

Do you think you could give an option to just switch the register button to join at the set time and it would just be the zoom link? Not a fallback, but a forced link to bypass this altogether. Thanks again Penar!