背景与目标

宿舍的校园网是 Dr.COM(城市热点)认证:每次开机都要打开 http://172.30.255.42/ 输一遍账号密码。目标很明确——开机后自动检测是否已登录,未登录就自动登录,全程无人值守。

听起来是个"一个脚本 + 一个计划任务"就能收工的小活。实际上它变成了一场(间断)持续五天、五次误判的悬案。

技术选型

环节选择理由
登录方式逆向网页认证协议,脚本直发 HTTP 请求不想依赖浏览器自动化,开机场景要轻
脚本PowerShellWindows 原生、零依赖
凭据本地两行配置文件 + NTFS 权限锁定改密码不动脚本
触发计划任务(登录后 45 秒)+ 桌面快捷方式开机自动 + 手动兜底

踩过的坑(误判实录)

  1. 页面头部的协议配置是"摆设"。认证页 <head> 里明明白白写着登录地址、参数名(authloginpath、authuserfield……),照着拼出来的请求却返回一个管理端 SPA 外壳。真相是这些配置是历史遗留,真实的登录请求藏在业务 JS 的深层调用链里。教训:逆向时以"真实发出的请求"为准,不要信配置声明。

  2. “能登录成功”≠“登录对了”——整个悬案的根源。我逆向出的内核接口 /drcom/login 确实能认证成功(返回 result:1),开机任务也真的能自动上网。但这种会话是降级会话:大部分网站正常,少数网站(恰好是几个重要服务)永远打不开,Windows 还常年显示 “no internet, action needed”。脚本"看起来完全正常",坑全埋在细节里。

  3. 误判一:IPv6 红鲱鱼。状态接口里有个 myv6ip 字段一直为空,我顺理成章地推断"会话没绑 IPv6",于是:登录时带上 v6ip、开机等 RA 下发、做了注销重绑开关……折腾一大圈。最后用 IPv6 专用测速站一测——IPv6 从头到尾都是通的。教训:状态字段 ≠ 实际连通性,下结论前拿真实流量测一次。

  4. 误判二:横幅的真凶扑朔迷离。“no internet” 横幅查出来是 NCSI 探测被劫持(探测地址被返回了验证页)+ msftconnecttest.com 被 DNS 污染。我先关了 IPv6(无用且是误判),又关了 NCSI 主动探测(应急有效)。事后证明:探测被劫持本身也是降级会话的症状之一——好会话下探测一切正常。至于 msftconnecttest.com 解析失败,那是全国通病,跟这台机器无关。

  5. 误判三:DNS 污染是真凶之一,但不是全部。“部分网页打不开"排查时发现网卡 DNS 里躺着 8.8.8.8(国内已被污染),Windows 轮询两个 DNS,中毒的解析结果造成"时好时坏”。清掉后确实好转——但没除根,说明还有别的问题。

  6. 误判四:怀疑代理软件。系统代理开着(Clash),看起来嫌疑很大。用"直连 vs 走代理"的 A/B 对照测试一测:两边都通,排除。顺带一提,“Clash 开着直连模式"不等于"流量不经过它”——系统代理指向它的端口,流量就都穿过它。

关键转折:一场对照实验

转机来自一个关键观察:“手动网页登录是没有任何问题的。”

立刻做对照实验:脚本注销+重新登录 → 受害网站不通;网页手动登录 → 全部正常。“1 不通而 2 通”,一锤定音:问题不在网络、不在 DNS、不在代理,就在登录流程本身——脚本登录产生降级会话,网页登录产生完整会话。

破案:抓浏览器的真实请求

既然怀疑登录请求和浏览器不一致,最可靠的办法不是继续读源码猜(源码里有多条登录路径,很容易读岔),而是抓浏览器真实发出的请求。用了一个零副作用的技巧:

在认证页面里把发包函数 util._jsonp 替换成"只记录、不发送"的录制器,再用假凭据触发完整登录流程——请求的完整 URL 和参数原样落进数组,一个包都没发出去,现有会话毫发无损。

抓到的请求和脚本发的完全是两个世界:

脚本(降级会话)浏览器(完整会话)
接口/drcom/login(内核接口):801/eportal/portal/login(门户 API)
账号DDDDD=453***user_account=,0,453***(带前缀)
密码upassuser_password
上下文无wlan_user_ip / wlan_user_mac / wlan_ac_ip / wlan_ac_name

原来 Dr.COM 有两套登录体系:内核接口是给老客户端用的兼容通道,认证能过但会话策略不完整;网页走的门户 API 通道才是"正房"。连注销也分体系——内核注销对门户会话完全无效(返回 result:0 当无事发生),门户会话必须用门户的注销接口;而且注销后接口有约 10 秒的 503 冷却期,登录要有重试退避。

最终脚本照抄浏览器请求格式,配上三轮重试 + 内核接口兜底(最差降级、不断网),再加一个交互菜单(跳过 / 注销 / 注销后重新登录)方便手动恢复会话。

结果

  • ✅ 开机自动登录走门户通道 = 完整会话,受害网站全部 200
  • ✅ “no internet” 横幅消失(好会话下探测本就正常)
  • ✅ 桌面快捷方式一键恢复会话;计划任务无人值守不卡交互
  • ✅ 登录日志全程留痕,出问题先看日志

下次可以做得更好

  • 对照实验应该更早做。“手动行、自动不行"是极强的二分信号,第一时间就该拿"手动 vs 自动"正面 A/B,而不是顺着症状一个个修。
  • 抓真实请求优先于读源码。源码可能有多条执行路径,录制器技巧五分钟就能拿到 ground truth,性价比碾压啃压缩混淆的 JS。
  • 警惕红鲱鱼:空的状态字段、时间上的巧合、“理论上应该影响"的组件,都可能只是恰好出现在现场。每个结论都要有"实测证据"四个字背书。
  • 危险操作先确认。有一次差点在没打招呼的情况下注销正在使用的会话(那次验证果然把网搞断了,还好有手动登录兜底);重要的现场实验,先问一句再动手。