如何通过PowerShell的Invoke-WebRequest实现带动态Action URL的网站登录?
解决PowerShell Invoke-WebRequest登录带动态会话Action URL的网站问题
尝试使用PowerShell的
Invoke-WebRequest工具登录https://account.engie.be/,目标网站的登录表单Action是带新会话码的动态URL。现有代码执行后,返回的页面仍为登录页,表单字段为空,未完成登录。
原始代码:
$URL = 'https://account.engie.be/' $username = "email" $password = "pw" $Site = Invoke-WebRequest $URL -SessionVariable Session1 $Form = $Site.Forms $ActionURL = $Form.Action $Form.Fields['username'] = $username $Form.Fields['password'] = $password $Form.Fields['rememberMe'] = "off" $Site2 = Invoke-WebRequest $ActionURL -WebSession $Session1 -Method Post -Body $Form.Fields
问题分析
$Form.Action可能返回相对路径,直接使用会导致POST请求地址错误- 未保留表单中的动态隐藏字段(如会话验证令牌),这类字段是服务器验证请求合法性的关键
- 未明确处理登录后的重定向逻辑,也没有验证登录是否成功
修正后的解决方案
核心步骤
- 确保Action URL为完整路径,避免相对路径导致请求失效
- 保留并提交表单所有原始隐藏字段,不能仅设置用户名和密码
- 显式处理重定向,验证登录结果
- 精准筛选目标登录表单(避免页面多表单干扰)
修正后的代码:
$baseURL = 'https://account.engie.be/' $username = "your-email@example.com" # 建议使用安全方式读取密码,避免明文硬编码 $securePassword = Read-Host "输入登录密码" -AsSecureString $password = [System.Net.NetworkCredential]::new("", $securePassword).Password # 首次请求获取登录页面及会话信息 $loginPage = Invoke-WebRequest $baseURL -SessionVariable Session # 精准筛选登录表单(根据页面实际表单ID/名称调整) $loginForm = $loginPage.Forms | Where-Object { $_.Id -eq "loginForm" -or $_.Name -eq "loginForm" } if (-not $loginForm) { Write-Error "未找到目标登录表单" exit } # 设置表单字段:保留原有隐藏字段,仅覆盖用户名、密码、记住我选项 $loginForm.Fields['username'] = $username $loginForm.Fields['password'] = $password $loginForm.Fields['rememberMe'] = "off" # 拼接完整Action URL(兼容相对/绝对路径) $actionURL = if ($loginForm.Action -match '^https?://') { $loginForm.Action } else { [Uri]::new([Uri]$baseURL, $loginForm.Action).AbsoluteUri } # 提交登录请求,跟随重定向 try { $loggedInPage = Invoke-WebRequest -Uri $actionURL -WebSession $Session -Method Post -Body $loginForm.Fields -MaximumRedirection 5 # 验证登录状态:根据页面特征判断(如是否包含登录后专属内容) if ($loggedInPage.Content -match "欢迎|我的账户|退出登录") { Write-Host "登录成功" # 后续可使用$Session访问需要权限的页面 $dashboardPage = Invoke-WebRequest "https://account.engie.be/dashboard" -WebSession $Session } else { Write-Warning "登录未生效,请检查表单字段或页面结构是否变化" } } catch { Write-Error "登录请求失败:$_" }
额外注意事项
- 用户代理模拟:若遇到403拦截,可添加浏览器UA参数:
-UserAgent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" - 动态字段更新:部分网站的隐藏字段会随会话刷新,必须每次从登录页面获取,不能复用旧值
- 密码安全:永远不要在代码中明文存储密码,使用
Read-Host -AsSecureString是更安全的方式
内容的提问来源于stack exchange,提问作者NVH
相关产品推荐
相关产品推荐

