Powershell 使用Invoke WebRequest时Superss JS警报
这是我观察到的非常奇怪的行为。当网页中存在以下内容时,Invoke WebRequest将发出警报消息并暂停任何脚本,直到警报解除Powershell 使用Invoke WebRequest时Superss JS警报,powershell,Powershell,这是我观察到的非常奇怪的行为。当网页中存在以下内容时,Invoke WebRequest将发出警报消息并暂停任何脚本,直到警报解除 <script> alert('testing'); </script> 这是最奇怪的一点。我已经尝试了很多次来避免这个警报-UseBasicParsing在我的情况下不是一个选项。因此,我尝试将对象分配给一个变量,并仅访问未提及警报的部分。例如: $x = Invoke-WebRequest 'http://activelab.io/co
<script>
alert('testing');
</script>
这是最奇怪的一点。我已经尝试了很多次来避免这个警报<代码>-UseBasicParsing在我的情况下不是一个选项。因此,我尝试将对象分配给一个变量,并仅访问未提及警报的部分。例如:
$x = Invoke-WebRequest 'http://activelab.io/code-snippets/show-alert-box-on-page-load'
$x.Forms
$x = Invoke-WebRequest 'http://activelab.io/code-snippets/show-alert-box-on-page-load'
$x.Forms
$x.Forms
$x.Forms
但这仍然会生成警报消息!即使是$null=$x.Forms
或类似的技巧也无法阻止它
更奇怪的是,这只返回了一次。例如:
$x = Invoke-WebRequest 'http://activelab.io/code-snippets/show-alert-box-on-page-load'
$x.Forms
$x = Invoke-WebRequest 'http://activelab.io/code-snippets/show-alert-box-on-page-load'
$x.Forms
$x.Forms
$x.Forms
返回一条消息。只有当我重新调用请求时,我才能收到额外的错误
我还尝试在作业中运行它,但这仍然会创建警报。工作暂停,直到被解雇
<script>
alert('testing');
</script>
是否有人知道如何在不使用
-UseBasicParsing
参数的情况下解决此问题?在处存在SSL问题https://www.quackit.com/javascript/javascript_alert_box_example_2.cfm“
。我得到:
Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send.
At line:1 char:1
+ Invoke-WebRequest -uri 'https://www.quackit.com/javascript/javascript_alert_box_ ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
我不得不把它改成:https://64.73.217.183/javascript/javascript_alert_box_example_2.cfm“
然后我可以在PS4.x中测试它
这个想法怎么样?使用试试{}
捕获{}
Try {
Invoke-WebRequest -uri 'https://64.73.217.183/javascript/javascript_alert_box_example_2.cfm'
} Catch {
"$_"
}
由于“$”只生成简单的
基础连接已关闭:发送时发生意外错误
如果您不希望出现任何错误,只需删除或标记“$\u”
如果您需要有关powershell错误处理的完整资源,请阅读
重新编辑关闭警报
框显然不是那么容易。根据我的调查,它似乎是powershell中的iexplorer实例
在我看来,根据我的研究,没有办法“抑制”显示的警报窗口
但是,您可以这样做(解决方法):
一个脚本是原始脚本:
$x = Invoke-WebRequest -uri 'http://activelab.io/code-snippets/show-alert-box-on-page-load'
$x.Forms
第二个是关闭窗口(您需要有WASP(Powershell的Windows自动化管理单元)模块):
然后有第三个脚本,应该在后台异步启动脚本(这只是一个简单的例子,你可以想象一下:
使用
-UseBasicPassing
$Request = Invoke-WebRequest 'http://activelab.io/code-snippets/show-alert-box-on-page-load' -UseBasicParsing
*编辑:我知道您声明不能使用
-UseBasicParsing
,但这里的要点是您不必实现自己的解析。您可以使用修改响应后调用WebRequest使用的相同解析来避免警报。这样,您可以在没有任何警报的情况下填充$request.forms
修改响应HTML以覆盖警报弹出窗口
$JavascriptAlertOverride = @"
// Override window.alert
window.alert = function() {
// do nothing here
};
// Override alert
alert = function() {
// do nothing here
};
"@
$NonAlertingHTML = $Request.Content -replace "<head>", "<head><script type='text/javascript'>$JavascriptAlertOverride</script>"
我想这就是我从一些随机人的网站上得到的。我编辑了指向一个非ssl网站的链接,该网站演示了这种行为。不幸的是,它没有使用powershell的事件处理程序,所以我无法捕获它。@JacobColvin上一个链接在powershell中生成了错误。如果你得到的是一个窗口,那么它就不同了但是仍然可以用try和catch块捕获。我会更新答案。你能解释一下为什么
-UseBasicParsing
不适合你吗?-UseBasicParsing
不会填充$request.Forms
,这意味着我必须实现HTML/JS解析来确定输入字段。@JacobColvin现在我明白了你想做什么…:)而且你的尝试/捕获没有捕获任何东西。输出$x或$x的任何子项,窗口仍然会出现。您能详细说明一下为什么-UseBasicParsing
对您不可用吗?@oɔǝɹ-UseBasicParsing
将不会填充$request.Forms
,这意味着我必须实现HTML/JS解析来确定输入字段。啊,那么你想遍历表单/字段吗?@oɔɯǝɹ确实如此,尽管我认为这与问题不太相关,真的。我觉得这应该是可以解决的,而不只是为我的具体案例创建一个变通方法。也许使用-UseBasicParsing
将HTML下载到本地文件,并解析使用DOM是一个选项?你没有正确阅读操作。引用:“-UseBasicParsing在我的情况下不是一个选项。”我确实读过它,但我也读过他关于为什么他认为不能使用它的评论”-UseBasicParsing不会填充$request.Forms,这意味着我必须实现HTML/JS解析以确定输入字段”这意味着他不知道他不必实现自己的解析。他可以使用修改响应后调用WebRequest的解析引擎。不过,我会尝试在回答中澄清这一点,如果他碰巧在2.0上,那么我会写另一个选项,其中-UseBasicParsing实际上不是一个选项。最后,我必须将它授予@tukan,但通过一些额外的工作,我认为这是一个很好的解决方案。您仍然需要解析树,所以我想这取决于HTMLDocument将如何构造不同的树。我相信HtmlWebResponseObject在这里更为标准。@JacobColvin谢谢。我也投了赞成票,因为这是一个有趣的贡献。
$HTML = New-Object -ComObject "HTMLFile"
$HTML.IHTMLDocument2_write($NonAlertingHTML)
$HTML.forms
PS > $HTML.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False HTMLDocumentClass System.__ComObject
PS > $Request.ParsedHtml.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False HTMLDocumentClass System.__ComObject