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 key를 zoom sdk key 필드에, Client Secret/SDK secret를 zoom sdk secret 필드에 복사하여 붙여넣습니다.

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

8단계: 앱 사용 지정

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

제한 사항

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

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

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

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

63개의 좋아요

이 기능을 구현해 주셔서 정말 감사합니다. 멋진 기능입니다!

플러그인을 설치하고 Zoom에서 JWT 앱을 생성한 후, 설명대로 Discourse를 설정했습니다.
하지만 작성기에서 Zoom 웨비나 버튼을 사용하여 예약된 미팅을 게시물에 연결할 때 문제가 발생합니다.

“웨비나 추가” 아래 텍스트 입력란에 정확히 무엇을 입력해야 하는지에 대한 설명을 추가해 주시면 좋겠습니다. 저에게는 미팅 ID도 전체 URL도 작동하지 않는 것 같습니다.

또 다른 사소한 문제도 발견했습니다: 관리자 대시보드의 “플러그인” 페이지에 링크된 저장소 URL이 https://github.com/discourse-org/discourse-zoom으로 되어 있는데, https://github.com/discourse/discourse-zoom으로 링크되어야 합니다.

2개의 좋아요

흥미로운 개념이고, 커뮤니티 구성원들에게 멋진 경험이 될 것 같습니다!

이 플러그인을 통해 더 범용적인(벤더 비종속적인) 워크플로를 허용하는 방안이 고려되고 있는지 궁금합니다. 기본적으로 특정 날짜와 시간까지의 카운트다운 타이머를 임베드하는 동일한 기능을 제공하되, 호스트 및/또는 패널리스트 지정, 웨비나 URL 링크, 이후 녹화본 링크 등을 지정할 수 있도록 하는 것입니다.

제가 떠올린 예시는 Jiti(오픈 소스)이지만, 이 분야에서 선택지는 당연히 여러 가지가 있습니다.

2개의 좋아요

웹inar ID를 입력해야 합니다. 모달 창에서 이벤트를 추가하지 못하는 경우, /logs 디렉토리의 사이트 로그에서 더 자세한 내용을 확인할 수 있습니다. 또한 언급하신 URL 문제도 수정했습니다. 보고해 주셔서 감사합니다.

아쉽게도 현재 벤더 비종속적인 워크플로는 제공하지 않습니다. 다만 Zoom API 호출은 추상화되어 있어, 약간의 노력으로 다른 벤더에 대한 지원을 추가하는 것은 가능합니다(다만, 플러그인 이름은 ‘Zoom’ 느낌이 덜한 것으로 변경해야 할 것입니다).

8개의 좋아요

이 플러그인에도 웹 세미나와 마찬가지로 가입 없이 회의 지원을 추가할 가능성이 있을까요? 훌륭한 작업입니다!

7개의 좋아요

Zoom이 이제 모든 회의/웹inar에 비밀번호를 요구하기 때문에 플러그인이 고장 난 것 같습니다. 웹inar를 생성해 보고 참여하려고 했더니 Your connection has timed out and you cannot join the meeting. Verify your network connectivity and try again.라는 오류가 발생했습니다.

3개의 좋아요

오늘 이 문제를 확인해 보겠습니다. 일시적인 문제일 수 있으며, Zoom의 웹 클라이언트는 status.zoom.us의 상태 페이지에서 "유지보수 중"으로 표시되어 있습니다.

5개의 좋아요

웹inar 사용은 월 최소 $40.00이며, Pro 플랜은 월 $14.99에 추가됩니다. 감사합니다.

2개의 좋아요

네, 불행히도 현재 Zoom Web SDK가 오프라인 상태인 것 같습니다. 그들은 서비스를 다시 복구하고 있다고 하는데(정확히 어떤 의미인지 확실하지는 않습니다).

따라서 당분간 플러그인에 임시 해결책을 추가했습니다. 이제 웹inars에 참가할 때 SDK를 통한 접속이 실패하면 다음과 같은 화면이 표시됩니다:

8개의 좋아요

참고로, 제가 공동 설립한 협동조합은 https://bigbluebutton.org/을 선택했습니다. 자체 호스팅 비용이 줌 웨비나 계정보다 훨씬 저렴했습니다.

11개의 좋아요

Penar님, 안녕하세요. 사용자 프로필에 Webinar 탭이 있다는 것을 방금 확인했습니다. 관리자로 로그인하면 정상적으로 이 탭을 볼 수 있지만, 일반 사용자 계정으로 접속하면 다음과 같은 오류가 발생합니다.

Access Denied

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

로그에서 확인한 내용:

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개의 좋아요

저는 이 문제를 재현할 수 없었습니다. 밑줄이 포함된 사용자 이름을 포함한 여러 사이트와 로컬 환경에서 테스트해 보았지만 문제가 발생하지 않았습니다.

네, 해당 플러그인은 Zoom WebSDK를 사용하며 일부 브라우저에서 문제가 발생하는 것으로 확인되었습니다.

1개의 좋아요

참고로 방금 이 기능을 사용해 웹 세미나를 진행했는데, 참가 버튼이 전혀 작동하지 않았습니다. 모든 참가자가 Zoom에서 타임아웃 오류를 받았지만, 저는 모두에게 일반적인 Zoom 링크로 접속하도록 안내했고, 해당 링크는 정상적으로 작동했습니다. 따라서 WebSDK에 여러 문제가 있는 것으로 보입니다. WebSDK가 실패하고 있으므로, WebSDK에 의존하지 않고 참가 버튼에 URL을 직접 입력할 수 있는 옵션을 제공하면 어떨까요?

1개의 좋아요

배포를 하면 Zoom SDK가 작동할 거예요. 지난주에 플러그인을 업데이트했거든요. 다만 이전 버전은 모두 차단되어 있어서, 최근에 배포를 하지 않았다면 그 이유가 될 수 있습니다. 그리고 Zoom 링크를 옵션으로 추가하는 것도 좋은 방법이에요.

2개의 좋아요

Penar님, 감사합니다. 업데이트가 있다는 걸 몰랐네요. 다음에 문제가 해결되길 바랍니다.

나중에 추가할 수 있는 영상에 대해 질문이 있는데요, 이건 Zoom 클라우드 녹화만 지원하나요? Vimeo나 YouTube를 사용하면 지원되지 않는 형식이라고 표시됩니다. 그냥 궁금해서 여쭤본 건데, 게시글에 포함시킬 수 있으니까 큰 문제는 아닙니다.

1개의 좋아요

네, 해당 필드는 직접적인 비디오 파일 URL에서만 작동합니다. YouTube나 Vimeo는 지원되지 않지만, 말씀하신 대로 YouTube/Vimeo URL의 경우 원박싱(oneboxing)을 사용하는 것이 훨씬 쉽습니다.

3개의 좋아요

참고: BigBlueButton video conference

1개의 좋아요

몇 번 사용해 본 후 조금 피드백을 남깁니다.

  1. 웹iná리 시작 전까지 참가 버튼이 숨겨져 있는 것은 사용자 친화적이지 않습니다. 웹iná리 시작 전에 링크가 어디 있는지 묻는 이메일을 여러 통 받는데, 웹iná리 설명에 시작 시점에 버튼이 나타날 것이라고 명확히 적어두었음에도 불구하고 사람들은 그저 읽지 않는 것 같습니다. 개인적으로는 참가 버튼을 항상 표시해 두는 것이 낫다고 생각합니다. 미리 클릭하면 아직 웹iná리가 시작되지 않았다는 안내가 뜨고, 그때 실제 시작 시간을 다시 확인하게 될 것입니다.

  2. 연습 세션을 지원할 수 있을까요? 웹iná리에서는 호스트와 패널이 참가자들에게 실시간으로 노출되지 않은 상태에서 사전에 서로 대화할 수 있는 옵션이 있습니다. 이 시간 동안 참가자들은 줌 회의 링크를 클릭하면 아직 회의가 시작되지 않았다는 안내와 함께 일종의 대기실에 들어가고, 우리가 실시간으로 전환하는 순간 자동으로 참가하게 됩니다. 이렇게 하면 사용자들의 많은 문제를 해결할 수 있을 것입니다.

3개의 좋아요

지연된 답변에 대해 사과드립니다, David.

여기서 도움이 될 수 있는 설정이 있습니다:

이 값을 30으로 설정하면, 웹inar 예정 시간 30분 전에 버튼이 표시됩니다.

위 설정과 함께 이 기능을 사용할 수 있어야 합니다. 마지막으로 확인했을 때, 연습 세션이 전체 이벤트로 전환되는 시점에 Zoom 웹훅이 발화되지 않아서 다른 동적 처리가 다소 까다로웠습니다.

3개의 좋아요

Penar님, 감사합니다. 하지만 문제가 정확히 그 부분은 아닙니다.

먼저, 제 ‘지금 참가’ 버튼이 아예 작동하지 않습니다:

과거에는 작동했는데, 지난 몇 주 동안부터 이런 현상이 발생하기 시작했습니다. 또한 대체 링크(fallback link)도 표시되지 않습니다.

그리고 제가 이전에 설명했던 별개의 문제는 연습 모드(practice mode) 문제입니다. 위에서 언급한 문제가 있을 때, 작동 방식은 다음과 같았습니다. 연습 모드로 웹inars를 시작하면 zoom join x mins before start 설정값이 어떻게 되어 있든 참가 버튼이 나타나지 않았습니다. 버튼은 실제로 방송을 시작할 때만 표시되었는데, 저는 보통 시작 5분 전에만 방송을 시작합니다. 이상적으로는 설정된 시간이 되면 참가 버튼이 나타나고, 그때 참가자들에게 아직 웹inars가 시작되지 않았다는 zoom 알림이 전송되면 좋겠습니다.

설정된 시간이 되면 등록 버튼을 참가 버튼으로 전환하고, 단순히 zoom 링크만 제공하도록 하는 옵션을 추가할 수 있을까요? 대체 링크가 아니라, 이 문제를 완전히 우회하기 위한 강제 링크입니다. 다시 한번 감사합니다, Penar님!