2014-05-18 2 views
0
내가 웹 사이트에 로그인하는 방법을 통해 잠시 동안 수수께끼 된

:펄하십시오 HTTPS에 로그인 자바 스크립트 웹 사이트

my $login = "https://steamcommunity.com/login/home/?goto=market%2F"; 
my $username = "USR"; 
my $password = "PASS"; 
my $mech = WWW::Mechanize->new(); 
$mech->cookie_jar(HTTP::Cookies->new()); 
$mech->get($login); 
$mech->form_name('loginForm'); 
$mech->field(login => $username); 
$mech->field(passwd => $password); 
$mech->click(); 

I : https://steamcommunity.com/login/home/?goto=market%2F 펄 스크립트를 사용하지만 WWW : : 기계화를 사용하여 프로그램을 작성 후 Mechanize가 javascript 웹 사이트를 지원하지 않는다는 것을 알았습니다.이 시점에서 나는 도움을 청하거나 제안을 정말 기뻐할 것입니다. :)

미리 감사드립니다. 셉 모리스

+1

증기가 [API]을 제공하고있다 (http://steamcommunity.com/dev). – jordanm

답변

0

은 기본적으로 기계화는 JS를 지원하지 않지만, 자바 스크립트 :: SpiderMonkey를하고 WWW : : 기계화 : PluginJavascript 같은 것이있다.

그러나 웹 사이트에서 JS를 찾아 일반 바닐라 Mechanize로 그 동작을 모방하는 것이 더 쉬울 것이라고 생각합니다.

DoLogin JS는 그렇게 복잡하지 않으므로이를 기반으로 Mechanize 논리를 계속 작성할 수 있습니다. https://steamcommunity.com/public/javascript/login.js?v=264288658&

function DoLogin() 
{ 
var form = document.forms['logon']; 

var username = form.elements['username'].value; 
username = username.replace(/[^\x00-\x7F]/g, ''); // remove non-standard-ASCII characters 

var password = form.elements['password'].value; 
password = password.replace(/[^\x00-\x7F]/g, ''); // remove non-standard-ASCII characters 

if (g_bLoginInFlight || password.length == 0 || username.length == 0) 
    return; 

g_bLoginInFlight = true; 
$('login_btn_signin').hide(); 
$('login_btn_wait').show(); 

new Ajax.Request('https://steamcommunity.com/login/getrsakey/', 
    { 
     method: 'post', 
     parameters: { 
      username: username, 
      donotcache: (new Date().getTime()) 
     }, 
     onSuccess: OnRSAKeyResponse, 
     onException: function(req, e) { throw e; } 
    } 
); 
} 

편집 : 여기서 RSA 키 기능 코드

function OnRSAKeyResponse(transport) 
{ 
var results = transport.responseJSON; 
if (results.publickey_mod && results.publickey_exp && results.timestamp) 
{ 
    var form = document.forms['logon']; 

    var pubKey = RSA.getPublicKey(results.publickey_mod, results.publickey_exp); 
    var username = form.elements['username'].value; 
    username = username.replace(/[^\x00-\x7F]/g, ''); // remove non-standard-ASCII characters 
    var password = form.elements['password'].value; 
    password = password.replace(/[^\x00-\x7F]/g, ''); // remove non-standard-ASCII characters 
    var encryptedPassword = RSA.encrypt(password, pubKey); 
    new Ajax.Request('https://steamcommunity.com/login/dologin/', 
     { 
      method: 'post', 
      parameters: { 
       password: encryptedPassword, 
       username: username, 
       emailauth: form.elements['emailauth'].value, 
       loginfriendlyname: form.elements['loginfriendlyname'].value, 
            captchagid: form.elements['captchagid'].value, 
       captcha_text: form.elements['captcha_text'].value, 
       emailsteamid: form.elements['emailsteamid'].value, 
       rsatimestamp: results.timestamp, 
       remember_login: (form.elements['remember_login'] && form.elements['remember_login'].checked) ? 'true' : 'false', 
       donotcache: (new Date().getTime()) 
      }, 
      onSuccess: OnLoginResponse, 
      onException: function(req, e) { throw e; } 
     } 
    ); 
} 
+0

정말 고마워요. 정말 도움이됩니다. – user3648548

+0

Perl이 아니기 때문에 이것을 어떻게 구현해야하는지 알고 있습니까? – user3648548

+0

높은 수준의 계획 만 설명 할 수 있지만 JS 논리를 잘 이해해야합니다. 첫 번째 단계에서는 LWP :: UserAgent와 같은 것을 사용하여 Ajax에서 URL에 게시하여 서버에서 공개 RSA 키를 가져와야합니다. 그런 다음 OnRSAKeyResponse 기능에 제공된대로 암호를 암호화하고 두 번째 전화를해야합니다. Perl에는 RSA 암호화 기능이 있습니다. 모든 것이 너무 복잡해 보인다면 위에 언급 한 JS 플러그인으로 시작해야 할 것입니다. 나는 TDAmeritrade에 로그인을 기계화 할 수 있었지만 몇 가지 노력이 필요했습니다 : sf.net/projects/stock-pager –

관련 문제