使用TradingView与PHP获取Webhook响应数据的问题排查
TradingView Webhook推送信号至PHP脚本失败排查与解决
问题描述
尝试通过Webhook和TradingView警报将TradingView信号推送至远程PHP脚本,但未成功。具体操作:
- 策略代码:
strategy.entry("Long", strategy.long, alert_message = "entry_long") strategy.exit("Exit Long", "Long", limit=LONG_take_profit, stop=LONG_stop_loss, alert_message = "exit_long")
- 按图示配置TradingView警报;
- PHP接收脚本:
if ($_SERVER['REQUEST_METHOD'] == 'POST') { // fetch RAW input $json = file_get_contents('php://input'); // decode json $object = json_decode($json); // expecting valid json if (json_last_error() !== JSON_ERROR_NONE) { die(header('HTTP/1.0 415 Unsupported Media Type')); } $servdate2 = time(); $servdate=date('d-M-Y H:i:s',$servdate2); file_put_contents("/home/user/public_html/data.txt", "$servdate :".print_r($object, true),FILE_APPEND); }
目前能正常收到警报邮件,但指定路径的data.txt文件中无数据。
错误排查与解决方法
1. Webhook配置验证
- 确认TradingView警报的Webhook URL为PHP脚本的完整公网地址(如
https://your-domain.com/receive-signal.php),本地测试需确保服务器可被公网访问。 - 检查警报设置中是否勾选了Send to Webhook URL选项,未遗漏任何必填配置项。
- 确认请求方式为POST(TradingView默认发送POST请求,无需手动修改)。
2. 文件权限问题
- 检查
/home/user/public_html/data.txt及所在目录的权限:- 确保PHP运行用户(通常为
www-data或apache)拥有文件写入权限,可临时执行命令:chmod 666 /home/user/public_html/data.txt(生产环境建议设置更严格的权限)。 - 若文件不存在,手动创建
data.txt并配置权限,或确保脚本所在目录有创建文件的权限。
- 确保PHP运行用户(通常为
3. JSON数据格式与调试
- TradingView Webhook默认发送包含策略完整信息的JSON对象,而非仅
alert_message字段。先调试原始数据:
修改脚本直接写入原始POST内容,排查是否有数据传入:
运行后查看if ($_SERVER['REQUEST_METHOD'] == 'POST') { $rawData = file_get_contents('php://input'); $servdate = date('d-M-Y H:i:s'); file_put_contents("/home/user/public_html/data.txt", "$servdate : $rawData\n", FILE_APPEND); }data.txt,若有内容,再根据实际JSON结构调整解析逻辑。
4. 服务器拦截问题
- 查看服务器访问日志(如
/var/log/apache2/access.log或/var/log/nginx/access.log),确认是否有TradingView的请求记录,若没有则可能被防火墙(iptables、Cloudflare)拦截,需添加规则允许TradingView IP段。 - 检查服务器安全插件(如ModSecurity)是否拦截POST请求,临时关闭测试或添加放行规则。
5. 脚本有效性验证
- 直接访问PHP脚本URL,确认返回200状态码;用Postman或curl发送测试POST请求,验证脚本是否能正常写入数据。
- 检查PHP配置中
allow_url_fopen是否开启(php://input读取无需此配置,但确保无其他限制),可通过phpinfo()查看。
优化后的PHP接收脚本示例
<?php if ($_SERVER['REQUEST_METHOD'] !== 'POST') { http_response_code(405); exit('Method Not Allowed'); } // 获取原始POST数据 $rawInput = file_get_contents('php://input'); if (empty($rawInput)) { http_response_code(400); exit('Empty Request Body'); } // 解析并记录数据 $data = json_decode($rawInput, true); $logMessage = date('d-M-Y H:i:s') . " | Raw Data: $rawInput | Parsed Data: " . print_r($data, true) . "\n"; // 写入日志 $logFile = '/home/user/public_html/data.txt'; if (file_put_contents($logFile, $logMessage, FILE_APPEND) === false) { http_response_code(500); exit('Failed to Write to Log File'); } http_response_code(200); exit('Success'); ?>
内容的提问来源于stack exchange,提问作者gr68
相关产品推荐
相关产品推荐

