关于这个问题的一些信息。我使用 Kommo Crm (Amo Crm) 进行工作。 内部集成允许我通过 Twilio 接受和发送文本,但那东西不会向我显示收入图像。所以我需要做一个定制的解决方案。我决定在我的谷歌应用程序上处理图像。
所以我需要 twilio 发送 2 个 webhook。 1 个到 kommo(用于继续接收消息)和 1 个到我的应用程序。
现在 1 个 kommo 的 webhook 可以工作。这是设置(图1) 这是通过“消息服务”-“集成”-“webhook url”完成的
所以我将“webhook url”更改为我的应用程序 url,并尝试将钩子转发到 Kommo。我的应用程序收到了钩子,然后钩子被转发到 kommo 但它没有通过。该消息不会显示在 Kommo 中。尝试了不同的方法。它显示响应 200(成功),但消息没有出现。
然后我发现了这个 twilio 函数,它通过 axios 发送 2 个 webhook。
const axios = require('axios');
const qs = require('querystring');
exports.handler = function(context, event, callback) {
let twiml = new Twilio.twiml.MessagingResponse();
let {
ApiVersion,
SmsSid,
SmsStatus,
SmsMessageSid,
NumSegments,
ToState,
From,
MessageSid,
AccountSid,
ToCity,
FromCountry,
ToZip,
FromCity,
To,
FromZip,
ToCountry,
Body,
NumMedia,
FromState
} = event;
let requestBody = {
ApiVersion,
SmsSid,
SmsStatus,
SmsMessageSid,
NumSegments,
ToState,
From,
MessageSid,
AccountSid,
ToCity,
FromCountry,
ToZip,
FromCity,
To,
FromZip,
ToCountry,
Body,
NumMedia,
FromState
};
console.log('Test '+ Body);
let url1 = "https://chatstwilio.amocrm.com/twilio_sms/webhook/twilio_message/incoming";
let url2 = "https://script.google.com/macros/s/AKfycbyrFMmuBDpjBIV05vD2utzL9v5au_hlcHbIA4uj7D09JkKW4XiDW9FoW/exec?fn=twiliomedia";
const config = {
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
}};
Promise.all([
axios.post(url1, qs.stringify(requestBody), config),
axios.post(url2, qs.stringify(requestBody), config)
]).then(result => {
callback(null, twiml);
}).catch(err => {
console.log(err);
callback(err);
});
};
它发送钩子,我的应用程序收到它,但 kommo 没有。
我认为问题出在标题中。 X-Twilio-签名。 或者也许是别的什么。我不知道。
你有什么建议?如何让twilio发送2个原始的webhooks?
总共:
请帮忙。 在完美的情况下,我需要在 Kommo 中获取消息并在我的 google web 应用程序中处理图像。
所以我一晚上没睡觉,并提出了如何从 twilio 发送 2 个或更多原始 webhook 的解决方案。搜索关键词:如何转发 twilio webhook、如何发送自定义 twilio webhook
不要忘记输入您自己的 authToken,https://your.site/webhook。
const webhooks = require('twilio/lib/webhooks/webhooks');
const { default: axios } = require('axios');
async function makeTwiMLBinRequest(url, data) {
//console.log('inside');
const authToken = 'XXXX'; // YOUR authToken
let eventData = {};
//console.log('Data received: '+data);
//delete request.headers from the webhook.
delete data.request;
eventData = data;
//console.log('eventData received: '+eventData.toString());
// Construct a valid application/x-www-form-urlencoded POST body
const params = new URLSearchParams();
for (const [key, value] of Object.entries(eventData)) {
params.append(key, value);
}
data = params.toString();
//console.log('Data to send: '+data);
// Generate the X-Twilio-Signature
const signature = webhooks.getExpectedTwilioSignature(
authToken,
url,
eventData
);
//console.log('Sign: '+signature);
const headers = {};
headers['X-Twilio-Signature'] = signature;
headers["user-agent"] = "TwilioProxy/1.1";
headers["accept"] = "*/*";
headers["x-home-region"] = "us1";
headers["content-type"] = "application/x-www-form-urlencoded";
//console.log(headers.toString());
// Make the HTTP request to the passed URL
const response = await axios.request({
method: 'POST',
headers,
url,
data
})
//console.log('Resp: '+response.data);
return response.data;
}
exports.handler = async (context, event, callback) => {
// Make an HTTP request to your TwiML Bin
//console.log("Invoked with: ", event);
//forward twilio hook to kommo
const webhook1 = await makeTwiMLBinRequest('https://chatstwilio.amocrm.com/twilio_sms/webhook/twilio_message/incoming', event);
const webhook2 = await makeTwiMLBinRequest('https://your.site/webhook', event);
return callback();
}