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

使用pywhatkit的sendwhatmsg_instantly发送WhatsApp即时消息失败求助

pywhatkit发送WhatsApp消息失败问题解决与优化方案

问题背景

开发了一款语音控制的WhatsApp消息发送程序,核心逻辑是通过语音识别获取收件人和消息内容,调用pywhatkit的sendwhatmsg_instantly函数发送消息。当前遇到的问题:程序能正常打开WhatsApp网页、定位到目标联系人、输入消息,但无法完成发送操作,一段时间后标签页自动关闭,调整tab_close参数后问题依旧。

核心代码如下:

def WhatsApp():
    speak("For Whom should i send message")
    Contacts = {
        'mom' : 63XXXXXXX,   # these are numbers (hidden)
        'karthik' : 75XXXXXXx,
        'me' : 81XXXXXXX,
        'jayaram' : 99XXXXXXXX
    }
    to = takeCommand() #takes my voice input using speech_recognition
    speak("what message should i send")
    msg = takeCommand()
    speak(f"sending message to {to}")
    try:
        pwt.sendwhatmsg_instantly(f"+91{Contacts[to]}",msg,5,True,15)
    except Exception as e:
        speak(f"error sending message")
        print(e) 

问题原因分析

  1. 等待时间不足:sendwhatmsg_instantly的wait_time参数设为5秒,WhatsApp网页加载会话、渲染发送按钮的时间可能超过这个值,导致程序尝试点击发送时元素未就绪。
  2. 网页元素定位失效:pywhatkit依赖固定的DOM元素选择器模拟发送操作,若WhatsApp网页更新了元素结构,会导致点击发送的逻辑失效。
  3. 浏览器自动化权限/驱动问题:Chrome浏览器版本与WebDriver不匹配,或者浏览器的自动化权限限制,导致模拟点击操作无法执行。

快速解决方法

针对现有代码,可通过以下调整修复问题:

  • 延长等待时间:将wait_time参数从5秒调整为15-20秒,确保网页完全加载:
    pwt.sendwhatmsg_instantly(f"+91{Contacts[to]}",msg,15,False,30)
    
  • 禁用自动关闭标签页:将tab_close设为False,保留标签页便于调试发送失败的具体原因。
  • 检查浏览器驱动:确保Chrome浏览器版本与对应版本的ChromeDriver匹配,避免因驱动过时导致交互失败。

更稳定的优化方案

直接使用Selenium手动控制网页交互,摆脱pywhatkit对固定元素选择器的依赖,稳定性大幅提升。优化后的代码如下:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
import speech_recognition as sr

def speak(text):
    # 替换为你的语音合成实现(如pyttsx3)
    pass

def takeCommand():
    r = sr.Recognizer()
    with sr.Microphone() as source:
        print("Listening...")
        r.pause_threshold = 1
        audio = r.listen(source)
    try:
        query = r.recognize_google(audio, language='en-in').lower()
        print(f"User input: {query}")
    except Exception:
        speak("Say that again please...")
        return "None"
    return query

def WhatsApp():
    speak("For whom should I send the message?")
    Contacts = {
        'mom' : '63XXXXXXX',
        'karthik' : '75XXXXXXX',
        'me' : '81XXXXXXX',
        'jayaram' : '99XXXXXXXX'
    }
    
    # 确认有效联系人
    to = takeCommand()
    while to not in Contacts:
        speak("Contact not found, please repeat.")
        to = takeCommand()
    
    # 确认有效消息
    speak("What message should I send?")
    msg = takeCommand()
    while msg == "None":
        speak("Message unclear, please repeat.")
        msg = takeCommand()
    
    speak(f"Sending message to {to}")
    phone_no = f"+91{Contacts[to]}"
    
    # 初始化浏览器驱动
    driver = webdriver.Chrome()
    # 直接打开带参数的WhatsApp链接,自动填入消息
    driver.get(f"https://web.whatsapp.com/send?phone={phone_no}&text={msg}")
    
    # 等待网页加载(根据网络情况调整)
    time.sleep(15)
    
    try:
        # 定位消息输入框,按回车发送
        msg_box = driver.find_element(By.XPATH, '//div[@title="Type a message"]')
        msg_box.send_keys(Keys.ENTER)
        
        speak("Message sent successfully.")
        time.sleep(3)
    except Exception as e:
        speak("Failed to send message.")
        print(f"Error: {e}")
    finally:
        driver.quit()

优化点说明

  • 容错处理:增加了联系人不存在、语音识别失败的循环重试逻辑,提升程序鲁棒性。
  • 直接控制交互:通过Selenium手动定位元素并执行发送操作,不受pywhatkit版本或WhatsApp网页更新的影响。
  • 透明调试:保留浏览器操作过程,便于排查加载或交互问题。

内容的提问来源于stack exchange,提问作者KARTX LEGEND YT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 07:27:06