如何用PowerShell的Invoke-WebRequest点击按钮并维持会话登录打印机?
解决PowerShell模拟打印机登录并维持会话的问题
你的核心问题在于试图用DOM的click()方法模拟按钮点击,但PowerShell的Invoke-WebRequest解析的是静态HTML,没有浏览器的JavaScript执行环境——$ConnectionButton.click()只会在内存中的DOM对象上触发事件,不会实际发送登录请求。另外,你拼接URL和构造POST Body的方式也不符合实际的登录请求逻辑。
下面是正确的解决思路和代码示例:
第一步:分析实际的登录请求
首先打开浏览器的开发者工具(F12),切换到**网络(Network)**标签,然后手动完成登录操作,观察点击登录按钮时发送的HTTP请求:
- 记录请求的URL、请求方法(POST/GET)
- 查看请求Body里的所有参数(比如
pin、是否有CSRF令牌、action参数等) - 复制请求的Headers(尤其是
X-Requested-With、Referer这类AJAX请求头)
第二步:用PowerShell模拟登录请求
我们不需要操作DOM元素,直接模拟浏览器发送的登录请求即可,同时复用同一个会话对象来维持登录状态:
# 1. 初始化会话,获取初始页面和会话Cookie $initialUri = "http://xxx/webglue/content?c=LoginDropdown&lang=fr" $headers = @{ "Pragma"="no-cache" "Accept-Encoding"="gzip, deflate" "Accept-Language"="fr-FR,fr;q=0.9,en-US;q=0.8,en;q=0.7" "User-Agent"="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36" "Accept"="application/json, text/javascript, */*; q=0.01" "Cache-Control"="no-cache" "X-Requested-With"="XMLHttpRequest" "Cookie"="lang=fr; autoLogin=false" "Referer"="http://xxx/" } # 初始化会话,SessionVariable会创建一个名为printerSession的会话对象 $page = Invoke-WebRequest -Uri $initialUri -Headers $headers -SessionVariable "printerSession" # 2. (可选)如果页面有CSRF令牌等隐藏字段,从页面提取 # $csrfToken = $page.ParsedHtml.getElementsByTagName('input') | Where-Object { $_.type -eq "hidden" -and $_.name -eq "csrfToken" } | Select-Object -ExpandProperty value # 3. 构造登录请求的Body(根据你抓包的实际参数调整) $loginBody = @{ pin = "xxx" # 你的PIN码 # action = "login" # 如果抓包看到这个参数就加上 # csrfToken = $csrfToken # 有CSRF令牌的话加上 } # 4. 发送登录请求,复用之前的会话 # 替换成你抓包得到的实际登录URL $loginUri = "http://xxx/webglue/content?c=LoginDropdown&action=login&lang=fr" Invoke-WebRequest -Uri $loginUri -Method POST -Body $loginBody -WebSession $printerSession -ContentType "application/x-www-form-urlencoded; charset=utf-8"
第三步:复用会话访问日志页面
登录成功后,用同一个printerSession对象访问日志页面即可维持登录状态:
$logPage = Invoke-WebRequest -Uri "http://xxx/cgi-bin/history" -WebSession $printerSession # 解析日志内容,比如输出原始HTML或者提取特定内容 Write-Host $logPage.Content
关键注意事项
- 不要依赖DOM的
click()方法:PowerShell没有JS引擎,无法执行按钮的onclick JavaScript函数,必须直接模拟函数实际发送的HTTP请求。 - 会话维持要复用同一个WebSession:
-SessionVariable仅在第一次请求时初始化会话,后续请求必须用-WebSession指定已有的会话对象,否则会创建新的会话,丢失登录状态。 - 严格匹配抓包的请求参数:服务器会校验请求的Headers、Body参数,必须和浏览器发送的完全一致,否则会被拒绝。
内容的提问来源于stack exchange,提问作者Rakha
相关产品推荐
相关产品推荐

