基于Selenium+Python的WhatsApp网页版未读图片消息批量处理问题
WhatsApp网页版未读图片消息批量下载实现方案
核心问题修正
原代码使用find_element_by_xpath仅能获取单个元素,要批量处理未读会话,需改用find_elements方法定位所有带未读标记的会话。同时Selenium 4+已弃用旧版元素定位API,需改用from selenium.webdriver.common.by import By配合新方法。
完整实现代码
import os import requests from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from webdriver_manager.chrome import ChromeDriverManager def download_whatsapp_images(): # 初始化浏览器 chrome = webdriver.Chrome(service=Service(ChromeDriverManager().install())) chrome.get("https://web.whatsapp.com") wait = WebDriverWait(chrome, 30) # 等待扫码登录完成(手动扫码) wait.until(EC.presence_of_element_located((By.ID, "pane-side"))) # 存储结果的字典 result_dict = {} # 下载目录,可自行修改 download_dir = "c:/whatsapp_images" os.makedirs(download_dir, exist_ok=True) # 获取所有带未读标记的会话节点 unread_chats = wait.until(EC.presence_of_all_elements_located( (By.XPATH, '//div[@id="pane-side"]//div[contains(@class, "unread")]') )) for chat in unread_chats: # 获取发送者名称 sender_name = chat.find_element(By.XPATH, './/div[@class="_21S-L"]').text # 点击进入会话 chat.click() # 等待会话加载完成,定位未读的图片消息 wait.until(EC.presence_of_element_located((By.ID, "main"))) # 未读图片消息的特征:带蓝色对勾(未读)且是图片类型 unread_images = wait.until(EC.presence_of_all_elements_located( (By.XPATH, '//div[@id="main"]//div[contains(@class, "message-in") and contains(@class, "unread")]//img[@data-plain-text="Image"]') )) for idx, img_element in enumerate(unread_images): # 获取图片真实URL img_url = img_element.get_attribute("src") # 生成保存路径 img_path = os.path.join(download_dir, f"{sender_name}_img{idx+1}.png") # 下载图片 response = requests.get(img_url) with open(img_path, "wb") as f: f.write(response.content) # 记录到字典(若一个发送者有多张图,可改为列表存储) result_dict[sender_name] = img_path # 关闭浏览器 chrome.quit() return result_dict # 执行并打印结果 if __name__ == "__main__": image_dict = download_whatsapp_images() print(image_dict)
关键说明
- 未读会话定位:通过
contains(@class, "unread")筛选所有带未读标记的会话,避免原代码硬编码固定索引的局限性 - 图片消息识别:通过
data-plain-text="Image"定位图片消息,结合unread类确保目标是未读状态的图片 - 下载逻辑:使用
requests直接获取图片URL的原始内容,比Selenium截图清晰度更高、稳定性更强 - 等待机制:全程使用
WebDriverWait等待元素加载,规避动态页面加载导致的元素找不到问题
注意事项
- 首次运行需手动扫码登录WhatsApp网页版,若需自动登录可配置Chrome用户数据目录(添加
options.add_argument(r"--user-data-dir=C:\Users\你的用户名\AppData\Local\Google\Chrome\User Data")) - WhatsApp网页版的class名称可能随版本更新变化,若定位失效需重新检查元素属性
- 若一个发送者有多张未读图片,当前代码会覆盖字典中的值,可修改为列表存储(如
result_dict.setdefault(sender_name, []).append(img_path))
内容的提问来源于stack exchange,提问作者amad durrani
相关产品推荐
相关产品推荐

