我正在尝试让代码(node.js)作为 Twilio 功能服务运行,将 SMS/MMS 转发到订阅的电话号码组。该代码正在运行,但没有任何附件与转发的消息一起发送。我对 Twilio 很陌生。任何和所有的帮助将不胜感激。
这是我正在尝试运行的代码:
`exports.handler = function(context, event, callback) {
const twilioClient = context.getTwilioClient();
const syncServiceSid = 'My_Sync_Service_ID_Would_Be_Here'; //
const subscribe = (phoneNumber) => {
return twilioClient.sync.services(syncServiceSid)
.syncLists('subscribers')
.syncListItems
.create({ data: { phone_number: phoneNumber } });
};
const unsubscribe = (phoneNumber) => {
return twilioClient.sync.services(syncServiceSid)
.syncLists('subscribers')
.syncListItems
.list()
.then(subscribers => {
const subscriberItem = subscribers.find(item => item.data.phone_number === phoneNumber);
if (subscriberItem) {
return subscriberItem.remove();
}
});
};
const sendSMS = (to, body, mediaUrl) => {
const additionalText = "Message from the Text Group! \n From: " + event.From + "\n";
const modifiedBody = additionalText + body;
const mediaUrls = event.MediaUrl || []; // Array of attachment URLs
const messageOptions = {
body: modifiedBody,
from: '+18335551212', // My real Twilio phone number would go here
to: to,
// Add media URLs to the message options if they exist
if (mediaUrls.length > 0) {
messageOptions.mediaUrl = mediaUrls || [];
};
return twilioClient.messages.create(messageOptions);
};
// Handle incoming message
const incomingMessage = event.Body;
if (incomingMessage.toLowerCase() === 'join') {
subscribe(event.From)
.then(() => {
callback(null, "You have successfully joined the text group! Text the word LEAVE to stop getting messages.");
})
.catch(error => {
console.error("Error subscribing:", error);
callback(error);
});
} else if (incomingMessage.toLowerCase() === 'leave') {
unsubscribe(event.From)
.then(() => {
callback(null, "You have successfully unsubscribed from the text group. To rejoin, text JOIN to start getting messasges again. ");
})
.catch(error => {
console.error("Error unsubscribing:", error);
callback(error);
});
} else {
twilioClient.sync.services(syncServiceSid)
.syncLists('subscribers')
.syncListItems
.list()
.then(subscribers => {
const isSenderSubscribed = subscribers.some(subscriber => subscriber.data.phone_number === event.From);
if (isSenderSubscribed) {
console.log("Media URLs:", mediaUrl); // Added this line to check the contents of mediaUrls
const sendMessagePromises = subscribers.map(subscriber => {
return sendSMS(subscriber.data.phone_number, incomingMessage, mediaUrl);
});
Promise.all(sendMessagePromises)
.then(() => {
callback(null, "Message forwarded to subscribers");
})
.catch(error => {
console.error("Error sending message:", error);
callback(error);
});
} else {
callback(null, "You are not subscribed. To join, please contact a member of the text group for information on how to join.");
}
})
.catch(error => {
console.error("Error retrieving subscribers:", error);
callback(error);
});
}
};
** 此代码将仅转发 event.body,不包含任何彩信附件。 **
**如果我将 event.MediaUrl 替换为包含媒体内容 URL 的静态数组,代码将转发带有附件的消息。 **
您的代码中似乎存在一些与处理彩信的 mediaUrl 方式相关的问题。以下是需要纠正的内容的细分:
event.MediaUrl 变量可能包含多个媒体 URL,它们将被命名为 MediaUrl0、MediaUrl1 等。您需要循环并收集所有 URL。
在 sendSMS 函数中,您使用了 mediaUrl 变量,但您试图稍后在代码中打印出 mediaUrls 的内容(带有“s”)。这种不一致可能会导致问题。让我们简化一下。
您的评论说您要添加一行来检查 mediaUrls 的内容,但您已经编写了 mediaUrl。这会导致错误。
纠正上述几点的方法如下:
收集所有 MediaUrl: 创建一个函数来收集事件中的所有媒体 URL:
const getMediaUrls = (event) => {
const mediaUrls = [];
let i = 0;
while (event[`MediaUrl${i}`]) {
mediaUrls.push(event[`MediaUrl${i}`]);
i++;
}
return mediaUrls;
};
重构sendSMS函数: 使用mediaUrls而不是mediaUrl来确保一致性:
const sendSMS = (to, body, mediaUrls) => {
const additionalText = "Message from the Text Group! \n From: " + event.From + "\n";
const modifiedBody = additionalText + body;
const messageOptions = {
body: modifiedBody,
from: '+18335551212', // Your real Twilio phone number
to: to
};
if (mediaUrls && mediaUrls.length > 0) {
messageOptions.mediaUrl = mediaUrls;
}
return twilioClient.messages.create(messageOptions);
};
更正 MediaUrls 调试行: 更改此行:
console.log("Media URLs:", mediaUrl);
致:
console.log("Media URLs:", mediaUrls);
最后,当您处理传入消息时,请确保正确提取媒体 URL。将处理消息转发的代码部分更新为:
const mediaUrls = getMediaUrls(event); // Extract media URLs
// ... rest of your code ...
return sendSMS(subscriber.data.phone_number, incomingMessage, mediaUrls);
这些更改应该使您的代码在转发消息时正确发送附件。