curl_execは読み取り不可能なテキストを返します-cURLPHP
cURLを試していますが、 curl_exec()
は下のスクリーンショットのような判読できないテキストを返します。
以下のように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、応答がgzipであるかどうかを検出する
編集: CURLOPT_ENCODING
を''
に設定することで、phpに自動的にデコードを行わせることができます:
<?php
$ ch = curl_init( "https://app.kajabi.com/login");
curl_setopt($ ch、CURLOPT_HTTPHEADER、array(
'ホスト:app.kajabi.com'、
'接続:キープアライブ'、
'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'、
'ユーザーエージェント:Mozilla / 5.0(Windows NT 10.0; Win64; x64)AppleWebKit / 537.36(KHTML、Geckoなど)Chrome / 99.0.4844.84 Safari / 537.36'、
'承認: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:ナビゲート'、
'Sec-Fetch-User:?1'、
'Sec-Fetch-Dest:ドキュメント'、
'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 + PktvLBJEV8MHcgGTw5ADVHkedUa3JTcVLHEDTyE01Nw6qsZtmjs __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)){
印刷"エラー:"。 curl_error($ ch);
出口();
}
エコー$response;
?>
答え :
解決策:
Curlを許可するのではなく、ヘッダー配列に Accept-Encoding:
ヘッダーを手動で設定しているため、Curlから未処理のGZIPを取得しています。扱う。次に、Curlは予期せずエンコードされた応答を受け取り、「わかりません。これに対処します」と表示されます。
リモート側に「このように処理したい」と言っていますが、実際にはローカル側に伝えていません。
簡単な修正:ヘッダー配列からAccept-Encoding:
ヘッダーを削除し、オプションでそれらのエンコード仕様をCURLOPT_ENCODINGに移動します
独自の回答で追加した設定ですが、curlはとにかく圧縮を優先するため、これは不要です。
手動で設定してはならないその他のヘッダー:
Host:
URLにホスト名以外の値が必要な場合を除き、不要Connection:
クライアントは注意する必要がありますUpgrade-Insecure-Requests:
クライアントは、ブラウザ固有であることに注意する必要があります
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。