如何确保 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 将退出等待状态。然后继续执行下一段代码
_____
这只是个主意。它的实施取决于你。
我使用我编写的代码在 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也等待验证图标
问:如何获取新消息? 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 将退出等待状态。然后继续执行下一段代码 _____ 这只是个主意。它的实施取决于你。