電話番号を検索するサイトがあります。 から検索するには、php script
またはcurl command
のいずれかを作成する必要があります。php cURLクッキーが渡されません
検索ページにアクセスすると、結果を取得するための「セッション」Cookieが作成されます。結果ページで、Cookieが見つからないか間違った情報が含まれている場合、検索結果が得られません。
Cookieを取得するために検索ページにアクセスしたとしたら、post
というCookieが、結果のページに必要な検索パラメータとともに表示されます(検索ページのフォームアクションではそれを示しています)。
最初の部分が行われます。
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://www.eofcom.admin.ch/eofcom/public/searchEofcom_InaFree.do');
curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_VERBOSE, true);
$result = curl_exec($curl);
curl_close($curl);
preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $result, $matches);
$cookiesStringToPass = '';
$cookies = array();
foreach($matches[1] as $item) {
parse_str($item, $cookie);
$cookies = array_merge($cookies, $cookie);
}
$cookiesStringToPass = '';
foreach ($cookies as $name=>$value) {
if ($cookiesStringToPass) {
$cookiesStringToPass .= ';';
}
$cookiesStringToPass .= $name . '=' . addslashes($value);
}
// $cookiesStringToPass now contains the cookie names and values
または使用してファイルに保存する:私はどちらかのヘッダを解析し、クッキーをつかむことができています
curl_setopt($curl, CURLOPT_COOKIEJAR, dirname(__FILE__).'/cookies.txt');
curl_setopt($curl, CURLOPT_COOKIEFILE, dirname(__FILE__).'/cookies.txt');
これまでのところは良いです。今度は、結果を得るために情報を提出/投稿する必要がある2番目の部分(検索するものとは別のページです)では、起こっていないCookieの名前/値を渡す必要があります。どちらか私はこのように、header
で明示的にcookie
を設定します。
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "https://www.eofcom.admin.ch/eofcom/public/listEofcom_InaFree.do");
curl_setopt($curl, CURLOPT_HTTPHEADER, array(
'Cookie: '.$cookiesStringToPass,
'Content-Type: application/x-www-form-urlencoded'
));
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, "nrt=2&pnp=000221&doSearchFreeByNumber=Search");
curl_setopt($curl, CURLOPT_COOKIESESSION, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION,0);
curl_setopt($curl, CURLOPT_HEADER , 1);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
$result = curl_exec($curl);
curl_close($curl);
または私は前に生成されたファイルを設定します。
curl_setopt($curl, CURLOPT_COOKIEFILE, dirname(__FILE__).'/cookies.txt');
結果は同じである。別のクッキーが生成されます。値が異なるので、結果は得られません。
同じセッションで動作しようとしました(最初の要求の後にカール接続を閉じることはありません)。私は、接続が閉じられるまでクッキーファイルが作成されていないこと、また、curl_setopt
の順番が重要であることを知っています。それでも、ブラウザからはうまく動作します。
何か起きていることを教えてもらえますか?なぜクッキーが設定されていない(または無視されますか?!...)?それはhttps
リクエストであっても、何らかの証明書などが必要であることに気づいていません。その場合、おそらくリクエストはページを返さず、それについて不平を言います。
ありがとうございます。
編集:は、言及するのを忘れてしまった私はまた、成功せず
curl_setopt($curl, CURLOPT_COOKIE, $cookiesStringToPass);
を使用することを試みました。
編集2:はまた、それがサーバから来ているように、全体header
を再構築しようとした、とも無駄に、referrer
を含めることを試みました。
curl -v -L -b headers --data "nrt=2&pnp=000991&doSearchFreeByNumber=Search" https://www.eofcom.admin.ch/eofcom/public/listEofcom_InaFree.do > ab.html
まだ結果ページにPOST
に、その後
curl -v --dump-header headers https://www.eofcom.admin.ch/eofcom/public/searchEofcom_InaFree.do > aa.html
し、それを再利用:検索ページからヘッダーをダンプするコマンドラインから、:
編集3今回はクッキーが正しく設定されている、同じ、間違った結果を生成します。
'curl_setopt($ curl、RETURN_TRANSFER、1);'可能性があります。 – McStuffins
@ロバートは、すでにそれも試みた。 'CURLOPT_RETURNTRANSFER'は実際には出力のみを変数に転送します。しかし、ありがとう。 –