【问题标题】:Twilio awaits response, I don't want server to respondTwilio 等待响应,我不希望服务器响应
【发布时间】:2018-11-14 05:16:05
【问题描述】:

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

我在 Ruby 中使用 twilio-ruby gem 发送 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();
};

【问题讨论】:

  • 您为什么不简单地通过200 响应确认 POST 并完成它?
  • 因为它发布到 slack,而不是我正在控制或有权访问的服务器。我认为 slack 不允许您对传入的 webhook 提供响应,除非我正在考虑某些内容。
  • 在不返回响应的情况下接受 HTTP 请求有点奇怪……但是哦,好吧,我不知道 Slack,所以我就留给你吧……
  • 是的,这就是 Twilio 使用其 webhook 的方式。一旦收到消息,它就会将详细信息发送到 webhook 并等待响应。只需要弄清楚我是否可以关闭这个等待过程。

标签: ruby twilio webhooks


【解决方案1】:

这里是 Twilio 开发者宣传员。

对于传入的消息 webhook,Twilio 总是会期望至少有 200 响应或将在 15 秒时超时。

您可以通过使用介于 Twilio 和 Slack 之间的东西来避免错误消息,例如 Zapier(this blog post 中的示例)或使用 Twilio 函数(如 described here)或使用 Twilio Studio(来自 documentation here)。

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

更新

在我之前的回答的基础上,鉴于您用来拨打电话的代码,我有一个更新。

当使用 Node 的内置 https 模块 you will not get the end event until you have read the data 发出请求时。这就是导致 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());
    });
  });

它应该可以工作。

【讨论】:

  • 谢谢!正如那篇文章中提到的,我正在使用 Twilio 函数发送到 slack,但这就是产生错误的原因。我想我需要弄清楚如何对函数进行更多更改。
  • 嗯,你能分享你在函数中使用的代码吗?我认为那里可能有一些不正常的东西。
  • 绝对。更新了原始帖子以反映该功能。
  • 以为我发现了发生了什么,我更新了我的答案。
猜你喜欢
  • 2013-10-25
  • 2017-06-28
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多