0

curl-phpを使用して2sharedにログインしようとしていますが、何らかの理由でログインページが返され、Cookieファイルに適切なCookieが設定されません。以下は私のコードです。助けてくれてありがとう。

$user = "";
$pass = "";
$cookie = "cookie.txt";

$jsonp = 'jsonp'.time();

if (file_exists($cookie)) {
    unlink($cookie);
}

$post = array(
    "login" => $user,
    "password" => $pass,
    "callback" => $jsonp
);

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, "http://www.2shared.com/login?callback=".$jsonp);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('X-Requested-With: XMLHttpRequest'));
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);    
curl_setopt($ch, CURLOPT_REFERER, 'http://www.2shared.com/');       
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0");
curl_setopt($ch, CURLOPT_ENCODING, "UTF-8" );

$return = curl_exec($ch);
curl_close($ch);

echo $return;

編集:

ブラウザ経由でログインし、HTTPアナライザー経由でトラフィックを監視すると、ログインボタンを押した後にこのデータが返され、loginRedirectオブジェクトにリダイレクトされ、php-curlリクエストの実行中に表示されないCookieが設定されていることに気付きました。

{
    "ok":true,
    "rejectReason":"",
    "loginRedirect":"http://www.2shared.com/account/homeDoorway.jsp;jsessionid=3F253C7C641C7A8402D4AC9872C1CEAE.dc282?rand=0.8112776952920494",
    "loggedIn":"myemail@email.com",
    "needActivation":false
}

しかし、上記のコードでcurl-phpを使用してログインしようとすると、次のデータが返されます。

jsonp1339804887({
    "ok":true,
    "rejectReason":"",
    "loginRedirect":"http://www.2shared.com/login.jsp?sessionUnavailable=1",
    "loggedIn":"",
    "needActivation":false
}) 
4

2 に答える 2

2

Webスクレイピングを行うときはいつものように、重要なのは、ブラウザーを使用して手動で実行された記録されたセッションと比較することです(LiveHTTPHeadersまたは同様のツールなど)。次に、スクリプトが記録されたものとできるだけ類似したリクエストを送信していることを確認します。

もしあなたがそれをしていたら、あなたはそれを見たでしょう...

2sharedのログインフォームはマルチパートフォームポストを使用していないようです。そのため、$arrayをCURLOPT_POSTFIELDSに渡すのは間違っています。単に「login=$ name&password =$secret」の形式の文字列である必要があります。とはいえ、これがあなたのアプローチの唯一の欠陥ではないかもしれません。

于 2012-06-26T08:06:14.740 に答える
0

これは暗闇の中でほんの短いかもしれませんが、実際にはリダイレクトを見てそれに従う必要があるように私には思えます。エラーメッセージは、サーバー側で実際に機能しているセッション内にいないことを示しています。セッションIDは、リダイレクトされたがフォローしないことを選択したアドレスの一部です。;jsessionid=3F253C7C641C7A8402D4AC9872C1CEAE.dc282後者の部分?rand=0.8112776952920494が表示されます–私には!–乱数にするために、システムも送り返したいと考えています。これを簡単なトークンメカニズムと見なして、リクエストが実際に新鮮であり、取得しようとするスクリプトのようなものではないことを確認します:-)

また、(時間とともに)使用するコールバックメカニズムが非常に理にかなっていると確信していますか?

リダイレクトがポップアップするのを見て、そこから他のコードを開始して、無邪気にログインページにアクセスしようとしましたか?

于 2012-06-26T08:15:14.677 に答える