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

Ejabbered 17.09离线消息触发API调用模块编译问题求助

解决Ejabberd 17.09编译mod_offline_post时的"undefined parse transform"错误

我之前帮同行解决过类似的Ejabberd模块编译问题,你遇到的这个错误本质是Erlang编译环境找不到代码里依赖的parse_transform工具——这类工具通常是处理JSON序列化、宏展开或者Ejabberd内部编译规则时用到的。针对Ejabberd 17.09这个特定版本,我给你一套可行的解决流程:

1. 先定位依赖缺失点

首先打开你用的mod_offline_post.erl代码,搜索有没有类似这样的声明:

-compile({parse_transform, jiffy_pt}).

如果有,说明这个模块依赖了jiffy(一款Erlang JSON处理库),但你的环境里没安装这个库,这就是编译报错的根源。

2. 安装对应版本的依赖

Ejabberd 17.09基于Erlang/OTP 19.x,所以要装兼容这个版本的依赖:

  • 如果模块用到了jiffy,请安装0.14.10版本的jiffy(这个版本完美适配OTP 19.x),可以通过Erlang包管理工具或者源码编译的方式安装,确保编译后的ebin目录能被Erlang环境识别。
  • 如果你是在非Ejabberd源码环境编译模块,还要确保把Ejabberd的include目录加入编译路径,因为模块会用到Ejabberd的内部头文件。

3. 用正确的命令编译模块

别再用Erlang shell里简单的c(mod_offline_post).命令了,要把依赖的路径都加上,比如:

erlc -I /path/to/ejabberd/include -pa /path/to/ejabberd/ebin -pa /path/to/jiffy/ebin mod_offline_post.erl

把上面的路径替换成你实际的Ejabberd安装目录和jiffy的编译输出目录。

4. 更稳妥的替代方案:自定义轻量模块

如果折腾第三方模块还是有问题,不如直接用Ejabberd 17.09自带的hook机制写个极简模块,完全不用依赖第三方库:

  • 新建mod_offline_webhook.erl,核心代码如下:
-module(mod_offline_webhook).
-behaviour(gen_mod).

-export([start/2, stop/1, send_notification/3]).

-include("ejabberd.hrl").
-include("jlib.hrl").

start(Host, _Opts) ->
    ejabberd_hooks:add(offline_message_hook, Host, ?MODULE, send_notification, 50),
    ok.

stop(Host) ->
    ejabberd_hooks:delete(offline_message_hook, Host, ?MODULE, send_notification, 50),
    ok.

send_notification(From, To, Packet) ->
    % 提取离线消息的内容
    Body = xml:get_tag_cdata(xml:get_subtag(Packet, <<"body">>)),
    % 构造要发送给API的JSON数据(用Ejabberd自带的jsx库)
    RequestBody = jsx:encode(#{
        from => jlib:jid_to_binary(From),
        to => jlib:jid_to_binary(To),
        message => Body
    }),
    % 调用你的目标API
    httpc:request(post,
        {"https://your-target-api.com/webhook", [], "application/json", RequestBody},
        [], []),
    ok.
  • 编译这个模块只需要指定Ejabberd的include路径:
    erlc -I /path/to/ejabberd/include -pa /path/to/ejabberd/ebin mod_offline_webhook.erl
    
  • 最后在ejabberd.yml里启用这个模块:
    modules:
      mod_offline_webhook: {}
    

5. 验证效果

把编译好的.beam文件放到Ejabberd的ebin目录,重启Ejabberd服务,发送一条离线消息,检查你的API是否收到了请求就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:23:07