JitsiMeet 使用 Docker 私有化部署获取事件回调

私有化部署 jitsi-meet 后,可以通过 prosody 服务的 event_sync_component 插件来向指定服务器回调事件。

该插件支持的事件有:

  • 房间创建
  • 房间释放
  • 用户加入
  • 用户退出

简介

当事件被触发后,该组件将会向指定的外部 API 发送 Post 请示,请求体为 Json 格式。

如果使用 JWT token 认证的话,同时还会发送 token 中 context 中的 name,email 和 id。

安装

本文通过 docker 的方式安装的 jitsi-meet,这种安装方式不支持通过 Component 的方式手动注册插件,也无法添加额外的配置变量。

因此需要改动插件的源代码,使其符合自己的使用需求

下载插件

1
2
3
4
5
6
7
8
9
# 打开 powershell
# 查找 prosody 容器的 id
docker ps -f name=prosody
# 假设 id 为:f04634fde422
docker exec -it f04634fde422 /bin/bash
# 进入 prosody-plugins-custom 目录
cd prosody-plugins-custom/
# 下载 event_sync_component 插件到该目录
wget -O mod_event_sync_component.lua https://raw.githubusercontent.com/jitsi-contrib/prosody-plugins/main/event_sync/mod_event_sync_component.lua

修改插件

可以使用 vscode 远程服务器后,安装 Docker 插件对容器进行对文件进行修改

  1. 修改变量

    由于prosody镜像的原因,导致无法直接配置 prosody 变量,因此为了能够可以使用插件,打开插件源代码,对里面的部分定义进行修改,内容如下:

    1
    2
    3
    4
    -- 为 prosody 虚拟机环境的地址,一般都为 muc.meet.jitsi
    local main_muc_component_host = "muc.meet.jitsi";
    -- 将其修改成回调服务器地址即可
    local api_prefix = "http://192.168.3.240:7001/api/v1/callbacks";
  2. 返回 display_name

    原插件没有返回用户的 display_name,当用户通过网址进入时,无法确定用户的身份,因此需要返回用户自己设置的 display_name 供回调服务器处理。

    修改 occupant_joined:

    1
    2
    3
    4
    5
    -- 找到 occupant_joined 函数
    -- 将
    local occupant_data = room_data:on_occupant_joined(occupant_jid, event.origin);
    -- 修改为
    local occupant_data = room_data:on_occupant_joined(occupant_jid, event);

    修改 EventData:on_occupant_joined:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    -- 找到 EventData:on_occupant_joined 函数,修改为如下代码:

    function EventData:on_occupant_joined(occupant_jid, event)
    local event_origin = event.origin
    local user_context = event_origin.jitsi_meet_context_user or {};

    -- get displayName
    local display_name = event.occupant:get_presence():get_child_text('nick', 'http://jabber.org/protocol/nick');

    -- N.B. we only store user details on join and assume they don't change throughout the duration of the meeting
    local occupant_data = {
    occupant_jid = occupant_jid,
    name = user_context.name,
    id = user_context.id,
    email = user_context.email,
    joined_at = now(),
    left_at = nil,
    display_name = display_name
    };

    self.occupants[occupant_jid] = occupant_data;
    self.active[occupant_jid] = true;

    return occupant_data;
    end

加载插件

.env 文件中的 XMPP_MUC_MODULES 添加 event_sync_component,使该组件生效:

1
XMPP_MUC_MODULES=muc_census,muc_size,event_sync_component

重新创建容器

1
docker-compose up -d

至此,事件回调插件加载成功。

参考

Get callbacks on my custom server - Developers - Jitsi Community Forum - developers & users

prosody-plugins/event_sync/README.md at main · jitsi-contrib/prosody-plugins · GitHub