5

キャプチャで保護されたページでのログインの進行状況を自動化しようとしています。画像をテキストに翻訳するためにDeathByCaptchaを使用していますが、うまく機能しているようです。curlを使用してログインページを読み込み、キャプチャ画像のURLを取得してDBCに送信し、テキストを取得して、キャプチャテキストを含むPOSTリクエストをログインページに送信しています。

私が抱えている問題は、投稿リクエストを送信するとキャプチャ画像が変わることです。ブラウザを介してフォームをリロードしたり、間違って送信したりすると(同じ画像が何度も表示されます)、同じ動作が得られないため、問題はCookieまたは私がしている他の何かに関係していると思います。セッションに関連する欠落。

これは、データを取得してフォームを送信するために使用するコードです。

$ch = curl_init();  
// Not sure that I need it, just make sure that the session doesn't change...   
curl_setopt($ch, CURLOPT_COOKIESESSION, false);
curl_setopt($ch, CURLOPT_URL, $loginUrl);
// It seems that PHPSESSID cookie parameter might be the parameter that keep the image the same, but it didn't work. I even read it dynamically from the cookie file but it still didn't work
//curl_setopt($ch, CURLOPT_COOKIE, "PHPSESSID=2bp3nhkp3bgftfrr1rjekg03o2");
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieName);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieName);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_REFERER, $loginUrl);
$result = curl_exec($ch);

// Resolve the captcha and append it to the post parameters
$captchaText = $this->resolveCaptcha($result);
$postData .= '&LoginForm%5BverifyCode%5D='.$captchaText;

// Resubmit the form with the updated form data
curl_setopt($ch, CURLOPT_REFERER, $loginUrl);           
curl_setopt($ch, CURLOPT_URL, $loginUrl);
curl_setopt ($ch, CURLOPT_POST, 1); //FIXED
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postData);           
$result = curl_exec($ch);

最終結果を印刷すると、キャプチャテキストは正常に送信されましたが、画像自体が変更されていることがわかります...

また、標準のFirefoxセッションでTamperでキャプチャされたリクエストパラメータのスクリーンショットを添付しています(何かが足りない場合は誰かが気付く可能性があります)。

ブラウザリクエストパラメータ

PHP / curl送信コードは、キャプチャベースではないサイトで完全に機能しているため、POSTパラメーターの送信は機能しているようです。

ここで非常に基本的なものが欠けている可能性があります。どんな助けでも大歓迎です。

私もこれらの投稿を調べましたが、探している答えが見つかりませんでした。

CURLがキャプチャとセッションでログインする方法

キャプチャを取得してPHPcURLでセッションを保存する方法は?

https://stackoverflow.com/questions/8633282/curl-to-download-a-captcha-and-submit-it

4

1 に答える 1

5

あなたが使っている

curl_setopt ($ch, CURLOPT_POST, 0);

2番目のcurl_execで。そうであってはならない

curl_setopt ($ch, CURLOPT_POST, 1);

?

于 2012-05-20T14:15:47.313 に答える