我一直在讨论如何使用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答案 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; }
}
);
}