0

作为这个问题的后续,我不想在脚本中使用长数组,而是想从文本文件中绘制。所以我替换了这个:

$URLs = ' http : //websiteone.com','http ://websitetwo.com','http : //websitethree.com '

有了这个

$URLs = 获取内容 ./urlfile.txt

或(据我所知,功能相同)这个

$URLs = @(获取内容./urlfile.txt)

但我最终得到Invoke-RestMethod :远程服务器返回错误:(400)错误请求。

结合我上一个问题的出色响应,我的 foreach 循环如下所示:

foreach($URL in $URLs) {
    $BODY = @([pscustomobject]@{"client" = @{"clientId" = "company"; "clientVersion" = "1.0"}; "threatInfo" = @{"threatTypes" = "MALWARE","SOCIAL_ENGINEERING","THREAT_TYPE_UNSPECIFIED","UNWANTED_SOFTWARE","POTENTIALLY_HARMFUL_APPLICATION"; "platformTypes" = "ANY_PLATFORM"; "threatEntryTypes" = "URL","EXECUTABLE","THREAT_ENTRY_TYPE_UNSPECIFIED"; "threatEntries" = @{"url" = $URL}}})
    $JSONBODY = $BODY | ConvertTo-Json
    $Result = Invoke-RestMethod -Method 'POST' -Uri $Uri -Body $JSONBODY -Headers $HEADERS
    if ( ([string]::IsNullOrEmpty($Result)) ) {} else {write-host $URL "ALERT: Safe browsing match!"}
}

...但是如果我使用 Get-Content cmdlet 创建数组,这将不起作用。如果我以任何一种方式运行脚本,然后键入 $URLs,我将得到完全相同的数据返回。我在获取内容方面做错了什么?

4

1 回答 1

1

Invoke-RestMethodcmdlet 一次只发出一个Rest请求,但不能采用数组。

您将需要添加一个forEach循环来$urls一次单步执行一个循环,如下所示:

foreach($url in $urls){

    $result = Invoke-RestMethod -Uri $url 
    #do something with $result
}

因此,要将上一个问题的示例集成到您的示例中,您应该有一个urls.txt如下所示的文件:

http://google.com
http://small.com
https://fast.com/

然后您的代码将如下所示:

$URLs = get-content .\urls.txt
$HEADERS = @{ 'Content-Type' = "application/json" }
$GOOGLE_API_KEY='[API Key]'
$Uri = 'https://safebrowsing.googleapis.com/v4/threatMatches:find?key='+ $GOOGLE_API_KEY

foreach($URL in $URLs) {
    $BODY = @([pscustomobject]@{"client" = @{"clientId" = "company"; "clientVersion" = "1.0"}; "threatInfo" = @{"threatTypes" = "MALWARE","SOCIAL_ENGINEERING","THREAT_TYPE_UNSPECIFIED","UNWANTED_SOFTWARE","POTENTIALLY_HARMFUL_APPLICATION"; "platformTypes" = "ANY_PLATFORM"; "threatEntryTypes" = "URL"; "threatEntries" = @{"url" = $URL}}})
    $JSONBODY = $BODY | ConvertTo-Json
    $result = Invoke-RestMethod -Method 'POST' -Uri $Uri -Body $JSONBODY -Headers $HEADERS

    [pscustomObject]@{SiteName=$url;ThreatInfo=$result.Matches}
}

$urls将从您的文本文件中加载列表,然后在每个文件上运行一个 Rest Request,将结果存储在$result. 最后,它将使用站点名称创建一个新的 PowerShell 对象,并显示是否有来自Google SafeBrowsing API的匹配项。

您需要以交互方式运行命令并查看哪些属性$result对您有意义,但您可以在 Google API 文档中查看所有预期属性。

编辑

发现了错误。事实证明,当我们使用Get-Content返回的对象时,保留了原始文件中的一些文档格式信息!我们可以通过检查看到这一点$JSONBODY。我们还看到,转换为Jsonfrom[PSCustomObject也留下了很多麻烦。

为了解决这个问题,我们应该$URL使用该方法转换成一个字符串,ToString()并且也放弃转换,[psCustomObject]如下所示。

$BODY = @{
        "client" = @{
            "clientId" = "company"; "clientVersion" = "1.0"
            }; 
            "threatInfo" = @{
                "threatTypes" = "MALWARE",
                "SOCIAL_ENGINEERING",
                "THREAT_TYPE_UNSPECIFIED",
                "UNWANTED_SOFTWARE",
                "POTENTIALLY_HARMFUL_APPLICATION"; "platformTypes" = "ANY_PLATFORM"; "threatEntryTypes" = "URL"; "threatEntries" = @{
                    "url" = $URL.ToString()
                }
            }
        }
$JSONBODY = $BODY | ConvertTo-Json
于 2020-06-04T18:10:58.577 回答