Perl:登录HTTPS javascript网站

时间:2014-05-18 15:15:16

标签: javascript perl login login-script

我一直在讨论如何使用perl脚本登录网站:https://steamcommunity.com/login/home/?goto=market%2F,但是在使用WWW :: Mechanize编写程序之后:

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();

我发现Mechanize不支持javascript网站,此时我很难过,任何帮助或建议都会非常感激:)。

提前感谢您的时间。

Seb Morris

1 个答案:

答案 0 :(得分:0)

默认情况下,Mechanize不支持JS,但有一些东西,比如JavaScript :: SpiderMonkey和WWW :: Mechanize :: PluginJavascript。

但是,我认为,在网站上找到JS并通过简单的vanilla模仿其行为会更容易。

在您的情况下,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; }
        }
    );
} 
相关问题