You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:20:09