PHP cURL调用Facebook API下载线索CSV文件异常求助
问题描述
- 现有可下载Facebook线索CSV格式数据的接口地址:
https://www.facebook.com/ads/lead_gen/export_csv/?id=XXXXXXXXXX&type=form - 需求:通过PHP cURL实现将该接口返回的表格文件下载到自有服务器
- 初始实现代码如下:
$output_filename = "test.csv"; $host = "https://www.facebook.com/ads/lead_gen/export_csv/?id=XXXXXXXXXXX&type=form"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $host); curl_setopt($ch, CURLOPT_VERBOSE, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_AUTOREFERER, false); curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE ); curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 2 ); curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, TRUE ); curl_setopt($ch, CURLOPT_REFERER, "https://www.facebook.com"); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_setopt($ch, CURLOPT_HEADER, 0); $result = curl_exec($ch); curl_close($ch); print_r($result); $fp = fopen($output_filename, 'w'); fwrite($fp, $result); fclose($fp);
- 通过路径
https://服务器IP/facebook/facebook.php运行代码后返回结果异常,无法获取目标文件,异常响应参考:异常响应截图
故障原因
当前代码没有携带接口访问必须的鉴权凭证,Facebook识别到请求为未授权的陌生请求,直接返回了登录拦截/安全校验页面,没有返回真实的CSV文件内容。另外代码中关闭SSL证书校验的写法存在安全风险,也没有做请求结果校验,会直接把异常页面内容写入csv文件。
修复方案
- 先获取访问该导出接口的有效凭证:浏览器登录有线索导出权限的Facebook账号,手动触发一次线索导出,在浏览器开发者工具的网络请求面板里找到对应
export_csv请求,复制完整的Cookie值 - 替换代码中的鉴权参数,补充错误判断逻辑,修正不安全的SSL配置,参考代码如下:
$output_filename = "test.csv"; $host = "https://www.facebook.com/ads/lead_gen/export_csv/?id=XXXXXXXXXXX&type=form"; // 替换为你从浏览器请求中复制的完整有效Cookie $facebookCookie = "你的Cookie字符串"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $host); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); curl_setopt($ch, CURLOPT_REFERER, "https://www.facebook.com/ads/manager/lead_center/"); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Cookie: ".$facebookCookie ]); curl_setopt($ch, CURLOPT_HEADER, 0); $result = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); $curlError = curl_error($ch); curl_close($ch); // 校验请求状态和返回格式,确认是CSV再写入文件 if ($curlError) { die("cURL请求出错:".$curlError); } if ($httpCode != 200 || strpos($contentType, 'text/csv') === false) { die("接口返回异常,HTTP状态码:".$httpCode.",返回内容类型:".$contentType.",返回内容:".$result); } $fp = fopen($output_filename, 'w'); fwrite($fp, $result); fclose($fp); echo "文件下载成功,保存路径:".__DIR__."/".$output_filename;
注意:网页端Cookie有有效期,失效后需要重新获取。如果需要长期稳定调用,建议直接使用Facebook官方Marketing API接口,通过长期访问令牌鉴权,不要依赖网页导出接口爬取。
内容的提问来源于stack exchange,提问作者MURALA SANDEEP
相关产品推荐
相关产品推荐

