2011-08-12 115 views
2

我試圖自動從首先要求驗證碼的網站收集鏈接。 爲此,我捕獲驗證碼圖像以便可以在外部解決,然後將解決方案作爲表單字段的一部分提交。 不知何故,它不起作用。我懷疑是一個餅乾問題,但我不確定,如果有人可以弄清楚這一點,將不勝感激。Perl WWW ::機械化cookie問題

這是代碼。首先,我創建了機甲對象連同它的餅乾罐:

$cookie_jar = HTTP::Cookies->new; 
$agent = WWW::Mechanize->new(cookie_jar => $cookie_jar); 
$agent->get("http://www.site.com/page.html"); 

我找到感興趣的鏈接:

$link = $agent->find_link(tag => "a", text_regex => qr{regex}); 
$url = $link->url; 
$agent->get($url); 

在這個階段,網站提供驗證碼。我提取圖像和保存,以便它可以由一個人來解決,然後進入解決方案繼續:

$captcha = $agent->find_image(url_regex => qr{captcha\.php}); 
$agent->get($captcha->url, ':content_file' => 'captcha.jpg'); 
print "Please solve captcha at http://my.own.site/captcha.jpg\n"; 
$agent->back; 
print "Enter answer: "; 
$solved = <>; 

現在,腳本的驗證碼解決方案手動輸入,也可以通過提交表單繼續:

$agent->form_with_fields('code'); 
$agent->set_fields(code => $solved, action => 'download'); 
$agent->submit; 

但是這不起作用。結果是頁面再次詢問驗證碼,而不是預期的頁面和我之後的信息。

我想知道當我在保存驗證碼圖片後執行$ agent-> back時cookie是否丟失/重置?

感謝您的任何提示!

回答

1

我發現了一個更簡單的方法來處理這個問題。那就是:

  1. 親臨現場與網絡瀏覽器
  2. 解決驗證碼
  3. 打開生成的cookie,並注意會話ID
  4. 然後在腳本,設置cookie與會話ID

工程就像一個魅力。

$phpsessid = '4d93c8f247b49780'; 
$cookie_jar = HTTP::Cookies->new; 
$agent = WWW::Mechanize->new(cookie_jar => $cookie_jar); 
$agent->get($url); 
$cookie_jar->clear; 
$cookie_jar->set_cookie(undef, "SESSIONID", $sessionid, "/", $domain, undef, 1, 0, undef, 1); 
1

您訪問的網站很有可能檢測到並阻礙了免費網上衝浪;這意味着,例如,返回一個或多個頁面,然後再轉發。這通常是通過將每個頁面關聯到一個唯一的ID來完成的,這樣,當您提交i​​d兩次時,很顯然你會回來然後從那裏再次移動。正如你所說,這與使用back有關。

我在想什麼,如果你真的需要去back。關鍵是在代理的外部之外下載圖像,以便代理狀態不會被修改。您可以使用第二個代理或curl,因爲您有圖像的直接URL ...

+0

感謝您的意見。我不是他們會使用一個唯一的ID,但會驗證。然而,圖片的網址是動態的(captcha.php),所以讓它在外面不起作用。 – emx