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

pywhatkit实现WhatsApp自动发送成功率低,如何排查错误?

问题根因及修复方案

你遇到的偶发发送失败是pywhatkit依赖模拟浏览器操作的特性导致的,和现有代码的业务逻辑无关,按以下方案调整即可大幅提升发送成功率:

  • 首先校验号码格式:存入数据库的客户手机号必须携带完整国际区号,不需要加+前缀,比如西班牙号码应为34612345678,缺失区号会导致WhatsApp网页版打开无效会话,无法触发发送动作。
  • 新增输入框对焦逻辑:pywhatkit默认不会主动点击输入框,页面加载完成后如果焦点没有落在输入框中,模拟的回车发送动作就会失效,你可以额外引入pyautogui库辅助模拟操作,或者开启pywhatkit内置的点击参数,最新版pywhatkit的sendwhatmsg_instantly已经支持click_every_time参数,设为True会自动点击输入框保证对焦。
  • 调整等待和关闭逻辑:不要设置tab_close=True,避免发送请求还没完成就提前关闭标签页截断请求;将固定的全局休眠拆分,发送后先等待数秒确认发送成功再执行后续操作,适配不同网络环境的加载波动。
  • 新增异常捕获逻辑:当前代码没有异常处理,网络波动、会话加载失败时会直接中断整个发送流程,增加try-except捕获异常后重试,能进一步提升成功率。

调整后的参考代码如下:

import pywhatkit as pwt
import time
import mysql.connector
import pyautogui

def Whatsapp():
    mydb = mysql.connector.connect(
        host = "localhost",
        user = "root",
        passwd = "########",
        database = "########",
    )
    
    my_cursor = mydb.cursor()
    x="SELECT nombre, celular FROM clientes WHERE checkin <= CURDATE() AND checkout > CURDATE()"
    my_cursor.execute(x)
    numbers=my_cursor.fetchall()
    
    for result in numbers:
        name = result[0]
        number = result[1]
        # 此处替换为你业务覆盖地区的国际区号前缀
        if not str(number).startswith(('34',)):
            print(f"号码{number}格式错误,跳过发送给{name}")
            continue
        text = f"Hello {name} Good morning, how was everything in your room?"
        try:
            # 开启自动点击输入框,关闭自动关标签页避免截断请求
            pwt.sendwhatmsg_instantly(number, text, wait_time=60, tab_close=False, click_every_time=True)
            # 等待文字输入完成,二次模拟回车确保触发发送
            time.sleep(2)
            pyautogui.press('enter')
            # 等待消息发送完成出现对勾标识
            time.sleep(10)
            # 手动关闭当前标签页,避免窗口堆积影响后续发送
            pyautogui.hotkey('ctrl', 'w')
            time.sleep(5)
            print(f"Message to {name} Send successfully")
        except Exception as e:
            print(f"发送给{name}失败,错误信息:{str(e)}")
            # 异常时关闭错误标签页,避免影响下一次发送
            try:
                pyautogui.hotkey('ctrl', 'w')
                time.sleep(2)
            except:
                pass
    mydb.close()

额外注意事项

运行脚本时确保浏览器没有被最小化、屏幕没有进入休眠状态,模拟操作在窗口最小化时会失效,你可以把浏览器固定在屏幕最上层,运行脚本期间不要切换窗口即可。如果测试后成功率仍不符合预期,可以将wait_time参数再调长10-20秒适配你的网络环境。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 20:36:08