如何使用Perl实现带JS加密逻辑的网站自动登录功能
Perl实现目标站点自动登录方案
你不需要引入JS运行环境即可完成登录逻辑复现,JS代码中调用的md5()为标准MD5哈希算法,直接使用Perl原生模块即可实现:
- 实现步骤:
- 用
WWW::Mechanize请求登录页面,提取submitForm表单中隐藏字段nonceA的实时值,该值为服务端生成的一次性校验值,每次访问登录页都会更新,不可硬编码使用 - 按照JS逻辑拼接待加密字符串:
用户名 + ":" + 密码 + ":" + nonceA值 - 对上述字符串计算MD5十六进制哈希值
- 构造最终提交的
encoded参数值:用户名 + ":" + 上一步得到的MD5哈希值 - 向
submitForm的提交地址发送POST请求,携带encoded、nonceA、URL三个参数即可完成登录
- 用
- 参考代码:
use strict; use warnings; use WWW::Mechanize; use Digest::MD5 qw(md5_hex); # 初始化爬虫对象 my $mech = WWW::Mechanize->new(autocheck => 1); # 替换为实际登录页面地址 my $login_page_url = 'https://你的站点登录页地址'; $mech->get($login_page_url); # 提取服务端返回的nonceA值 my $nonceA = $mech->value('nonceA'); # 替换为实际账号密码 my $username = 'admin'; my $password = '你的登录密码'; # 计算MD5哈希 my $raw_hash_str = $username . ':' . $password . ':' . $nonceA; my $md5_result = md5_hex($raw_hash_str); # 构造encoded参数 my $encoded_param = $username . ':' . $md5_result; # 提交登录请求 $mech->submit_form( form_name => 'submitForm', fields => { encoded => $encoded_param, nonceA => $nonceA, URL => '/' } ); # 输出登录后页面内容验证结果 print $mech->content;
- 异常排查:
- 如果提交后提示密码错误,先确认站点JS的MD5输出为大写还是小写,若为大写则将
md5_hex($raw_hash_str)替换为uc(md5_hex($raw_hash_str))即可 - 若表单未设置name属性,可通过
form_number参数指定表单序号提交
- 如果提交后提示密码错误,先确认站点JS的MD5输出为大写还是小写,若为大写则将
内容的提问来源于stack exchange,提问作者Tomek
相关产品推荐
相关产品推荐

