【问题标题】:Adding 'typing_on' sender action bubble before each response from Wit.ai chatbot在来自 Wit.ai 聊天机器人的每个响应之前添加“typing_on”发件人操作气泡
【发布时间】:2026-02-09 18:30:01
【问题描述】:

我使用 FB messenger、Wit.ai 和 node.js 构建了一个基于流的聊天机器人。它运行良好,但为了使交互看起来更自然,我希望我的机器人暂停片刻,并且似乎正在输入它的每个响应。

我希望在我的机器人发送每个响应之前短暂显示“打字”气泡,理想情况下能够定义在发送响应之前气泡可见的时间。目前,在我的对话中,机器人会发送连续的消息,而且一次发送的速度太快了。

FB Messenger Send API 显示either the 'message' or 'sender_action' property must be set。我试过这样设置:

const fbMessage = (id, text) => {

if(fruits.apples.indexOf(text) >= 0 || fruits.oranges.indexOf(text) >= 0) {

    var body = JSON.stringify({
        recipient: { id },
        "sender_action":"typing_on",
        message: {
            attachment: {
                  "type": "image",
                  "payload": {
                      "url": text
                  }
              }
          },
    });


} else {
    var body = JSON.stringify({
        recipient: { id },
        "sender_action":"typing_on",
        message: { text },
    });
}

const qs = 'access_token=' + encodeURIComponent(FB_PAGE_TOKEN);
return fetch('https://graph.facebook.com/me/messages?' + qs, {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body,
})
.then(rsp => rsp.json())
.then(json => {
    if (json.error && json.error.message) {
    throw new Error(json.error.message);
    }
    return json;
});
};

但我收到以下错误:

我不确定我需要做什么 - 我假设我必须设置某种在每次对话响应之前触发的“sender_action”机器人响应,但我不知道该怎么做这个。

【问题讨论】:

    标签: node.js facebook-messenger messenger wit.ai


    【解决方案1】:

    要显示打字气泡,您只需发送一个打字员操作。这将显示输入指示器长达 20 秒,在此期间您将发送您要发送的实际消息。

    为此的 JSON 将是:

    {
      "recipient":{
        "id":"USER_ID"
      },
      "sender_action":"typing_on"
    }
    

    通话记录在here

    【讨论】:

      【解决方案2】:

      搞定了,不知道如何控制冒泡时间,但现在没问题。下面的代码将在我的每个机器人的响应之前短暂显示键入气泡,而不会破坏我的对话流程。

      FB Messenger 代码:

      const typingBubble = (id, text) => {
      
        var body = JSON.stringify({
            recipient: { id },
            "sender_action":"typing_on"
        });
      
        const qs = 'access_token=' + encodeURIComponent(FB_PAGE_TOKEN);
        return fetch('https://graph.facebook.com/me/messages?' + qs, {
          method: 'POST',
          headers: {'Content-Type': 'application/json'},
          body,
        })
        .then(rsp => rsp.json())
        .then(json => {
          if (json.error && json.error.message) {
            throw new Error(json.error.message);
          }
          return json;
        });
      };
      
      const fbMessage = (id, text) => {
      
        if(scenarioCombos.trends.indexOf(text) >= 0 || scenarioCombos.disruptions.indexOf(text) >= 0) {
      
          var body = JSON.stringify({
              recipient: { id },
              message: {
                  attachment: {
                        "type": "image",
                        "payload": {
                            "url": text
                        }
                    }
                },
          });
      
      
        } else {
          var body = JSON.stringify({
              recipient: { id },
              message: { text },
          });
        }
      
        const qs = 'access_token=' + encodeURIComponent(FB_PAGE_TOKEN);
        return fetch('https://graph.facebook.com/me/messages?' + qs, {
          method: 'POST',
          headers: {'Content-Type': 'application/json'},
          body,
        })
        .then(rsp => rsp.json())
        .then(json => {
          if (json.error && json.error.message) {
            throw new Error(json.error.message);
          }
          return json;
        });
      };
      

      Wit.ai 发送动作代码(在“动作”内):

      send({sessionId}, {text}) {
          const recipientId = sessions[sessionId].fbid;
          if (recipientId) {
            return typingBubble(recipientId, text), fbMessage(recipientId, text)
          .then(() => null)
          .catch((err) => {
              console.error(
              'Oops! An error occurred while forwarding the response to',
              recipientId,
              ':',
              err.stack || err
              );
          });
          } else {
          console.error('Oops! Couldn\'t find user for session:', sessionId);
          return Promise.resolve()
          }
      },
      

      【讨论】:

        最近更新 更多