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

如何通过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

问题分析

  1. $Form.Action可能返回相对路径,直接使用会导致POST请求地址错误
  2. 未保留表单中的动态隐藏字段(如会话验证令牌),这类字段是服务器验证请求合法性的关键
  3. 未明确处理登录后的重定向逻辑,也没有验证登录是否成功

修正后的解决方案

核心步骤

  • 确保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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:35:32