2016-08-08 9 views
0

電話番号を検索するサイトがあります。 から検索するには、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今回はクッキーが正しく設定されている、同じ、間違った結果を生成します。

+0

'curl_setopt($ curl、RETURN_TRANSFER、1);'可能性があります。 – McStuffins

+0

@ロバートは、すでにそれも試みた。 'CURLOPT_RETURNTRANSFER'は実際には出力のみを変数に転送します。しかし、ありがとう。 –

答えて

0

問題はCookieに関連していませんでした。 第2セッションIDが、フォームのアクションでjavascriptによってgetパラメータの形式で設定されました。一度それを渡すと、すべて期待どおりに働いた。

+0

こんにちはAndrew、私は同じ問題を抱えています。どこかに作成されている2番目のセッションがあります。それを把握する方法や作成方法を見つけることができませんでした...あなたは私に助けを与えることができますか?お返事ありがとうございます – Kitara

+0

ごめんなさい、あなたがすでにそれを理解していない場合、いくつかの詳細をご提供します。私たちは話す別の場所を見つけて、SOはチャットのためではありません。または、質問を投稿し、ここにリンクを書きたいと思うかもしれません。 –

+0

私はそれを理解することができました!ありがとう! – Kitara

関連する問題