Powershell 获取不生成调用restmethod可以处理的数组的内容

Powershell 获取不生成调用restmethod可以处理的数组的内容,powershell,safe-browsing-api,Powershell,Safe Browsing Api,作为后续操作,我不想在脚本中使用长数组,而是想从文本文件中绘制。所以我替换了这个: $URL='','' 用这个 $URL=获取内容。/urlfile.txt 或者(就我所知功能相同)这个 $URL=@(获取内容。/urlfile.txt) 但我最终得到了调用RestMethod的结果:远程服务器返回了一个错误:(400)错误请求。 结合我最后一个问题的精彩回答,我的foreach循环如下所示: foreach($URL in $URLs) { $BODY = @([pscustomob

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

$URL='',''

用这个

$URL=获取内容。/urlfile.txt

或者(就我所知功能相同)这个

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

但我最终得到了调用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!"}
}
foreach($url in $urls){

    $result = Invoke-RestMethod -Uri $url 
    #do something with $result
}
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}
}

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

使用
Invoke-RestMethod
cmdlet一次只能发出一个
Rest
请求,无法获取数组

您需要添加一个
forEach
循环,一次一个地单步遍历
$URL
,如下所示:

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!"}
}
foreach($url in $urls){

    $result = Invoke-RestMethod -Uri $url 
    #do something with $result
}
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.txt
文件,如下所示:

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!"}
}
foreach($url in $urls){

    $result = Invoke-RestMethod -Uri $url 
    #do something with $result
}
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}
}
然后您的代码将如下所示:

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!"}
}
foreach($url in $urls){

    $result = Invoke-RestMethod -Uri $url 
    #do something with $result
}
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}
}
这将从文本文件中加载
$URL
列表,然后对每个URL运行Rest请求,并将结果存储在
$result
中。最后,它将使用站点名称创建一个新的PowerShell对象,并向您显示是否存在来自的任何匹配项

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

编辑

找到了bug。当我们使用
Get Content
时,返回的对象保留了原始文件中的一些文档格式信息!我们可以通过检查
$JSONBODY
看到这一点。我们还看到,从
[PSCustomObject
Json
的转换也留下了很多污点

要解决这个问题,我们应该使用
ToString()
方法将
$URL
转换成一个字符串,并且也要放弃转换为
[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

很抱歉,我应该清楚我使用的是foreach循环,我编辑了原始问题以反映这一点。检查您的URL.txt文件是否与我刚才编辑的文件有很大不同。