Twilio 代码 (node.js) 是 SMS,不转发短信中的 mediaurl

问题描述 投票:0回答:1

我正在尝试让代码(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 的静态数组,代码将转发带有附件的消息。 **

node.js twilio sms twilio-api mms
1个回答
0
投票

您的代码中似乎存在一些与处理彩信的 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);

这些更改应该使您的代码在转发消息时正确发送附件。

© www.soinside.com 2019 - 2024. All rights reserved.