json - 从 PowerShell 中获取最终重定向 URL
问题描述
我正在寻找类似的答案,但不完全是我所需要的。
背景故事:我正在尝试编写一个 powershell 脚本,该脚本将抓取 Chrome 和 Microsoft Edge(基于铬的)扩展目录并将名称、ID 和版本输出到自定义 WMI 类中,以便我的端点管理代理可以准确反映库存记录中用户安装的扩展。
在 Chrome 中,即使 manifest.json 不包含人类可读的“名称”属性,这也相当容易,因为您可以简单地获取 ID(这是该扩展程序的顶级文件夹)并运行以下命令:
<#
# Chrome URL's are "https://chrome.google.com/webstore/detail/" + obj.ID
# Edge URL's are "https://microsoftedge.microsoft.com/addons/detail/" + obj.ID
#>
$url = "https://chrome.google.com/webstore/detail/" + obj.ID
$webclient = New-Object System.Net.WebClient
try
{
$data = $wc.downloadstring($url)
$titletag = [regex] '(?<=<title>)([\S\s]*?)(?=</title>)'
$title = $titletag.Match($data).value.trim()
$obj.Name = $title
}
catch{
$obj.Name = "Unknown - Please search manually"
}
当您将上述链接放在浏览器地址栏中时,Edge 和 Chrome 网上商店都会重定向(例如,https://microsoftedge.microsoft.com/addons/detail/ipnhpapgpnoadggfoepbedokgppcodkl重定向到https://microsoftedge.microsoft.com/addons /detail/notifier-for-github/ipnhpapgpnoadggfoepbedokgppcodkl),Google 实际上使这更容易,因为它们在 HTML 的标签中包含扩展的标题而无需重定向。
因此,在上面的示例中,针对 Google 的网上商店运行该代码将导致“Notifier for GitHub - Chrome Web Store”
然而,Edge 没有,它作为标题标签返回的唯一内容是“Microsoft Edge Addons”
我试图尝试使用以下代码找到重定向的 URL:
Function Get-RedirectedUrl {
Param (
[Parameter(Mandatory=$true)]
[String]$url
)
$request = [System.Net.WebRequest]::Create($url)
$request.AllowAutoRedirect=$true
$request.UserAgent = 'Mozilla/5.0 (Windows NT; Windows NT 10.0; en-US) AppleWebKit/534.6 (KHTML, like Gecko) Chrome/7.0.500.0 Safari/534.6'
try
{
$response = $request.GetResponse()
$response.ResponseUri.AbsoluteUri
$response.Close()
}
catch
{
"Error: $_"
}
}
$url = 'https://microsoftedge.microsoft.com/addons/detail/gmgoamodcdcjnbaobigkjelfplakmdhh'
Get-RedirectedUrl -URL $url
但唯一能做的就是吐出我提供的同一个 URL,所以我猜测重定向是在 JavaScript 中以某种方式发生的,但我不知道它是如何做到的。
如果有更好的方法来尝试抓取扩展名(不依赖于 manifest.json,因为其中一些是这样的
"name": " MSG_name_releasebuild ",
如果你有建议,我绝对愿意接受。否则,我立即知道的唯一方法是尝试从可以从 webclient 下载的实际 HTML 中获取标题。
我唯一真正需要注意的是,为了完成我所需要的,如果可能的话,我非常希望留在 PowerShell 的领域内。
解决方案
用户配置文件中的Extensions/
目录不包含解压缩的开发人员模式扩展,并且您发现提取名称存在问题。
解决方案:
- 读取并解析
Secure Preferences
orPreferences
文件 - 普通扩展具有人类可读
name
的version
内部manifest
属性 - 解压后的扩展需要直接读取它们的 manifest.json,并且可以选择扩展扩展
_locales
目录中的消息 ID。
'Secure Preferences', 'Preferences' |
%{ gc ($env:LOCALAPPDATA + '/Google/Chrome/User Data/Default/' + $_) -raw } |
ConvertFrom-Json |
?{ $_.extensions.settings } |
%{ $_.extensions.settings.PSObject.Properties } |
%{
$info = $_.Value
$name = $info.manifest.name
$version = $info.manifest.version
if (!$name -or !$version) {
Push-Location $info.path
$manifest = gc 'manifest.json' -raw | ConvertFrom-Json
$name = $manifest.name
$version = $manifest.version
if ($name -cmatch '^__MSG_(\w+?)__$') {
$msgId = $Matches[1]
$msgFile = '_locales/' + $manifest.default_locale + '/messages.json'
$name = (gc -raw $msgFile | ConvertFrom-Json).$msgId.message
}
Pop-Location
}
[PSCustomObject]@{
id=$_.Name;
name=$name;
version=$version;
}
}
推荐阅读
- python - 在一个数据库命中评估整个 django 查询集
- javascript - 带有链接列表的响应式打字新闻自动收报机
- awk - 改变大宗和小宗案件
- php - 如何 JSON 编码多维数组?
- javascript - 如何通过按下按钮(chart.js)制作新图表?
- c# - 在 WCF 中使用 X509 证书签署 SOAP 正文和时间戳
- postgresql - 将 PostgreSQL 与 App Engine 标准结合使用
- php - 删除价格小数的最后一位。WordPress(PHP)
- http - 获取 Erreur HTTP 403.4 - 将 IIS 7.0 配置为使用 SSL 后被禁止
- javascript - 加载所有内容后显示具有多个 ng-repeat 的表单