PowerShell для загрузки Zip-файла из GitHub API

#windows #git #powershell #api #github

#Windows #мерзавец #powershell #API #github

Вопрос:

Я хотел бы написать сценарий PowerShell для загрузки репозитория GitHub в формате ZIP, следуя этой инструкции: https://docs.github.com/en/rest/reference/repos#contents

 $Token = 'MyUserName:MyPAT'
$Base64Token = [System.Convert]::ToBase64String([char[]]$Token)

$Headers = @{
    "Authorization" = 'Basic {0}' -f $Base64Token;
    "accept" = "application/vnd.github.v3 json"
    }

$Uri = "https://api.github.com/repos/{owner}/{repo}/zipball"
$r = Invoke-WebRequest -Headers $Headers -Uri $Uri -Method Get | Out-File "D:MyRepo.zip"
 

Код действительно загрузил zip-файл, но я получил это сообщение об ошибке, когда попытался открыть zip-файл:

 D:MyRepo.zip
The archive is either in unknown format or damaged
 

Я очень новичок в PowerShell, любая помощь приветствуется!

Комментарии:

1. Out-File создаст текстовый файл, а не двоичный файл.

Ответ №1:

Возможно, вам потребуется более внимательно ознакомиться с инструкциями по загрузке в репозиторий-архив-zip. В нем говорится, что в ответе будет 302 перенаправления на URL-адрес для загрузки. Invoke-WebRequest не будет автоматически перенаправлять, но он предоставит заголовки ответа.

Если вы измените свою последнюю строку на:

 $response = Invoke-WebRequest -Headers $Headers -Uri $Uri -Method Get 
 

вы можете просмотреть заголовки объекта $response и выдать другой Invoke-WebRequest с теми же заголовками и Uri 302:

 $RedirectedResponse = Invoke-WebRequest -Headers $Headers -Uri $RedirectedURI -Method Get 
 

$RedirectedResponse.Content будет иметь закодированное содержимое файла, которое вы можете декодировать и записывать в свою локальную файловую систему.

РЕДАКТИРОВАТЬ: я попал в систему, где у меня был доступ к GitHub, и протестировал скрипт. Я обнаружил, что первый ответ содержал массив байтов с содержимым zip-файла. Эта функциональность слишком полезна, чтобы не делиться ею! Вот скрипт, который работает для загрузки репозитория:

 $user = 'bjorkstromm'
$repo = 'depends'
$uri = "https://api.github.com/repos/$user/$repo/zipball/"
if(!$cred){$cred = Get-Credential -Message 'Provide GitHub credentials' -UserName $user}
$headers = @{
  "Authorization" = "Basic "   [convert]::ToBase64String([char[]] ($cred.GetNetworkCredential().UserName   ':'   $cred.GetNetworkCredential().Password)) 
  "Accept" = "application/vnd.github.v3 json"
}
$response = Invoke-WebRequest -Method Get -Headers $headers -Uri $uri
$filename = $response.headers['content-disposition'].Split('=')[1]

Set-Content -Path (join-path "$HOMEDesktop" $filename) -Encoding byte -Value $response.Content 
 

Комментарии:

1. Большое вам спасибо и извините, что я пропустил содержание инструкций: (