从PowerShell中获取最终重定向的URL

时间:2020-07-22 20:08:50

标签: json powershell google-chrome-extension

我正在找到类似的答案,但并不是我所需要的。

背景故事:我正在尝试编写一个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 重定向到 < strong> https://microsoftedge.microsoft.com/addons/detail/notifier-for-github/ipnhpapgpnoadggfoepbedokgppcodkl ),实际上,Google使其更容易实现,因为它们在HTML的标记中包含了扩展名,而无需重定向。

因此,在上面的示例中,针对Google的网络商店运行该代码将导致“ GitHub的通知程序-Chrome网上应用店”

但是

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相同的URL,所以我猜测重定向是在JavaScript内发生的,但我不知道它是如何做到的。

如果有更好的方法来尝试扩展的名称(它不依赖manifest.json,因为其中一些是这样的

“名称”:“ MSG_name_releasebuild ”,

如果您有任何建议,我绝对愿意接受。否则,我立即知道的唯一方法就是尝试从可从Web客户端下载的实际HTML中获取标题。

我唯一真正的警告是,要完成我所需要的工作,我将尽可能选择保留在PowerShell领域之内。

1 个答案:

答案 0 :(得分:1)

用户个人资料中的Extensions/目录不包含解压缩的开发人员模式扩展名,并且您发现提取名称存在问题。

解决方案:

  1. 读取并解析Secure PreferencesPreferences文件
  2. 普通扩展名在name属性内具有易于理解的versionmanifest
  3. 解压缩的扩展程序需要直接读取其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;
        }
    }