在 ejabberd 中读取和格式化消息节

Posted

技术标签:

【中文标题】在 ejabberd 中读取和格式化消息节【英文标题】:Read and format message stanza in ejabberd 【发布时间】:2020-03-24 19:05:44 【问题描述】:

我一直在 ejabberd 中开发一个自定义模块。我需要提取消息的正文内容并检查节是否有消息文本。这是我的代码sn-p

-module(mod_push_generate).

-behaviour(gen_mod).

-include("logger.hrl").
-include("ejabberd_sql_pt.hrl").
-include("ejabberd_http.hrl").
-include("xmpp.hrl").
%-include("jlib.hrl").

%% gen_mod API callbacks
-export([start/2, stop/1, depends/2, mod_options/1, fetch_token/2, on_user_send_packet/1]).

start(Host,_Opts) ->
  ?INFO_MSG("Mod PUSH GENARATOR has been started",[]),
  inets:start(),
  ejabberd_hooks:add(user_send_packet, Host, ?MODULE, on_user_send_packet, 50),
  ok.

stop(Host) ->
  ?INFO_MSG("Module has been stopped",[]),
  ejabberd_hooks:delete(user_send_packet, Host, ?MODULE, on_user_send_packet, 50),
  ok.

depends(_Host, _Opts) ->
  [].


mod_options(_Host) ->
  [].

%-spec on_user_send_packet(stanza(), ejabberd_c2s:state()) -> stanza(), ejabberd_c2s:state().

%on_user_send_packet(From, To, XML = Pkt) ->
on_user_send_packet(#messageto = Peer = Pkt, #jid := JID = C2SState) ->
  ?INFO_MSG("on user send packet called from  ",[Pkt]),
  Els = xmpp:get_els(Pkt),
  ?INFO_MSG("Body: ",[Els]),
  Pkt, C2SState;

on_user_send_packet(Acc) ->
    ?INFO_MSG("Inside nothing box.",[]),
    Acc.

Logging Pkt 给予

12:41:17.956 [info] FORMAT ERROR: "on user send packet called from  " [message,<<"2fe6c6a3-e89e-4f05-ac4d-b096b75f0f32">>,chat,<<"en">>,jid,<<"sagar">>,<<"192.168.4.69">>,<<"sagar.webApp">>,<<"sagar">>,<<"192.168.4.69">>,<<"sagar.webApp">>,jid,<<"tony">>,<<"192.168.4.69">>,<<>>,<<"tony">>,<<"192.168.4.69">>,<<>>,[],[text,<<>>,<<"xasXASXAS">>],undefined,[xmlel,<<"request">>,[<<"xmlns">>,<<"urn:xmpp:receipts">>],[]],#ip => 0,0,0,0,0,65535,49320,1093]

并且记录 Els 正在给予

14:04:25.906 [info] FORMAT ERROR: "Body: " [[xmlel,<<"request">>,[<<"xmlns">>,<<"urn:xmpp:receipts">>],[]]]

第二行显示我取出消息节的组件,唯一检测到的 xml 元素是“请求”元素。为什么消息节中没有“正文元素”。

还请告诉我如何取出(或检查是否存在)该节中的消息文本。

谢谢

【问题讨论】:

【参考方案1】:

为什么消息节中没有“正文元素”。

#message 结构将正文内容保存在 #message.body 中,而不是 #message.sub_els 中。请参阅https://docs.ejabberd.im/developer/guide/#xmpp-codec中的示例

我需要提取消息的正文内容

试试这条线:

  ?INFO_MSG("Body: ~p", [ xmpp:get_text(Pkt#message.body) ]),

它将记录如下内容:

17:08:12.897 [info] Body: <<"hey, are you there?">>
17:08:12.926 [info] Body: <<>>

并检查节是否有消息文本。

当Body为>时,表示它没有body。

【讨论】:

以上是关于在 ejabberd 中读取和格式化消息节的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ejabberd 中过滤消息

如何记录通过 ejabberd 的消息

从 ejabberd 检索聊天记录时如何识别已发送和未发送的消息?

Strophe & Ejabberd:发送消息后重新认证的问题

如何记录在 ejabberd 中收到的原始 xml 节?

是否有使用 webhooks 发送节的 ejabberd 模块?