首页 > 解决方案 > 异步函数中 window.open() 的多次迭代

问题描述

因此,我正在开发一个简单的机器人来向多个 Whatsapp 联系人发送消息。我在 Whatsapp 网页中注入了下面的代码,它完美地适用于一条消息。然后,当我使用 sendMessageToPhoneList 将其发送到电话号码数组时,它适用于第一个消息/迭代,但下一个给我这个错误:未捕获(承诺)类型错误:无法读取 null 的属性“文档”。

function sendMessage(phone, encodedMessage) {

    return new Promise(resolve => {
        var wppURL, wppPage;

        wppURL = "https://web.whatsapp.com/send?phone="+phone+"&text="+encodedMessage;
        wppPage = window.open(wppURL);

        var send = function() {

            var sendButton = wppPage.document.getElementsByClassName("_3M-N-")[0];

            if (sendButton) {
                sendButton.click();

                setTimeout(function() {
                    wppPage.close();    
                    resolve(true);

                }, 10000);

            } else {
                setTimeout(send, 1000);
            }
        };

        send();
    });
}

async function sendMessageToPhoneList(phoneList, encodedMessage) {
    for (i=0; i < phoneList.length; i++) {
        await sendMessage(phoneList[i], encodedMessage);
    }
}

代码有问题吗?有人可以给我一些见解吗?谢谢!

标签: javascript

解决方案


问题是 chrome 会再次打开相同的选项卡,所以即使您打开窗口多个具有相同名称的窗口并且 chome 不允许它更改您的代码,以便您有不同的窗口名称,它应该修复它。

例如:

wppURL = "https://web.whatsapp.com/send?phone="+phone+"&text="+encodedMessage;
wppPage = window.open(wppURL, wppURL); // second parameter is for window name

推荐阅读