在 muc room 中使用 Strophe 发送 XHTML 消息

Posted

技术标签:

【中文标题】在 muc room 中使用 Strophe 发送 XHTML 消息【英文标题】:Sending XHTML messages with Strophe in a muc room 【发布时间】:2012-04-25 18:29:18 【问题描述】:

我正在尝试使用 Strophe 将 html 消息发送到 muc 房间。我还尝试通过 Psi 中的 XML 控制台发送以下 xml,但它不起作用,只显示 Hello World。消息节有什么问题吗?

<message to="room@conference.server" type="groupchat"><body>Hello World </body><html xmlns="http://jabber.org/protocols/xhtml-im"><body xmlns="http://www.w3.org/1999/xhtml"><p style="color : red">Hello HTML World</p></body></html></message>

谢谢!

Edit1:disco#info 房间查询。我现在使用的是 Vacuum-IM 和 Psi 客户端,但 Psi 应该支持 xhtml-im (http://psi-im.org/wiki/Supported_Protocols)

<iq xmlns="jabber:client" from="room@conference.server" type="result" id="foo" to="admin@server/Vacuum-IM">
<query xmlns="http://jabber.org/protocol/disco#info">
  <identity xmlns="http://jabber.org/protocol/disco#info" category="conference" type="text" name="room"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="http://jabber.org/protocol/muc"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="muc_public"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="muc_open"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="muc_moderated"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="muc_semianonymous"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="muc_unsecured"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="muc_persistent"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="http://jabber.org/protocol/disco#info"/>
  <x xmlns="jabber:x:data" type="result">
    <field xmlns="jabber:x:data" type="hidden" var="FORM_TYPE">
      <value xmlns="jabber:x:data">http://jabber.org/protocol/muc#roominfo</value>
    </field>
    <field xmlns="jabber:x:data" label="Description" var="muc#roominfo_description">
      <value xmlns="jabber:x:data">asdf</value>
    </field>
    <field xmlns="jabber:x:data" label="Subject" var="muc#roominfo_subject">
      <value xmlns="jabber:x:data"/>
    </field>
    <field xmlns="jabber:x:data" label="Number of occupants" var="muc#roominfo_occupants">
      <value xmlns="jabber:x:data">1</value>
    </field>
    <field xmlns="jabber:x:data" label="Creation date" var="x-muc#roominfo_creationdate">
      <value xmlns="jabber:x:data">20120423T17:31:49</value>
    </field>
  </x>
</query>

Edit2:对消息节的响应

 <message xmlns="jabber:client" from="room@conference.server/ad" type="groupchat" to="admin@server/Vacuum-IM">
<body xmlns="jabber:client">Hello World </body>
<html xmlns="http://jabber.org/protocols/xhtml-im">
  <body xmlns="http://www.w3.org/1999/xhtml">
    <p xmlns="http://www.w3.org/1999/xhtml" style="color : red">Hello HTML World</p>
  </body>
</html>

Edit3:对 muc#traffic 查询的响应

<iq xmlns="jabber:client" from="room@conference.server" type="error" id="foo" to="admin@server/Vacuum-IM">
<query xmlns="http://jabber.org/protocol/disco#info" node="http://jabber.org/protocol/muc#traffic"/>
<error xmlns="jabber:client" type="cancel" code="404">
  <item-not-found xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
</error>

Edit4:Psi 对客户端的响应(功能)disco#info(xhtml-im 是最后一个)

 <iq xmlns="jabber:client" from="admin@kossy.local/Kostyas-MacBook-Pro" type="result" to="admin@kossy.local/Vacuum-IM" id="foo">
<query xmlns="http://jabber.org/protocol/disco#info">
  <identity xmlns="http://jabber.org/protocol/disco#info" category="client" type="pc" name="Psi"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="http://jabber.org/protocol/bytestreams"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="http://jabber.org/protocol/si"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="http://jabber.org/protocol/si/profile/file-transfer"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="http://jabber.org/protocol/disco#info"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="http://jabber.org/protocol/commands"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="http://jabber.org/protocol/rosterx"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="http://jabber.org/protocol/muc"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="jabber:x:data"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="urn:xmpp:jingle:1"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="urn:xmpp:jingle:transports:ice-udp:1"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="urn:xmpp:jingle:apps:rtp:1"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="urn:xmpp:jingle:apps:rtp:audio"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="http://jabber.org/protocol/chatstates"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="http://jabber.org/protocol/mood+notify"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="http://jabber.org/protocol/tune+notify"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="http://jabber.org/protocol/physloc+notify"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="http://jabber.org/protocol/geoloc+notify"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="http://www.xmpp.org/extensions/xep-0084.html#ns-metadata+notify"/>
  <feature xmlns="http://jabber.org/protocol/disco#info" var="http://jabber.org/protocol/xhtml-im"/>
</query>

Edit5:解决方案:获取 iChat 和 Adium :-) Adium 以不同的颜色和字体发送 xhtml 消息,但它不显示它自己所做的事情。只有 iChat 才能正确呈现 xhtml。所以组合有效。也不要使用 p 标签,颜色应该是十六进制形式。示例:

<message xmlns="jabber:client" type="groupchat" to="room@conference.server">
<body xmlns="jabber:client">Hello World</body>
<html xmlns="http://jabber.org/protocol/xhtml-im">
  <body xmlns="http://www.w3.org/1999/xhtml">
    <span xmlns="http://www.w3.org/1999/xhtml" style="font-family: Times New Roman; font-size: large; color: #FF0000;">Red text</span>
  </body>
</html>

【问题讨论】:

【参考方案1】:

据我所知,Psi 不支持 XHTML-IM。这样的客户端只会显示正常的&lt;body&gt; 内容。

您的示例节是正确的,所以它要么正如 ggozad 建议的那样,服务器将其删除(某些服务器可以配置为执行此操作),要么只是客户端不呈现它。

尝试在接收客户端的 XML 控制台中检查,以查看在 MUC 广播消息后 &lt;html&gt; 子元素是否仍然存在。

【讨论】:

其实 Psi 应该支持 xhtml-im (xep-0071) psi-im.org/wiki/Supported_Protocols。响应中有一个 html 正文。请参阅问题中的 Edit2。谢谢!【参考方案2】:

房间可能不允许xhtml-im。 您可以通过查询房间找到:

<iq to='room@conference.server'
    id='foo'
    type='get'>
  <query xmlns='http://jabber.org/protocol/disco#info'
         node='http://jabber.org/protocol/muc#traffic'/>
</iq>

并检查http://jabber.org/protocol/xhtml-im 是否属于受支持的功能。

【讨论】:

房间永远不需要支持该功能 - 它只是转发它收到的内容。它也不必宣传它剥离 XHTML-IM 的事实。 请记住,有很多服务器尚未实现该特定功能,包括一些阻止 XHTML 的服务器。如果您的建议不起作用,我们需要知道 @user1054134 正在使用哪个服务器。 我使用 openfire 服务器。结果集中没有 muc#traffic 节点。是mc#roominfo吗?在 openfire 配置中,如何启用房间的 xhtml 支持?这是对 disco#info 的响应,因为 muc#traffic 给出了错误。请参阅上述问题中的编辑。 @Joe Hildebrand。实际上openfire服务器(Edit2)的响应中有xhtml正文,并且支持xep-0071(igniterealtime.org/builds/openfire/docs/latest/documentation/…)。

以上是关于在 muc room 中使用 Strophe 发送 XHTML 消息的主要内容,如果未能解决你的问题,请参考以下文章

使用 Xmpp、strophe.js 进行聊天应用

strophe js MUC房间

Backbone 和 Strophe muc 插件:处理传入事件

如何获取 StateData 并在 mod_muc_room 中替换此值

Strophe MUC 邀请拒绝处理程序未触发

Ejabberd muc_rooms 和 muc_registered 表为空