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

Converse.js自动发送消息实现求助:sendMessage触发器及$msg调用失败问题

在Converse.js中实现自动发送消息的正确方法

我来帮你搞定Converse.js自动发消息的问题,你的两次尝试都有一些细节没处理对,咱们来逐一修正:

先说说你之前代码的问题

第一种方法(sendMessage触发器)的问题

你用_converse.api.trigger('sendMessage', ...)的思路不对,sendMessage是Converse内部用来通知消息已发送的事件,不是用来主动调用发送消息的API。而且chatbox参数需要传入实际的聊天框实例,而不是类型_converse.ChatBox | _converse.ChatRoom。另外,initialize方法执行时Converse可能还没完全初始化完成,直接调用会找不到对应的聊天资源。

第二种方法($msg报错)的问题

报错Cannot read properties of undefined (reading '$msg')是因为在initialize阶段,_converse.env还没被正确初始化挂载。而且_converse.send也不是发送消息的正确方式,Converse要求通过对应的聊天框实例来发送消息,直接调用全局send方法是无效的。

正确的实现代码

下面是可以正常工作的示例,核心是等待Converse初始化完成,获取到实际的聊天框实例后再发送消息:

export const msgUser = (viewerChannelCredentials: any) => {
  const { username, channel } = viewerChannelCredentials;
  window.converse.plugins.add('msg-user', {
    dependencies: [],
    initialize: function () {
      const _converse = this._converse;

      // 等待Converse完全初始化并完成登录
      _converse.api.listen.on('login', async () => {
        let chatbox;
        try {
          // 判断是私聊还是群组聊天,获取对应的聊天框
          if (channel?.includes('@conference.')) {
            // 群组聊天:先获取或创建聊天室实例
            chatbox = await _converse.api.chatrooms.get(channel);
            // 如果还没加入群组,先加入
            if (!chatbox.get('joined')) {
              await chatbox.join();
            }
          } else {
            // 私聊:获取或创建私聊聊天框
            chatbox = await _converse.api.chatboxes.get(username);
          }

          if (chatbox) {
            // 发送消息
            await chatbox.sendMessage('abc');
            console.log('消息发送成功');
          } else {
            console.error('无法找到对应的聊天框,请检查用户名/频道是否正确');
          }
        } catch (error) {
          console.error('发送消息失败:', error);
        }
      });
    },
  });
};

关键注意点

  • 等待初始化/登录完成:一定要在Converse完成初始化和登录后再执行发送逻辑,这里用login事件确保用户已经登录,避免因未登录导致发送失败。
  • 正确获取聊天框实例:私聊用_converse.api.chatboxes.get(),群组用_converse.api.chatrooms.get(),如果聊天框不存在,Converse会自动创建。
  • 群组需先加入:如果是发送到群组,要确保已经加入该群组,否则消息无法发送成功,代码里加了chatbox.join()的逻辑。
  • 使用实例的sendMessage方法:发送消息必须通过聊天框实例的sendMessage方法,这是Converse官方推荐的方式。

内容的提问来源于stack exchange,提问作者Anik Ahmed fathe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:34:06