Как исправить:
URL-адрес изменен на GET /repos/:owner/:repo/:archive_format/:ref
. См. https://developer.github.com/v3/repos/contents/#get-archive-link
Для частных репозиториев эти ссылки являются временными и истекают через пять минут.
GET / repos /: owner /: repo /: archive_format /: ref
Вы не должны передавать учетные данные с помощью обычной аутентификации. Вместо этого вы должны создать токен , следуя официальным документам. см. https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line
- Наконец, вам нужно передать дополнительный заголовок
User-Agent
. Это требуется GitHub API. См. https://developer.github.com/v3/#user-agent-required: Все запросы API ДОЛЖНЫ содержать действительный заголовок User-Agent.
Демо
public class GitHubRepoApi{
public string EndPoint {get;} = "https://api.github.com/repos";
public async Task DownloadArchieveAsync(string saveAs, string owner, string token, string repo,string @ref="master",string format="zipball")
{
var url = this.GetArchieveUrl(owner, repo, @ref, format);
var req = this.BuildRequestMessage(url,token);
using( var httpClient = new HttpClient()){
var resp = await httpClient.SendAsync(req);
if(resp.StatusCode != System.Net.HttpStatusCode.OK){
throw new Exception($"error happens when downloading the {req.RequestUri}, statusCode={resp.StatusCode}");
}
using(var fs = File.OpenWrite(saveAs) ){
await resp.Content.CopyToAsync(fs);
}
}
}
private string GetArchieveUrl(string owner, string repo, string @ref = "master", string format="zipball")
{
return $"{this.EndPoint}/{owner}/{repo}/{format}/{@ref}"; // See https://developer.github.com/v3/repos/contents/#get-archive-link
}
private HttpRequestMessage BuildRequestMessage(string url, string token)
{
var uriBuilder = new UriBuilder(url);
uriBuilder.Query = $"access_token={token}"; // See https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line
var req = new HttpRequestMessage();
req.RequestUri = uriBuilder.Uri;
req.Headers.Add("User-Agent","My C# Client"); // required, See https://developer.github.com/v3/#user-agent-required
return req;
}
}
Тест:
var api = new GitHubRepoApi();
var saveAs= Path.Combine(Directory.GetCurrentDirectory(),"abc.zip");
var owner = "newbienewbie";
var token = "------your-----token--------";
var repo = "your-repo";
var @ref = "6883a92222759d574a724b5b8952bc475f580fe0"; // will be "master" by default
api.DownloadArchieveAsync(saveAs, owner,token,repo,@ref).Wait();