2012-02-21 1 views
1

기존 스크립트에서 LWP :: UserAgent 또는 WWW :: Mechanize를 사용하여 Perl에서 복제하려고하는 코드가 있습니다.Perl에서 Nest Thermostat 사이트의 POST 웹 인증 (Ruby 변환 시도)

original script은 실제로 내가 원하는 것 이상을 수행합니다. 나는 Nest 웹 사이트 (도움이 필요한 부분)에 로그인하고 역사적인 로깅을위한 일부 데이터를 분석하고 싶습니다. (저는 잘했습니다).

내 현재 스크립트는 작동 할 것으로 예상되지만, Ruby 예제의 authResult/access_token이 실제로 Perl 모듈에서 이해하고 사용했는지 확실하지 않습니다.

펄에 내 코드 :

#!/usr/bin/perl 

use WWW::Mechanize; 
#use HTTP::Request::Common qw(POST); 
use HTTP::Cookies; 
use LWP::UserAgent; 
use Data::Dumper; 
use CGI; 

my $email; #stores our mail 
my $password; #stores our password 
my $user_agent = 'Nest/1.1.0.10 CFNetwork/548.0.4'; 

$email = "[email protected]"; 
$password = "mypassword"; 

my @headers = (
    'User-Agent' => 'Nest/1.1.0.10 CFNetwork/548.0.4', 
    'X-nl-user-id' => $email, 
    'X-nl-protocol-version' => '1', 
    'Accept-Language' => 'en-us', 
    'Connection' => 'keep-alive', 
    'Accept' => '*/*' 
); 

# print "Content-type: text/html\n\n"; 

my $cookie = HTTP::Cookies->new(file => 'cookie',autosave => 1,); 

my $browser = WWW::Mechanize->new(cookie_jar => $cookie, autocheck => 1,); 

# tell it to get the main page 
$browser->get("https://home.nest.com/user/login"); 

print Dumper($browser->forms); 

# okay, fill in the box with the name of the 
# module we want to look up 
$browser->form_number(1); 
$browser->field("username", $email); 
$browser->field("password", $password); 
$browser->submit(); 
print $browser->content(); 

내가 양식을 제출하면, 난 그냥 같은 페이지가 나에게 다시 돌려 받고, 나는 정확히 둥지 내가 '무엇을 좋아하지 않는 원인을 모르는 제출. 형태로 두 개의 추가 필드는에 있습니다 로그인 페이지 :

  'inputs' => [ 
         bless({ 
           'maxlength' => '75', 
           '/' => '/', 
           'value_name' => 'E-mail address', 
           'name' => 'username', 
           'id' => 'id_username', 
           'type' => 'text' 
           }, 'HTML::Form::TextInput'), 
         bless({ 
           '/' => '/', 
           'value_name' => 'Password', 
           'name' => 'password', 
           'id' => 'id_password', 
           'type' => 'password', 
           'minlength' => '6' 
           }, 'HTML::Form::TextInput'), 
         bless({ 
           'readonly' => 1, 
           '/' => '/', 
           'value_name' => '', 
           'value' => '', 
           'name' => 'next', 
           'type' => 'hidden' 
           }, 'HTML::Form::TextInput'), 
         bless({ 
           'readonly' => 1, 
           '/' => '/', 
           'value_name' => '', 
           'value' => 'dbbadca7910c5290a13d30785ac7fb79', 
           'name' => 'csrfmiddlewaretoken', 
           'type' => 'hidden' 
           }, 'HTML::Form::TextInput') 

내가 각 제출에 csrfmiddlewaretoken 값을 사용해야합니까? 그것은 변화하는 것처럼 보입니다. 나는 성공적인 로그인시 쿠키를 얻는 것으로 충분하다고 생각했습니다.

내가 잘못하고있는 것에 대한 제안 사항이 있으십니까? 파란색에서

+1

사이트가 실제로 사용자 지정 클라이언트를 고집하지 않으면이 작은 코드가 작동해야합니다.'use WWW :: Mechanize qw(); 내 $ w = WWW :: Mechanize-> new; $ w-> get ('https://home.nest.com/accounts/login/'); $ w-> submit_form (with_fields => {username => 'theusername @ example', password => 'thepassword'}); '계정이 없으므로 테스트 할 수 없습니다. - 실패하면 Wireshark를 사용하여 Mechanize에서 성공한 HTTP 트랜잭션과 실패한 트랜잭션을 기록하고 비교하여 정확한 차이점을 찾습니다. 아마도 Ruby에서 번역 할 수있는 사람을 기다리는 것이 더 빠를 것입니다. – daxim

답변