需要获取URL HTTP请求被重定向到

时间:2015-11-26 09:52:24

标签: powershell

我正在尝试编写一个脚本来自动执行我的防火墙登录过程。这是我的防火墙做的事情 当我连接到我的Wi-Fi并打开google.com时,它会重定向到以下网址:

http://<IP>:<PORT>/fgtauth?<RAND-STRING>

它包含一个基本的用户名 - 密码表单,以及一个隐藏字段“magic”,其值为<RAND-STRING>。我必须使用用户名和密码提交此表单才能登录防火墙。我希望自动化该过程(并将其安排为每4小时运行一次,以防止自动注销防火墙)。

直到现在我已经这样做了:

$url = "http://<IP>:<PORT>/fgtauth?04582fd55070345b"
$parameters = "4Tredir=http://google.com&magic=04582fd55070345b&username=<UN>&password=<PASS>"

$http_request = New-Object -ComObject Msxml2.XMLHTTP
$http_request.open('POST', $url, $false)
$http_request.setRequestHeader("Content-type", 
  "application/x-www-form-urlencoded")
$http_request.setRequestHeader("Content-length", '$parameters.length')
$http_request.setRequestHeader("Connection", "close")
$http_request.send($parameters)
$http_request.statusText    

我是从here复制的。我必须从网络浏览器手动打开google.com,从网址复制该“魔术”字符串并将其粘贴到脚本中。如果我这样做,脚本运行正常,登录成功。我现在必须先以某种方式向google.com发出请求,它会被重定向到防火墙登录页面并从中提取“魔法”字符串。

请帮我提取“神奇”字符串。

1 个答案:

答案 0 :(得分:0)

通常情况下,我不建议使用与问题中的方法不同的答案,但在这种情况下,我的建议使用的代码很少,我认为这可能是合适的。

我知道这样做的最简单方法是使用Invoke-WebRequest cmdlet。如果您提供的示例网址是真实网址的实际格式,那么您可以执行此操作:

$url = "https://www.theSiteThatWillRedirectYou.com"
$webResponse = Invoke-webRequest -uri $url
$absoluteUriFromResponse = $webResponse.BaseResponse.AbsoluteUri
$splitUri = $absoluteUriFromResponse.split("?")
$desiredString = $splitUri[1]

如果网址的格式为?parameter = value,则可以执行以下操作:

$url = "https://www.theSiteThatWillRedirectYou.com"
$webResponse = Invoke-webRequest -uri $url
$absoluteUriFromResponse = $webResponse.BaseResponse.AbsoluteUri
$splitUri = $absoluteUriFromResponse.split("?")
$desiredKeyValPair = $splitUri[1] | convertFrom-StringData

在这种情况下,如果网址是,例如,whatever.com?== valueValue,那么$ desiredKeyValPair将包含:

Name                           Value                                                                                                                                                                                
----                           -----                                                                                                                                                                                
rand                           randValue

现在这些示例仅在查询字符串中只有一个参数时才有效。如果有多个参数,您需要做一些额外的工作。例如,如果网址是这样的:www.whatever.com?== undVal&amp; otherParam = otherValue,您需要执行以下操作:

$splitOnQueryChar = $absoluteUriFromResponse.split("?")
$splitOnAmpersand = $splitOnQueryChar[1].split("&")
$keyValPairs = $splitOnAmpersand | convertFrom-StringData

此时$ keyValPairs将包含以下内容:

Name                           Value                                                                                                                                                                                
----                           -----                                                                                                                                                                                
rand                          randVal                                                                                                                                                                     
otherParam                       otherValue                                                                   

这些值可以通过名称引用,如下所示:

$keyValPairs.rand  

*评论中包括: 我没有考虑页面上的表单,但Invoke-webrequest将捕获表单/输入字段等,这些通常可以通过名称引用。