如何通过PowerShell实现网站自动登录?(Chrome/Windows10环境)
网站自动登录的PowerShell可行方案
方案一:用Selenium WebDriver模拟浏览器操作(推荐,适配带JS交互的站点)
因为你使用的是Chrome浏览器,这种方式完全模拟人工操作流程,能应对页面动态加载、JS渲染等场景,比Invoke-WebRequest的适配性更强。
操作步骤:
- 先安装Selenium PowerShell模块:
Install-Module -Name Selenium -Force -Scope CurrentUser
- 下载与你Chrome版本匹配的ChromeDriver,将其放到系统PATH目录,或者后续代码中指定绝对路径。
- 编写自动登录脚本:
# 导入Selenium模块 Import-Module Selenium # 配置ChromeDriver路径(若未放入PATH,需填写完整路径,例如"C:\Tools\chromedriver.exe") $driverPath = "chromedriver.exe" $driver = Start-SeChrome -DriverPath $driverPath # 打开目标登录站点 $driver.Navigate().GoToUrl("https://signin.absolute.com/Default.aspx?ReturnUrl=/SSO/SAML2/SSOService.aspx") # 等待邮箱输入框加载完成,填入你的邮箱 $emailField = $driver.FindElementById("txtEmailAddress") $emailField.SendKeys("你的邮箱地址") # 点击下一步按钮(需根据页面实际HTML调整选择器,这里假设按钮id为btnNext) $nextBtn = $driver.FindElementById("btnNext") $nextBtn.Click() # 等待密码页面加载,填入密码(可改用显式等待替代Sleep,更稳定) Start-Sleep -Seconds 2 $passwordField = $driver.FindElementById("txtPassword") # 替换为实际密码框的id $passwordField.SendKeys("你的密码") # 点击登录按钮(同样需根据页面实际情况调整选择器) $loginBtn = $driver.FindElementById("btnLogin") $loginBtn.Click() # 操作完成后可关闭浏览器 # $driver.Quit()
提示:如果按钮没有id属性,可改用CSS选择器定位,例如
$driver.FindElementByCssSelector("button[type='submit']")。
方案二:用Invoke-WebRequest提交表单(仅适合无复杂JS的静态表单)
这种方式无需启动浏览器,但仅适用于纯静态表单提交的站点,若目标站点存在JS动态生成的字段(如CSRF令牌),此方法大概率失效。你之前的尝试错误在于误用了DOM操作方法,Invoke-WebRequest返回的是响应对象,需通过InputFields属性处理表单:
操作步骤:
# 创建会话对象,保持登录状态 $session = New-Object Microsoft.PowerShell.Commands.WebRequestSession $site = Invoke-WebRequest -Uri "https://signin.absolute.com/Default.aspx?ReturnUrl=/SSO/SAML2/SSOService.aspx" -WebSession $session # 找到邮箱输入框对应的字段(匹配name属性) $emailField = $site.InputFields | Where-Object { $_.Name -eq "ctl00`$bodyContent`$txtEmailAddress" } $emailField.Value = "你的邮箱地址" # 提交邮箱表单,进入密码页面 $firstSubmit = Invoke-WebRequest -Uri $site.Forms[0].Action -Method Post -Body $site.InputFields -WebSession $session # 重复步骤处理密码提交 $passwordField = $firstSubmit.InputFields | Where-Object { $_.Name -eq "ctl00`$bodyContent`$txtPassword" } # 替换为实际密码框的name属性 $passwordField.Value = "你的密码" $finalSubmit = Invoke-WebRequest -Uri $firstSubmit.Forms[0].Action -Method Post -Body $firstSubmit.InputFields -WebSession $session
你之前尝试的问题说明
- 你使用
$site.document.getElementsByTagName是错误的,Invoke-WebRequest返回的是HtmlWebResponseObject,并非浏览器的DOM对象,无法直接调用DOM操作方法。 - 查找表单字段需通过
$site.InputFields集合,通过Name或Id属性筛选,而非用Contains('id="divlogin"')这类错误方式。
内容的提问来源于stack exchange,提问作者Raye
相关产品推荐
相关产品推荐

