如何通过PHP传递参数给Python并调用发送WhatsApp消息
问题排查解决步骤
- 补全所有路径的绝对地址
PHP调用系统命令时默认工作目录、PATH环境变量和你手动执行代码时的登录用户环境不一致,需要把python、test.py都替换为绝对路径:
先在本地控制台执行which python3(Windows系统执行where python)拿到Python解释器的绝对路径,比如/usr/bin/python3;再拿到test.py文件的绝对路径,比如/var/www/project/test.py,修改PHP中的命令为:
额外增加$cmd = "/usr/bin/python3 /var/www/project/test.py ".escapeshellarg($para1);escapeshellarg方法处理参数,避免号码里的特殊字符导致命令执行异常,同时避免命令注入风险。 - 检查运行用户权限
你手动执行Python代码用的是个人登录用户,PHP调用时用的是Web服务的运行用户(比如Linux下的www-data、Windows下的IIS来宾用户),该用户没有pywhatkit依赖的配置目录权限、图形界面调用权限:- 给test.py、pywhatkit的缓存目录(一般为用户主目录下的
.pywhatkit文件夹)配置Web运行用户的可读可执行权限 sendwhatmsg_instantly方法需要调用浏览器打开WhatsApp Web,Web运行用户默认没有图形界面访问权限,可在Python代码开头增加显示环境变量配置:
如果你用的是无图形界面的服务器,需要安装xvfb模拟图形环境,命令改为import os os.environ['DISPLAY'] = ':0' # 以下为你原有代码 import sys import pywhatkit as kit who = sys.argv[1] kit.sendwhatmsg_instantly(who, "I send from PHP and Python, ohmygosh!")xvfb-run /usr/bin/python3 你的脚本绝对路径。 - 给test.py、pywhatkit的缓存目录(一般为用户主目录下的
- 捕获Python错误输出
你当前用exec只能拿到标准输出内容,Python运行报错会输出到stderr,修改PHP命令把stderr重定向到stdout就能看到完整报错:
执行后输出的$cmd = "/usr/bin/python3 /var/www/project/test.py ".escapeshellarg($para1)." 2>&1";$output数组中就能看到具体报错,比如缺少依赖、浏览器未登录WhatsApp Web、找不到浏览器等问题。 - 额外注意
pywhatkit依赖默认浏览器已经提前登录过WhatsApp Web,如果是线上服务使用,建议更换为无头浏览器方案或者官方WhatsApp业务接口,避免依赖图形环境导致的不稳定问题。
内容的提问来源于stack exchange,提问作者Emily
相关产品推荐
相关产品推荐

