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
相关产品推荐
相关产品推荐

