1

Web サイトからデータを取得する Web クローラーの作成に取り組んでおり、ほぼホーム ステッチですが、問題が発生しました。正常にログイン/Cookie を取得できますが、この方法でログインすると Web サイトが異常な反応を示します。(スクリーンショット参照)

ページが最初に読み込まれると、Cookie が役に立たなくなったように見えます (Cookie はまだ存在します。確認しました)。私が間違っていることを知っている人はいますか?同様の問題を調べてみましたが、役に立ちませんでした。

コード:

<?
session_write_close();
$ch = curl_init();
curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
curl_setopt ($ch, CURLOPT_COOKIEJAR, getcwd().'/cookie.txt');
curl_setopt ($ch, CURLOPT_COOKIEFILE, getcwd().'/cookie.txt');
curl_setopt($ch, CURLINFO_HEADER_OUT, true);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_REFERER, "http://www.callofduty.com/"); 
curl_setopt($ch, CURLOPT_URL,"https://profile.callofduty.com/elite/login");
curl_exec($ch);

curl_setopt ($ch, CURLOPT_REFERER, "https://profile.callofduty.com/elite/login"); 
curl_setopt($ch, CURLOPT_URL, 'https://profile.callofduty.com/elite/do_login');
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, 'j_username=USERNAME&j_password=PASSWORD');
echo "Initial Dump: <p>";
echo curl_exec($ch);

curl_setopt($ch, CURLOPT_URL,"https://elite.callofduty.com/career/xbox/54d10030cc86b1b9c3162b395d46bffe#/playercardmw3");
curl_exec($ch);
echo "<hr/>Second Dump: <p>";
var_dump(curl_getinfo($ch));
?>

注:別のバックグラウンド ウィンドウで定期的にログインすると、ページの動作が若干改善されます。読み込む情報は他にもあります。サーバー上のPHPスクリプトによってCookieが処理されないため、これは私を混乱させますか? O_o

--- 更新 --- さて、何も変更していないので理由はわかりませんが、サイトをロードすると、必要な情報がないだけで正常に見えます ( http://gyazo.com/e326f2f4cdac3e6a4a20fdc9afc62f2d. png?1340088915 )。ただし、ログアウトしていると表示されます。(注: ログアウト中はプロファイルを表示できません。強制的にログイン画面が表示されます)

リクエストのエコーと var_dump の両方の出力は次のとおりです

私が知る限り、Cookie を取得したにもかかわらず、サイトはまだ私がログアウトしていると認識しています。

前もって感謝します!

4

1 に答える 1

2

Web サイトの他の部分にジャンプするときに、このようなことを行うときに Cookie を指定する必要があります。

function login(){
   $ch = curl_init();
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);//add this line
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//add this line
   curl_setopt($ch,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US;  rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
   curl_setopt ($ch, CURLOPT_COOKIEJAR, getcwd().'/cookie.txt');
   curl_setopt ($ch, CURLOPT_COOKIEFILE, getcwd().'/cookie.txt');
   curl_setopt($ch, CURLINFO_HEADER_OUT, true);
   curl_setopt($ch, CURLOPT_HEADER, 1);
   curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt ($ch, CURLOPT_REFERER, "http://www.callofduty.com/"); 
   curl_setopt($ch, CURLOPT_URL,"https://profile.callofduty.com/elite/login");
   curl_exec($ch);

   curl_setopt ($ch, CURLOPT_REFERER, "https://profile.callofduty.com/elite/login"); 
   curl_setopt($ch, CURLOPT_URL, 'https://profile.callofduty.com/elite/do_login');
   curl_setopt ($ch, CURLOPT_POST, 1);
   curl_setopt ($ch, CURLOPT_POSTFIELDS, 'j_username=USERNAME&j_password=PASSWORD');
   echo "Initial Dump: <p>";
   echo curl_exec($ch);
}

function getPlayer(){
   login();

   $ch = curl_init();
   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
   curl_setopt($ch,  CURLOPT_URL,"https://elite.callofduty.com/career/xbox/54d10030cc86b1b9c3162b395d46bffe#/playercardmw3");
   curl_setopt ($ch, CURLOPT_COOKIEFILE, "cookies.txt");//add this line
   curl_exec($ch);
   echo "<hr/>Second Dump: <p>";
   var_dump(curl_getinfo($ch));
}

あなたのコードはめちゃくちゃなので、私はこれをテストしていませんが、試してみてください。

于 2012-07-21T11:33:49.350 に答える