#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. Большое вам спасибо и извините, что я пропустил содержание инструкций: (