curl_exec returns 不可读的文本 - cURL PHP

curl_exec returns unreadable text - cURL PHP

我正在尝试使用 cURL,但是 curl_exec() returns 文本不可读,如下面的屏幕截图所示。 我像下面这样写了 cURL。我想知道如何解决这个问题。

$ch = curl_init("https://app.kajabi.com/login");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Host: app.kajabi.com',
    'Connection: keep-alive',
    'Cache-Control: max-age=0',
    'sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="99", "Google Chrome";v="99"',
    'sec-ch-ua-mobile: ?0',
    'sec-ch-ua-platform: "Windows"',
    'Upgrade-Insecure-Requests: 1',
    'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Sec-Fetch-Site: none',
    'Sec-Fetch-Mode: navigate',
    'Sec-Fetch-User: ?1',
    'Sec-Fetch-Dest: document',
    'Accept-Encoding: gzip, deflate, br',
    'Accept-Language: en-GB,en-US;q=0.9,en;q=0.8',
    'Cookie: _kjb_session=795006a5538f30410ce2f56bd813ddb0; __cf_bm=7iLyh_LWPmJjzo07YdEJQaE_RT0LPS2R6NL1Hp3Li6g-1649142817-0-Ae4i2Gq5QTr+PktvLBJEV8MHcgGTw5ADVHkedUa3JTcVLHEDTyE01Nw6qsZtmjs7Quu+phKNOlCtu/8Cxpdwxec=; __cfruid=531ca052551b47923660c7b1832af0f2ea867981-1649142817; _kjb_ua_components=41e11a8e3c73294e1d2e0f1813e1f86d'
));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);

if (curl_errno($ch)) {
    print "Error: " . curl_error($ch);
    exit();
}
echo $response;

我尝试将响应放入文件中,结果似乎是 gzip 格式的响应。 file_put_contents('temp.gz',$response)

我提取了存档,发现它是一个 HTML 文件,告诉您 访问被拒绝

您可以直接在 php 脚本的输出中显示响应,但是:

$decoded_response = gzdecode($response);
echo $decoded_response;

也许您应该在尝试使用 gzdecode 之前检查内容是否真的是 gzip;看到这个线程:php curl, detect response is gzip or not


编辑: 您可以通过将 CURLOPT_ENCODING 设置为 '' 让 php 自动进行解码:

<?php
$ch = curl_init("https://app.kajabi.com/login");
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Host: app.kajabi.com',
    'Connection: keep-alive',
    'Cache-Control: max-age=0',
    'sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="99", "Google Chrome";v="99"',
    'sec-ch-ua-mobile: ?0',
    'sec-ch-ua-platform: "Windows"',
    'Upgrade-Insecure-Requests: 1',
    'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.84 Safari/537.36',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Sec-Fetch-Site: none',
    'Sec-Fetch-Mode: navigate',
    'Sec-Fetch-User: ?1',
    'Sec-Fetch-Dest: document',
    'Accept-Encoding: gzip, deflate, br',
    'Accept-Language: en-GB,en-US;q=0.9,en;q=0.8',
    'Cookie: _kjb_session=795006a5538f30410ce2f56bd813ddb0; __cf_bm=7iLyh_LWPmJjzo07YdEJQaE_RT0LPS2R6NL1Hp3Li6g-1649142817-0-Ae4i2Gq5QTr+PktvLBJEV8MHcgGTw5ADVHkedUa3JTcVLHEDTyE01Nw6qsZtmjs7Quu+phKNOlCtu/8Cxpdwxec=; __cfruid=531ca052551b47923660c7b1832af0f2ea867981-1649142817; _kjb_ua_components=41e11a8e3c73294e1d2e0f1813e1f86d'
));
curl_setopt($ch, CURLOPT_ENCODING, '');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);

if (curl_errno($ch)) {
    print "Error: " . curl_error($ch);
    exit();
}
echo $response;
?>

您正在从 Curl 获取 un-handled GZIP,因为您在 header 数组中手动​​设置 Accept-Encoding: header,而不是让 Curl 处理它。然后 Curl 收到 unexpectedly-encoded 响应并说“我不知道,你处理这个”。

你是在告诉远程端“我希望以 这种 方式处理事情”,但你实际上并没有告诉 local 端.

轻松修复: 从 header 数组中删除 Accept-Encoding: header,可选择将这些编码规范移动到 CURLOPT_ENCODING 您在自己的答案中添加的设置,但我会说这是不必要的,因为 curl 无论如何都会更喜欢压缩。

您可能不应该手动设置的其他 header:

  • Host: 不必要,除非您需要 URL
  • 中的主机名以外的值
  • Connection: 客户需要注意
  • Upgrade-Insecure-Requests: 客户需要注意,browser-specific