Twilio等待响应,我不想服务器响应

时间:2018-11-14 05:16:06

标签: ruby twilio webhooks

我正在使用Slack Webhook处理来自Twilio的传入SMS消息。但是,按照我的设置方式,似乎Twilio希望Web服务器(松弛)对此做出响应。这会导致在Twilio中生成错误,并且我显然不希望出现错误,因为我会收到电子邮件。

我正在使用Ruby中的twilio-ruby宝石发送SMS消息,并使用slack-ruby-client监视来自Slack的传入消息。

当Twilio发布到Slack Webhook时,如何阻止Twilio尝试从Web服务器获得响应?甚至有可能还是我所有这些配置都不正确?

编辑

这是我将转发的SMS发送到Slack的功能:

const https = require("https");

// Make sure to declare SLACK_WEBHOOK_PATH in your Environment
// variables at
// https://www.twilio.com/console/runtime/functions/configure

exports.handler = (context, event, callback) => {
  // Extract the bits of the message we want
  const { To, From, Body } = event;

  // Construct a payload for slack's incoming webhooks
  const slackBody = JSON.stringify({
        text: `!asi SMS\nFrom: ${From}\nMessage: ${Body}`
  });

  // Form our request specification
  const options = {
    host: "hooks.slack.com",
    port: 443,
    path: context.SLACK_WEBHOOK_PATH,
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "Content-Length": slackBody.length
    }
  };

  // send the request
  const post = https.request(options, res => {
    // only respond once we're done, or Twilio's functions
    // may kill our execution before we finish.
    res.on("end", () => {
      // respond with an empty message
      callback(null, new Twilio.twiml.MessagingResponse());
    });
  });
  post.write(slackBody);
  post.end();
};

1 个答案:

答案 0 :(得分:2)

这里是Twilio开发人员的传播者。

Twilio总是希望收到至少200个响应,否则传入消息Webhook将在15秒后超时。

您可以通过在Twilio和Slack之间使用诸如Zapier(例如this blog post中的示例)或使用Twilio函数(例如described here)或使用Twilio Studio(从{ {3}}。

希望其中一个想法有所帮助!

更新

在我之前的回答中,给出了用于拨打电话的代码后,我进行了更新。

使用Node的内置https模块documentation here发出请求时。这就是导致Twilio和Twilio函数之间超时的原因,您永远不会响应它,因为您不会消耗请求中的数据。

在快速测试中,我发现仅监听data事件就意味着end事件确实触发了。因此,将您的功能更新为:

  const post = https.request(options, res => {
    // only respond once we're done, or Twilio's functions
    // may kill our execution before we finish.
    res.on("data", () => {});
    res.on("end", () => {
      // respond with an empty message
      callback(null, new Twilio.twiml.MessagingResponse());
    });
  });

它应该可以工作。