酒店热点狂欢
2024年3月26日保罗·科克伦
有没有在酒店住过,因为总是要开门而感到恼火用于无线访问的浏览器?是的,我也是。最近的一个例子特别令人沮丧,我不得不拿出我最喜欢的瑞士陆军链锯为了使我的生活轻松了一点。
形势
所以,背景故事是我住在山上的一家酒店几天。就像这些天的幸运情况一样,这家酒店有无线接入。但奇怪的是,每个房间有单独的用户名和密码。“够公平的了”,我想,马上打开我的笔记本电脑,然后打开Firefox,输入我的登录数据以获取等待已久的连接。使用Firefox(或其他浏览器matter)是必需的,因为登录页面是通过俘虏门户.你就是这样当您在您的浏览器:
很好,我想,然后愉快地继续我的一天。
这个问题
第二天问题开始了。起床醒来后笔记本电脑,我无法阅读电子邮件,或在上阅读聊天内部控制室,通过查看我的消息信号,或使用互联网全部的.
也,发出砰的声响
向我打招呼禁止目的地网络
:
$ping网站www.heise.dePING www.heise.de(193.99.144.85)56(84)字节的数据。从登录.hotspot.lan(192.168.168.1)icmp_seq=1禁止目的地网络从logout.hotspot.lan(192.168.168.1)icmp_seq=2目标网络禁止从logout.hotspot.lan(192.168.168.1)icmp_seq=3目标网络禁止^C类---www.heise.de ping统计---发送3个数据包,0个接收,+3个错误,100%数据包丢失,时间200ms
显然,我没有上网。
这时,我注意到Firefox专属门户登录横幅(参见图片(见上文)。哦,我必须再次登录,这很奇怪。单击时“打开网络登录页”按钮,我自动登录。不需要再次输入登录详细信息。我觉得这也很奇怪,因为如果登录是自动的,为什么我必须访问登录页面又一次?
我把笔记本电脑放在床上睡觉,在村子里散散步,买些杂货店,享受山上的空气我回来时要登录再一次以获得无线访问。我慢慢地开始得到有点恼火.我的猜测是相关最终用户设备的MAC地址从访问列表相当快,可能大约一个小时或二,因此网络连接被切断及时。
让我的情况更糟的一个问题是,我经常几个浏览器窗口同时打开;通常是因为我有几趟火车即时思考,每个窗口都包含相关信息每一种思路。问题是,只是一浏览器窗口的实际上显示了(自动显示的)捕获门户登录横幅。找到带横幅的窗口相当耗时。
好吧,这开始变得愚蠢和有点恼人了。是时候自动化了消除烦恼。WWW::机械化
去营救!
解决方案
为什么选择WWW::机械化
? 嗯,我有这方面的经验(我以前使用类似的过程自动登录到内燃机火车在德国当我以前经常上下班这个大流行),我知道我可以用它来将数据提交到简单的HTML形式,和波尔我的go-to语言适合这种情况吗自动化。
那么,如何开始自动化登录过程呢?简单的解决方案:退出Firefox,关闭所有浏览器窗口,将用电脑睡觉,然后散散步几个小时。
回来后,我只需要使用perl-de0
启动REPL(更换)-像游戏环境和珀尔多克
阅读广泛的WWW::机械化
文档.
第一次尝试触发与捕获门户的连接进展不顺利:
└> perl-de0从perl5db.pl版本1.55加载DB例程编辑器支持可用。输入h或“h h”可获得帮助,输入“man perldebug”可获得更多帮助。主::(-e:1):0DB<1>使用WWW::Mechanize;DB<2>$mech=WWW::机械化->新增;数据库<3>$mech->get('https://google.com网站');获取时出错https://google.com:无法连接到google.com:443(SSL连接尝试失败)(eval22)[/home/cochrane/perl5/perlbrew/perls/perl-5.30.1/lib/5.30.1/perl5db.pl:738]第2行。
好的,所以我们需要使用HTTP并避免使用HTTPS。很高兴知道。
仅使用HTTP效果更好:
DB<4>x$mech->获取('http://google.com')0 HTTP::响应=HASH(0x55a95f5048c0)<剪>很多细节;你真的不想看到这个</snicp>
这就是我们喜欢看到的!我们现在至少要把东西拿回来。有看一下页面的标题,我们得到:
数据库<5>x$mech->title();0'我的建议热点>登录'
是的,这是一个登录页面。使用转储页面内容
DB<5>x$mech->content();<剪>大量HTML内容</snicp>
我们得看看要玩什么。需要注意的主要事项内容(我没有展示,因为它太详细了,我想保护无辜者)包括:
我们有一个叫的表格登录
<形式 名称=“登录” 行动="http://login.hotspot.lan/login" 方法=“发布”>
我们有一个用户名字段用户名
<输入 风格=“宽度:80px” 名称=“用户名” 类型=“文本” 价值=""/>
我们有一个带有名称的密码字段密码
<输入 风格=“宽度:80px” 名称=“密码” 类型=“密码”/>
这为我们提供了足够的信息,以便能够使用相关登录数据。
旁白:有趣的是,尽管网站上的字段是英文的是德国的。我想标准化英语字段可能很有用编程时。
为了提交表格,我们使用WWW::机械化
的提交表单()
方法(我在这里对其进行了很好的格式化以使事情更容易进行的调用阅读):
$机械->提交表单(表单名称=> '登录',领域=>{用户名=> '房间用户名',密码=> '房间密码',});
我们可以通过询问HTTP::响应
如果一切顺利好:
数据库<7>x$mech->res->is_success;0 1
目前为止看起来不错。让我们看看发出砰的声响
按预期工作
$ping网站www.heise.dePING www.heise.de(193.99.144.85)56(84)字节的数据。来自www.heise.de的64字节(193.99.144.85):icmp_seq=1 ttl=247时间=20.6 ms来自www.heise.de的64字节(193.99.144.85):icmp_seq=2 ttl=247时间=13.9 ms^C---www.heise.de ping统计---发送2个数据包,接收2个,0%数据包丢失,时间1000msrtt最小值/avg/max/mdev=13.941/17.281/20.621/3.340 ms
对!换句话说:我们在!那是容易的. ☺
把所有东西放在一起(并稍微清理一下代码),我最终有了这个:
使用严格;使用警告;使用WWW::机械化;我的$机械=WWW::机械化->新的;$机械->得到('http://google.com');#检查我们是否有登录页面,而不是谷歌或其他东西
#即我们没有登录
如果($机械->标题()=~ '登录') {$机械->提交表单(表单名称=> '登录',领域=>{用户名=> “<房间用户名>”,密码=> “<房间密码>”});如果($机械->物件->成功(_S){打印 “登录成功\n”;}其他的{打印 “登录失败\n”;}}其他的{打印 “已登录\n”;}
现在我可以在每次唤醒笔记本电脑时运行脚本重新上线。耶!
从安全角度来看,用户名和密码有点奇怪显然与房间号有关。换句话说,我可能同样容易使用隔壁房间的帐户(我想:我不能麻烦你最后检查一下)。
结论
好吧,当我醒来时,这个脚本确实为我节省了一些时间和麻烦笔记本电脑处于挂起状态。此外,计算出为了找到解决方案,这个谜题是必要的。Perl保存白天再一次!
最初发布于https://peateaca.de.