API Github отвечает 403 при использовании функции запроса запроса

#node.js #request #github-api

#node.js #запрос #github-api

Вопрос:

Я пытаюсь сделать запрос к API github. Вот мой запрос:

 var url = 'https://api.github.com/'   requestUrl   '/'   repo   '/';

request(url, function(err, res, body) {
    if (!err amp;amp; res.statusCode == 200) {

        var link = "https://github.com/"   repo;
        opener(link);
        process.exit();

    } else {
        console.log(res.body);
        console.log(err);
        console.log('This '   person   ' does not exist');
        process.exit();
    }

});
  

Это то, что я получаю за свой ответ:

 Request forbidden by administrative rules. Please make sure your request has a User-Agent header (http://developer.github.com/v3/#user-agent-required). Check https://developer.github.com for other possible causes.
  

Я использовал точно такой же код в прошлом, и он работал. Запрос не выдает ошибок. Теперь я не понимаю, почему я получаю 403 (запрещено)? Какие-либо решения?

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

1. Добавьте заголовок пользовательского агента или просто используйте модули в npm для API github.

Ответ №1:

Как объясняется в URL, указанном в ответе, запросы к API GitHub теперь требуют User-Agent заголовка:

Все запросы API ДОЛЖНЫ содержать допустимый User-Agent заголовок. Запросы без User-Agent заголовка будут отклонены. Мы просим вас использовать ваше имя пользователя на GitHub или имя вашего приложения в User-Agent качестве значения заголовка. Это позволяет нам связаться с вами, если возникнут проблемы.

В request документации конкретно показано, как добавить User-Agent заголовок к вашему запросу:

 var request = require('request');

var options = {
  url: 'https://api.github.com/repos/request/request',
  headers: {
    'User-Agent': 'request'
  }
};

function callback(error, response, body) {
  if (!error amp;amp; response.statusCode == 200) {
    var info = JSON.parse(body);
    console.log(info.stargazers_count   " Stars");
    console.log(info.forks_count   " Forks");
  }
}

request(options, callback);
  

Ответ №2:

HttpClient Это можно сделать с помощью C # и с помощью (протестировано на последней версии .Net Core 2.1):

 using (HttpClient client = new HttpClient())
{
    client.DefaultRequestHeaders.Accept.Add( new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

    client.DefaultRequestHeaders.UserAgent.TryParseAdd("request");//Set the User Agent to "request"

    using (HttpResponseMessage response = client.GetAsync(endPoint).Result)
    {
        response.EnsureSuccessStatusCode();
        responseBody = await response.Content.ReadAsByteArrayAsync();
    }
}
  

Спасибо

Ответ №3:

Если Github API отвечает с кодом состояния: 403, это просто означает, что ваш предел выборки API был превышен, пожалуйста, подождите 1 минуту и снова выполните выборку, после чего вы получите свои данные,

Ответ №4:

ANGULAR

У меня была та же проблема, когда я превысил ограничение скорости 403. Я попытался настроить Authorization заголовок, используя new HttpHeaders из angular / common, но заголовок по-прежнему не удался. Код, который не удался, является:

 getUser(username: string): Observable<any> {
    this.headers.set('Authorization', `token ${this.ACCESS_TOKEN}`);
    const endpoint = `https://api.github.com/users/${username}`;
    return this.http.get(endpoint, {
      headers: this.headers
    }).pipe(response => {
      return response
    });
  }
  

Код, который сработал:

 getUser(username: string): Observable<any> {
    const endpoint = `https://api.github.com/users/${username}`;
    return this.http.get(endpoint, {
      headers: {
        Authorization: `token ${this.ACCESS_TOKEN}`,
      }
    }).pipe(response => {
      return response
    });
  }
  

В этом случае я напрямую устанавливаю заголовок в сегменте заголовков запроса.

Ответ №5:

Это отвечает на вопрос и в качестве бонуса показывает вам, как проверить, есть ли новый выпуск

Вам нужно добавить a User-agent в Request

request.UserAgent = "YourRepoName";

     internal class Tag
    {
        [JsonProperty("tag_name")]
        public string TagName { get; set; }
    }

    /// <summary>
    /// Use the Github API to Check for Updates
    /// </summary>
    /// <returns></returns>
    public static Task<string> CheckUpTodate()
    {
        try
        {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api.github.com/repos/HypsyNZ/BinanceTrader.NET/releases");
            request.UserAgent = new Random(new Random().Next()).ToString();

            var response = request.GetResponse();
            if (response != null)
            {
                StreamReader reader = new StreamReader(response.GetResponseStream());

                string readerOutput = reader.ReadToEnd();

                List<Tag>? deserializedString = JsonConvert.DeserializeObject<List<Tag>>(readerOutput);
                if (deserializedString != null)
                {
                    if (deserializedString.Count > 0)
                    {
                        Tag tagOnFirstRelease = deserializedString.FirstOrDefault();
                        if ("v"   ObservableObject.Version == tagOnFirstRelease.TagName)
                        {
                            return Task.FromResult("Up To Date");
                        }
                        else
                        {
                            return Task.FromResult("Update Available: "   tagOnFirstRelease.TagName);
                        }
                    }
                }
            }
        }
        catch (Exception ex)
        {
            // Error
        }

        return Task.FromResult("Unknown");
    }