使用 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 地址
如何使用 Google 工作表脚本将 twilio 控制台内的 sms webhook 中的功能切换为控制台中的另一个功能?