如何确保 WhatsApp python bot 中发送的最后一条消息

How to make sure the last message sent in WhatsApp python bot

我使用我编写的代码在 WhatsApp 上向多个联系人发送消息,但在发送所有消息之前,Chrome 关闭并且一些消息未发送。我如何确定我发送的消息已发送? (这不是程序的问题)问题是网速慢,消息发送需要稍等

from bs4 import BeautifulSoup
from selenium.webdriver.support import expected_conditions as EC
from time import sleep
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

import os

class WhatsApp:
    def __init__(self) -> None:
        user = os.getlogin()

    options = webdriver.ChromeOptions()
    # options.headless = True
    options.add_argument('--profile-directory=Default')
    options.add_argument(
        f'--user-data-dir=C:\Users\{user}\AppData\Local\Google\Chrome\User Data')
    PATH = "chromedriver_win32\chromedriver.exe"
    self.driver = webdriver.Chrome(
        executable_path=PATH, chrome_options=options)
    self.driver.set_window_position(0, 0)
    self.driver.set_window_size(0, 0)
    self.driver.get("https://web.whatsapp.com")
    WebDriverWait(self.driver, 5000).until(
        EC.presence_of_element_located(
            (By.XPATH, '//*[@id="side"]/header/div[2]/div/span/div[2]/div'))
    )
def send_msg(self, phone: str, msg: str):

    search_btn = self.driver.find_element_by_xpath(
        '//*[@id="side"]/header/div[2]/div/span/div[2]/div')
    search_btn.send_keys(Keys.ENTER)
    input_search = self.driver.find_element_by_xpath(
        '/html/body/div[1]/div/div/div[2]/div[1]/span/div/span/div/div[1]/div/label/div/div[2]')
    input_search.send_keys(phone, Keys.ENTER)
    try:
        sleep(1)
        self.driver.find_element_by_xpath(
            "/html/body/div[1]/div/div/div[4]/div/footer/div[1]/div/span[2]/div/div[2]/div[1]/div/div[2]").send_keys(
            msg, Keys.ENTER)
    except Exception as e:
        pass
        # showMessageBox.contacte_not_found(showMessageBox)

def check_is_sended(self, phone: str, msg: str):
    pass
#some code i need to check message sended or not

def END(self):
    sleep(3)
    self.driver.close()

app = WhatsApp()
phone = "+98xxxxxxxx87"
message = "test"
app.send_msg(phone , message)

app.END()

所以我不想长时间使用睡眠,我只是想找到最好的方法来缩短运行任何 id 程序的时间?

当 selenium 单击“发送消息按钮”时,
将在 html 中创建一个新的 div,表示您发送了一条消息。所以,让selenium等到它出现。

然后让selenium也等待验证图标表示消息已成功发送到Whatsapp服务器。


问:如何获取新消息? A: 你可以等到 chat-room html-div 包含你发送的信息。

from selenium.webdriver.support import expected_conditions as EC

locator = (By.ID, 'someid') #modify this according to your case
your_new_msg = 'blabla bla' #modify this according to your case
wait.until(EC.text_to_be_present_in_element(locator, your_new_msg))

但是这个简短的解决方案可能会导致错误,因为味精可能存在于 chat-room div 中的另一个旧味精中。因此,selenium 会认为这是预期的消息,然后错误地退出等待。
因此,如果您是新开发人员,此解决方案可能对您来说很难。
你需要在 Python 和 Javascript 之间建立一个通道来在它们之间传递数据
然后你在 JS 中创建一个事件监听器来观察 chat-room 变化(例如:你可以覆盖 (chat-room-div).appendChild 方法。然后你得到 new-msg html 元素在你的 JS 方法中显示在 html)
然后你可以从 JS 发送消息给 python 告诉他 new-msg div 已经出现并且验证图标也出现了
然后 python 将退出等待状态。然后继续执行下一段代码 _____ 这只是个主意。它的实施取决于你。