You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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等待元素加载,规避动态页面加载导致的元素找不到问题

注意事项

  1. 首次运行需手动扫码登录WhatsApp网页版,若需自动登录可配置Chrome用户数据目录(添加options.add_argument(r"--user-data-dir=C:\Users\你的用户名\AppData\Local\Google\Chrome\User Data"))
  2. WhatsApp网页版的class名称可能随版本更新变化,若定位失效需重新检查元素属性
  3. 若一个发送者有多张未读图片,当前代码会覆盖字典中的值,可修改为列表存储(如result_dict.setdefault(sender_name, []).append(img_path))

内容的提问来源于stack exchange,提问作者amad durrani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:36:18