接受电话号码并从 WebForm 启动 AutoPilot 的 Twilio 功能

问题描述

我正在尝试创建一个网络表单,用户可以在其中输入他们的电话号码以发起通过 Twilio 的 Autopilot 运行的 SMS 对话。我在有关 Webhooks 的教程和有关 fetch-node 的教程之间挂断了电话,可能需要一些帮助。

目标是:

  • 接受来自网络表单的电话号码
  • 传入 Twilio 函数
  • 解析电话号码
  • 重定向到 Twilio Autopilot 以开始 SMS 对话

Web 表单位于 Duda 托管的网站上,他们关于获取表单提交的 API 文档在这里https://developer.duda.co/reference#get-contact-form-data

我想不通的地方:

  1. 我创建了一个函数(下面的代码)并将该 webhook 放入我的表单的 UI 中 - 正确吗?

  2. 我在 Twilio 错误日志中没有发现任何错误,我认为这意味着我根本没有连接或将数据传递到 Twilio。正确的假设?

  3. 代码。它是从几个不同的地方被黑客入侵的,所以放轻松!

exports.handler = function(context,event,callback) {
const fetch = require('node-fetch');

fetch('https://api.duda.co/api/sites/multiscreen/get-forms/e5712b84',{
        method: 'GET',headers: {
            'Authorization': 'Basic ZGZmOTIzMTA3Yzp3Rk9jMnRDTjRHbk8='
        }
    })
    .then(response => response.json())
    .then(json => {
         console.log("Phone Number:");
         console.log(json[0].Phone);
})

let actions = [];
  let end = {   
      "redirect":{
                    "method": "POST","uri": "task://greeting"
                }
    };

actions.push(end);

    let respObj = {
        'actions': actions
    };
    callback(null,respObj);
};

来自评论中推荐解决方案的错误日志:

UnhandledPromiseRejectionWarning: Unhandled promise rejection: TypeError: Cannot read property 'fieldsData' of undefined
    at Object.exports.handler (/var/task/handlers/ZNbaee490d934cb9ca27e0f14907c04089.js:2:33)
    at Object.exports.handler (/var/task/node_modules/runtime-handler/index.js:310:10)
    at Runtime.exports.handler (/var/task/runtime-handler.js:17:17)
    at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)

解决方法

这里是 Twilio 开发者布道者。

因此,当用户在 Duda 表单中输入电话号码时,您希望向用户触发出站消息。您可以让 Duda 将表单提交的 webhook 发送到 Twilio 函数,这是一个好的开始。让我们看看我们应该从那里做些什么。

Duda form submission webhook is documented here。您应该能够访问使用 Twilio 函数中的 event 对象提交的数据。有一个 data 对象包含 fieldsData,它是表单中的字段数组。根据您的代码,我猜测电话号码正在输入到名为“Phone”的字段中,因此您需要在数组中找到该字段并获取其 field_value

到目前为止,这是此步骤的一些示例代码。请注意,我们不需要从 Duda API 获取数据,因为 webhook 应该包含所有数据。

exports.handler = async function(context,event,callback) {
  const fieldsData = event.data.fieldsData;
  const phoneField = fieldsData.find(field => {
    return field.field_label === "Phone";
  });

  if (phoneField) {
    const to = field.field_value;

    // Do something with the phone number
  } else {
    // Return an error because we could not find the field.
    callback(new Error("Could not find Phone field in webhook data"));
  }
}

现在,您要做的下一件事是向该号码发送消息。您最初说要重定向到 Autopilot,但您目前正在处理来自 Duda 的 webhook,而 Autopilot 尚未参与。您无法将 Autopilot 操作返回给 Duda 的请求,因为 Duda 不知道如何处理它们。

另一件事是您无法从 Autopilot 发出出站请求。 Autopilot 响应入站请求。因此,要让 Autopilot 参与进来,您应该设置 Twilio 号码以使用 Autopilot 机器人进行响应,但您的第一条出站消息必须使用 Twilio Messaging API

您有要将消息发送到的电话号码,我建议您将 Twilio 电话号码添加到 Runtime Environment Variables 中,并且您需要一个出站消息正文。然后你可以发送出站消息,如下所示:

exports.handler = async function(context,callback) {
  const fieldsData = event.data.fieldsData;
  const phoneField = fieldsData.find(field => {
    return field.field_label === "Phone";
  });

  if (phoneField) {
    const to = field.field_value;

    const from = context.TWILIO_PHONE_NUMBER;
    const body = "Thanks for filling in the form. I have some more questions for you.";
    const client = context.getTwilioClient();

    try {
      await client.messages.create({ to,from,body });
      // Everything succeeded,respond OK to the Duda webhook
      callback(null,"OK");
    } catch (error) {
      // Something went wrong trying to send the message
      callback(error);
    }
  } else {
    // Return an error because we could not find the field.
    callback(new Error("Could not find Phone field in webhook data"));
  }
}

我认为这应该可以解决问题。我以前没有使用过 Duda,所以我可能是错的,但希望这能让你走上解决这个问题的道路。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...