使用 webhook 在 twilio 中触发获取请求

Posted

技术标签:

【中文标题】使用 webhook 在 twilio 中触发获取请求【英文标题】:use webhook to trigger a get request in twilio 【发布时间】:2021-12-30 17:07:30 【问题描述】:

我正在构建一个聊天组件。该组件使用 Redux。我的 Chat 组件有一个 useEffect,它可以 dispatch(listConversations()) 并检索对话及其消息。

当有人向我的聊天应用程序发送文本时,twilio 会使用新的文本消息自动更新对话。问题是,为了让我在我的应用程序中看到消息,我必须点击刷新并执行一个 useEffect that dispatch(listConversations())。

我的解决方案是 webhook?

我在我的计算机上成功设置了 Ngrok 以创建一个指向我的本地主机后端的 url 以进行开发。

http://ngrok.io ----> 本地主机:5000

我已经成功地为我的对话创建了一个 webhook,就像这样

 await subClient.conversations.services(convoServiceSid)
        .conversations(newConvoId)
        .webhooks
        .create(
           'configuration.method': 'GET',
           'configuration.filters': ['onMessageAdded', 'onConversationRemoved'],
           'configuration.url': ' http://3de1-a30-00-8547.ngrok.io/conversation-messages',
           target: 'webhook'
         )
        .then(webhook => console.log(webhook.sid));

我的想法是这将触发对我的后端 /conversation-messages 的“GET”请求,这将触发我在下面的功能。但我不确定的是,如果 GET 来自 twilio,在这种情况下,响应会发送到我的前端还是返回到 Webhook 服务器?

当我刷新我的页面时,会调用下面的这个函数,但是当我设置我的 webhook 时,它不会被调用。我做错了吗?

  const listConversationMessages = async (req, res) => 
        console.log("list conversation Messages triggered")
        console.log(req.body)
        const  subActServiceSid, subActAuthToken, convoServiceSid = req.user
        const subClient = require('twilio')(subActServiceSid, subActAuthToken)
        const allConversationSids = []
        const allMessages = []
        const sortedMessages = []
        const options =  weekday: 'long'
        const monthOptions =  month: 'long'
       

        await subClient.conversations.services(convoServiceSid)
        .conversations
        .list()
        .then(conversations => conversations.forEach(c => allConversationSids.push(c.sid))); // conversation possibly has "read" property?
        await Promise.all(allConversationSids.map( async (convo) => 
           await subClient.conversations.services(convoServiceSid)
           .conversations(convo)
           .messages
           .list(limit: 20)
           .then(messages => messages.forEach(m => allMessages.push("messagesId": m.conversationSid, "participantSid": m.participantSid,  "message": m.body, "time":  "day": new Intl.DateTimeFormat('en-US', options).format(m.dateCreated.getDay()), "hour": m.dateCreated.getHours() + ":" + m.dateCreated.getMinutes(), "date": new Intl.DateTimeFormat('en-US', monthOptions).format(m.dateCreated.getMonth()) + " " + m.dateCreated.getDate() + ", " + m.dateCreated.getFullYear())));
        ))
       let response
        if(allMessages.length < 1 ) 
        response = ["messagesId": 1 , "content": [ "participantSid": 2,  "message": "test" ]]
         else 
        response = allMessages
    
   
    result = await response.reduce(function (accumulator, indexOfObject) 
        accumulator[indexOfObject.messagesId] = accumulator[indexOfObject.messagesId] || [];
        accumulator[indexOfObject.messagesId].push(indexOfObject);       //it generates a new property a.messagesId with an array if it does not exist (the value of not existing properties is undefined). if exist, it assign itself
        return accumulator;
    , Object.create());
  
    sortedMessages.push(result)
    const finalResult = Object.entries(sortedMessages[0]).map(([id, content]) => ( id, content ))
    res.json(finalResult)
       ```

【问题讨论】:

【参考方案1】:

详情.... 我的问题是当我声明 webhook 'configuration.url:'// 我在 http://' 之前有一个空格

一旦我删除空间它就可以了。

【讨论】:

以上是关于使用 webhook 在 twilio 中触发获取请求的主要内容,如果未能解决你的问题,请参考以下文章

获取 Particle Photon 和 Twilio 之间的 webhook

使用 ngrok 地址来电自动设置 Twilio webhook 地址

从 webhook 传入的 twilio 正文中没有消息

为 Twilio 创建 PHP webhook 的问题

如何使用 Google 工作表脚本将 twilio 控制台内的 sms webhook 中的功能切换为控制台中的另一个功能?

Jenkins在webhook触发时获取错误的分支