2009-06-09 3 views
5

저는 Perl을 처음 접했고 일부 프로젝트를 자동화하려고 노력하면서 배우고 있습니다. 지금까지 그 재미는 많이있었습니다.어떻게 WWW :: Mechanize를 사용하고 디버그합니까?

고객 용 보고서를 생성하려고합니다. 내가 액세스 할 수있는 웹 페이지에서이 보고서를 얻을 수 있습니다. 먼저 내 사용자 이름, 암호로 양식을 작성하고 드롭 다운 목록에서 서버를 선택하고 로그인해야합니다. 두 번째로 보고서 섹션에 대한 링크를 클릭해야합니다. 세 번째로 보고서를 작성할 양식을 작성해야합니다. 여기

내가 지금까지 쓴 것입니다 :

나는이 후에 내가 출력을 덤프 무엇을보고 내가 보라 동안 나는 첫 번째 로그인 페이지의 코드를 참조 이유를 이해하지만, 그나마
my $mech = WWW::Mechanize->new(); 
my $url = 'http://X.X.X.X/Console/login/login.aspx'; 

$mech->get($url); 

$mech->submit_form(
    form_number => 1, 
    fields  =>{ 
     'ctl00$ctl00$cphVeriCentre$cphLogin$txtUser' => 'someone', 
     'ctl00$ctl00$cphVeriCentre$cphLogin$txtPW' => '12345', 
     'ctl00$ctl00$cphVeriCentre$cphLogin$ddlServers' => 'Live', 
    button => 'Sign-In' 
    }, 
); 
die unless ($mech->success); 

$mech->dump_forms(); 

성공적인 로그인 후 다음 페이지에 도달 했어야합니다.

저와 로그인 시도에 영향을 줄 수있는 쿠키가있을 수 있습니까?

다른 사람은 내가 잘못하고 있습니까?

당신은 당신이 알고있는 물건을 기계화 할 수 Yaniv에게

답변

2

, 당신이 도움을 주셔서 감사합니다. 더 이상 코드를 작성하기 전에 Firebug와 같은 도구를 사용하고 수동으로이 작업을 수행 할 때 브라우저에서 무슨 일이 일어나고 있는지 확인하는 것이 좋습니다.

물론 쿠키가 사용되었을 수 있습니다. 또는 숨겨진 양식 매개 변수를 잊어 버렸습니까? 당신 만이 말할 수 있습니다.

편집 :

  • WWW : : 기계화가 더 개입없이 쿠키의주의를 기울여야한다.
  • 호출 한 메서드가 성공적인지 여부를 항상 확인해야합니다. 첫 번째 get()이 작동합니까?
  • 실제로 요청 된 내용과 응답으로 전송 된 HTTP 상태 코드를 보려면 서버 로그를 살펴 보는 것이 유용 할 수 있습니다.
+0

Thanx Manni. 방화범이 끌리지 만 정확히 무엇을 찾아야할지 모르겠습니다. 쿠키는 어디에서 확인합니까? 나는 모든 매개를 보았고 숨은 것이 없다. –

+0

"Net"이라는 탭을보십시오. 쿠키를 포함하여 서버가 보낸 모든 HTTP 헤더를 표시합니다. GET HTTP : //XXXX/Console/login/login.aspx 수락 - 인코딩 : – innaM

+0

이 난 내 코드에서 가져온 것입니다 GZIP, X-GZIP, 사용자 에이전트를 수축 : 직접 libwww - 펄/5.822 (콘텐츠 없음) HTTP/1.1 200 OK 캐시 제어 : 개인 연결 : 가까운 날짜 : 2009년 (월) 6월 8일 그리니치 표준시 15시 08분 32초 서버 : 마이크로 소프트 IIS/6.0 콘텐츠 길이 : 14,720 콘텐츠 - 유형 : text/html; charset = utf-8 클라이언트 - 날짜 : 2009 년 6 월 8 일 월요일 15:08:32 GMT 클라이언트 - 피어 : X.X.X.X : 80 클라이언트 - 응답 - 번호 : 1 –

6

사실 몇 달이 지난 후에도 비슷한 질문을 토대로 동일한 문제를 해결했습니다. 자세한 내용은 Is it possible to automate postback from the client side?을 참조하십시오.

필자는 Python의 Mechanize 대신 또는 Perl을 사용했지만 동일한 원칙이 적용됩니다.

ASP.NET 페이지는 당신이 일반적으로 기계화 사용할 때 존재하지 않습니다 __EVENTTARGET 형태라는 숨겨진 매개 변수를 필요 : 내 이전 응답을 요약

.

일반 사용자가 방문했을 때 이러한 링크에는 각 링크의 javascript onclick 이벤트를 통해 __EVENTTARGET에 관련 값을 제공하는 __doPostBack ('foo') 함수가 있지만 mechanicalize는 javascript 이 값들을 직접 설정해야합니다.

python 솔루션은 아래에 있지만 perl에 적용하기가 너무 어렵지는 않습니다.

def add_event_target(form, target): 
    #Creates a new __EVENTTARGET control and adds the value specified 
    #.NET doesn't generate this in mechanize for some reason -- suspect maybe is 
    #normally generated by javascript or some useragent thing? 
    form.new_control('hidden','__EVENTTARGET',attrs = dict(name='__EVENTTARGET')) 
    form.set_all_readonly(False) 
    form["__EVENTTARGET"] = target 
+0

나는 이것을 시도했지만 내 문제는 여전히 작동하지 않는다. Firebug는 또 다른 매개 변수 (__EVENTARGUMENT)도 전달되었음을 보여줍니다. 나는 그 둘 모두와 __EVENTTARGET 하나를 추가했으나 그들은 무시당하는 것처럼 보입니다 - 나는 항상 같은 결과를 얻습니다 (나는 페이징을 위해 이것들을 필요로합니다 - 후속 페이지에 접근). –

+0

@HD : 양식 제출을 통해 귀하의 페이지에 도달 했습니까? (예를 들어 "위젯 검색"기능을 사용하면 페이지 목록의 결과를 얻을 수 있습니다.) 양식을 사용하여 페이지에 접속 한 경우 __VIEWSTATE를 너무 오래 사용하면 처리가 까다로워 질 수 있습니다. 당신이 링크를 보낼 수 있다면 나는 그것을 보일지도 모른다. – anschauung

+0

@HD : 또한 일부 사이트에서는 외부의 폼 값을 제거해야한다. select_form을 사용하여 모든 필드 값을 볼 수 있으며 원하는 언어가 배열 요소를 삭제하는 데 사용하는 방법으로 제거 할 수 있습니다. (예 : python에서 .pop()) 불행히도 시행 착오 만이 이러한 요소의 위치를 ​​찾는 유일한 방법입니다. – anschauung

0

가 일반 aspxform에서 "__"접두사 변수의 몇 내에서 로컬 세션의 모든 정보를 유지하는 것이 영문 페이지를의 매우 짧은 요점. 일반적으로 이것은 최상위 양식이며 모든 양식 요소가 그 일부가 될 것이지만 구현에 따라 다를 수 있습니다. 특히 나는이 상태 변수의 2에 대해 걱정할 필요에 내가 처리 된 특정 구현을 위해

:

__VIEWSTATE 
__EVENTVALIDATION. 

당신의 목표는 이러한 변수는 제출 양식에 제출되어 있는지 확인하는 것입니다, 그것들은 위에서 언급 한 aspxform의 주요 폼의 일부일 수 있기 때문에 아마 다른 폼을 제출할 것입니다.

브라우저가 aspx 페이지를로드 할 때 자바 스크립트 조각은 ASP 서버/클라이언트 상호 작용 내에서이 세션 정보를 전달하지만 당연히 perl mechanize로 고급 스러움을 갖지 않으므로 수동으로 게시해야합니다 이것들은 mechanize를 사용하여 현재 폼에 요소를 추가함으로써 가능합니다. 난 그냥 기본적으로 이런 짓을 해결하는 경우

:

my $browser = WWW::Mechanize->new(); 

# fetch the login page to get the initial session variables 
my $login_page = 'http://www.example.com/login.aspx'; 
$response = $browser->get($login_page); 

# very short way to find the fields so you can add them to your post 
$viewstate = ($browser->find_all_inputs(type => 'hidden', name => '__VIEWSTATE'))[0]->value; 
$validation = ($browser->find_all_inputs(type => 'hidden', name => '__EVENTVALIDATION'))[0]->value; 

# post back the formdata you need along with the session variables 
$browser->post($login_page, [ username => 'user', password => 'password, __VIEWSTATE => $viewstate, __EVENTVALIDATION => $validation ]); 

# finally get back the content and make sure it looks right 
print $response->content(); 
2

는 Windows에있는 경우 수동으로이 과정을 수행 할 때 전송되는 데이터를 보려면 Fiddler를 사용한 다음에 피들러를 사용 스크립트로 수행 할 때 캡처 한 데이터와 비교하십시오.

내 경험에 의하면 양식 게시를 검사 할 때 방화범보다 Fiddler과 같은 웹 디버깅 프록시가 더 유용합니다.

1

WWW::Mechanize으로 웹 자동화를 작성할 때 Wireshark 유틸리티를 사용하는 것이 매우 유용하다는 것을 알게되었습니다. 몇 가지 방법으로 도움이 될 것입니다 :

  1. HTTP 요청의 성공 여부를 알 수 있습니다.
  2. HTTP 수준에서 실패한 이유를 확인하십시오.
  3. 서버로 전달한 정확한 데이터를 추적하고 수신 한 정보를 확인하십시오.

네트워크 트래픽에 대한 HTTP 필터를 설정하고 Perl 스크립트를 시작하기 만하면됩니다.

관련 문제