Powershell 获取不生成调用restmethod可以处理的数组的内容
作为后续操作,我不想在脚本中使用长数组,而是想从文本文件中绘制。所以我替换了这个: $URL='','' 用这个 $URL=获取内容。/urlfile.txt 或者(就我所知功能相同)这个 $URL=@(获取内容。/urlfile.txt) 但我最终得到了调用RestMethod的结果:远程服务器返回了一个错误:(400)错误请求。 结合我最后一个问题的精彩回答,我的foreach循环如下所示: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
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文件是否与我刚才编辑的文件有很大不同。