首页 > 解决方案 > 从 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 的领域内。

标签: jsonpowershellgoogle-chrome-extension

解决方案


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

解决方案:

  1. 读取并解析Secure PreferencesorPreferences文件
  2. 普通扩展具有人类可读nameversion内部manifest属性
  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;
        }
    }


推荐阅读