使用PowerShell从页面获取信息

时间:2017-04-11 13:56:49

标签: powershell powershell-v2.0 powershell-v3.0

所以我想使用powershell自动执行这个简单的操作:

  • 访问我的网站
  • 填写" USERNAME"用" myname"
  • 检查" PERSONNEL_NBR"复选框
  • 提交
  • 检索PERSONNEL_NBR并将其存储在变量

注意:任何解决方案都非常适合我

我想使用 Invoke-WebRequest ,因为它没有启动正常的IE会话。非常感谢!

此代码:

$ie = $null
$ie = new-object -com internetexplorer.application
$ie.navigate('http://example.com/')
$link = $ie.Document.getElementsByTagName('input') | where-object {$_.name -eq "username"}; $link.value = "myname"
$link = $ie.Document.getElementsByTagName('input') | where-object {$_.value -eq "PERSONNEL_NBR"}; $link.click()
$link = $ie.Document.getElementsByTagName('input') | where-object {$_.type -eq "submit"}; $link.click()
sleep 2
$personnel_nbr = ((($ie.Document.body.outerHTML | findstr /L /C:">PERSONNEL_NBR<" ) -split "<SPAN class=tx>" | Select -Index 1).split("</SPAN>",2) | Select -Index 0)
$ie.quit()

工作,但只有当我打开一个PowerShell并从那里启动命令时。如果我将其保存为脚本并启动它,它就不起作用。

PS:降低IE安全性是不可行的,无论如何它并没有解决问题。

PPS:上面的版本是我使用的代码的简化版本,没有超出主题的内容。完整版本正在等待浏览器,但它仍然没有工作(可能是由于cookie问题?如果有人可以建议如何做,我很乐意解决。我已经有关于cookies,我用Chrome Dev Tools重新发布了帖子。我只是不知道如何在我的脚本中使用这些信息。)

PPPS:如果问题与交互模式相关联,我是否可以在模拟交互式会话的另一个PowerShell中执行所有这些命令?那会有用。谁知道怎么做?

第二版

这是另一种尝试。没有错误,但它返回页面的内容。我甚至不确定请求是否已经完成。

$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$cookie = New-Object System.Net.Cookie 
$cookie.Name = "mycookiename"
$cookie.Value = "mycookievalue"
$cookie.Path = "/"
$cookie.Domain = "example.com"
$session.Cookies.Add($cookie)
$uri = "http://example.com"
$body = @{username="myname";fields="PERSONNEL_NBR"}
#THESE ARE UNSUCCESSFUL ATTEMPTS
#$r = Invoke-WebRequest -Uri $uri -WebSession $session
#$r.InputFields[34].innerHTML = "true"
#$r.InputFields[34].innerText = "true"
#$r.Forms[0].Fields["fields"] = "PERSONNEL_NBR"
#$r.Forms[0].Fields["PERSONNEL_NBR"] = "true"
#$r.InputFields[0].innerText="myname"
#$r.Forms[0].Fields["username"] = "myname"
#$r = Invoke-WebRequest -Uri $uri -WebSession $session -Method Post -Body $r
$r = Invoke-WebRequest -Uri $uri -WebSession $session -Method Post -Body $body
$r.RawContent

3 个答案:

答案 0 :(得分:0)

使用IE comm对象有一些令人烦恼的事情,但它们大部分都可以使用,例如使用.visible = $false将隐藏IE窗口。 检查.Busy以查看页面实际加载的时间。您可能会发现脚本未执行的原因,因为它是一个独立的脚本,它正在快速运行。

$ie = New-Object -com internetexplorer.application; 
$ie.visible = $false; 
$ie.navigate('http://mypioneer.phibred.com/ews/');

while ($ie.Busy -eq $true) 
{ 
    Start-Sleep -Seconds 2; 
} 
$link = $ie.Document.getElementsByTagName('input') | where-object {$_.name -eq "username"}; $link.value = "medada"
$link = $ie.Document.getElementsByTagName('input') | where-object {$_.value -eq "PERSONNEL_NBR"}; $link.click()
$link = $ie.Document.getElementsByTagName('input') | where-object {$_.type -eq "submit"}; $link.click()

while ($ie.Busy -eq $true) 
{ 
    Start-Sleep -Seconds 2; 
} 

$personnel_nbr = ((($ie.Document.body.outerHTML | findstr /L /C:">PERSONNEL_NBR<" ) -split "<SPAN class=tx>" | Select -Index 1).split("</SPAN>",2) | Select -Index 0)
Write-Host $personnel_nbr

$ie.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ie)
Remove-Variable ie

另一种方法是尝试捕获表单提交POST数据,并使用列出的here

工具之一重新创建POST传输

答案 1 :(得分:0)

如果您需要在POST请求中使用cookie,则需要创建Cookie对象,将其添加到WebRequestSession对象,并将其用作invoke-webrequest的WebSession参数:

$session = New-Object Microsoft.PowerShell.Commands.WebRequestSession

$cookie = New-Object System.Net.Cookie 

$cookie.Name = "cookieName"
$cookie.Value = "cookieValue"
$cookie.Domain = "cookieDomain"

$session.Cookies.Add($cookie)

Invoke-WebRequest -Uri $uri -WebSession $session -Method Post -Body $body

$body变量是发布请求的内容,因此您需要使用收集的有关发布请求的信息来创建它。它看起来像这样:

$body = @{
username = "medada"
input name = value
...
} 

答案 2 :(得分:0)

好的,所以..阻止脚本工作的问题既不是交互模式也不是cookie。问题出在管理员权利上。

所以这段代码完美无缺:

$ie = $null
$ie = new-object -com internetexplorer.application
$ie.navigate('http://example.com')
$link = $ie.Document.getElementsByTagName('input') | where-object {$_.name -eq "username"}; $link.value = "myname"
$link = $ie.Document.getElementsByTagName('input') | where-object {$_.value -eq "PERSONNEL_NBR"}; $link.click()
$link = $ie.Document.getElementsByTagName('input') | where-object {$_.type -eq "submit"}; $link.click()
while ($ie.Busy -eq $true -and $timer -lt 10) {
    sleep 1
    $timer++
    echo "Waiting for example.com..."
}
if ($timer -gt 10) {
    while ($confirmation -ne "y" -and $confirmation -ne "n") {
        $confirmation = Read-Host "`nConnection timed out. Do you want to try to grab it manually? (y/n)"
        if ($confirmation -eq 'y') {
            echo "`nPlease go to this page:`nhttp://example.com and put `"$username`" in the `"USERNAME`" field, then check the `"PERSONNEL_NBR`" checkbox and then submit."
            Read-Host "`nPERSONNEL_NBR"
        }
        elseif ($confirmation -eq 'y') {
            echo "`nRemember to add the PERSONNEL_NBR later!"
        }
        else {
            echo "`nInvalid option."
        }
    }
    $confirmation=$null
}
$personnel_nbr = ((($ie.Document.body.outerHTML | findstr /L /C:">PERSONNEL_NBR<" ) -split "<SPAN class=tx>" | Select -Index 1).split("</SPAN>",2) | Select -Index 0)
echo "The PERSONNEL_NBR is $personnel_nbr"
$ie.quit()

您只需将其作为管理员运行即可。感谢大家,感谢您的帮助和时间。