Почему я получаю ошибку 403 в GetAsync от api.stackexchange?

Я пишу демо-приложение для себя, чтобы учиться, и внезапно я начал получать ошибку 403 при выполнении запросов api.stackexchange.com, и мне не удалось выполнить SureSuccessStatusCode(). Я делаю это, чтобы заполнить свою базу данных некоторыми данными тегов. (внедренный клиент просто устанавливает для автоматической декомпрессии значение GZip)

public async Task<List<TagsImport>> ImportStackOverflowTagsAsync()
{
    var tagImportsList = new List<TagsImport>();
    var httpClient = _httpClient.GetClient();

    httpClient.BaseAddress = new Uri("https://api.stackexchange.com/");
    httpClient.DefaultRequestHeaders.Accept.Clear();

    for (var i = 1; i <= 10; i++)
    {
        var response = await httpClient.GetAsync($"2.3/tags?page = {i}&pagesize=100&order=desc&sort=popular&site=stackoverflow");
        response.EnsureSuccessStatusCode();

        var responseBody = await response.Content.ReadAsStringAsync();

        var tags = JsonSerializer.Deserialize<TagsImport>(responseBody);
        tagImportsList.Add(tags);
    }

    return tagImportsList;
}

Попробовал вручную протестировать запрос, а затем протестировать предыдущие версии приложения, тест в приложении просто возвращает «System.Net.Http.HttpRequestException: код состояния ответа не указывает на успех: 403 (запрещено)». при написании вручную «https://api.stackexchange.com/2.3/tags?page=1&pagesize=100&order=desc&sort=popular&site=stackoverflow» в браузере данные возвращаются правильно.

Я что-то упускаю, чтобы это работало?

Здесь вы выполняете запрос API в цикле. не получается с первой попытки или только в последующих?

Molbac 20.08.2024 16:52

Используете ли вы ключ API? Уважаете ли вы поле backoff (когда оно отсутствует)? Попробуйте добавить небольшую задержку между вашими запросами.

double-beep 20.08.2024 17:00

Если ваша аутентификация не удалась в соответствии с кодом состояния, что-то не так с вашей аутентификацией. И я не вижу ничего в вашем коде.

Ralf 20.08.2024 17:34

Я хочу использовать API анонимно, у меня еще осталась квота, и я делаю максимум 10 запросов за одно использование. Он также терпит неудачу при самом первом запросе. Не знаю, как я могу аутентифицировать свое приложение, которое работает только локально, чтобы затем использовать API stackexchange.

Lordzio 20.08.2024 17:44

Вам обязательно нужно добавить заголовок UserAgent, как указывает один из ответов здесь. В противном случае ошибка 403 гарантирована. Затем вам следует проверить свойство has_more полученного JSON, чтобы убедиться, что вам нужно получить больше страниц. Может быть, вместо цикла увеличить счетчик и выйти из строя либо если has_more = false, либо вы достигли своей цели. Добавьте Task.Delay(100) между вызовами GetAsync() (или GetStringAsync() или GetFromJsonAsync<T>())

Jimi 20.08.2024 19:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

эта ошибка вызвана заголовком User-Agent. По сути, вам нужно добавить заголовок пользовательского агента в ваш httpClient, и он будет вести себя как браузер, получающий данные без проблем.

Сюда скопируйте и вставьте это:

httpClient.DefaultRequestHeaders.UserAgent.TryParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, например Gecko) Chrome/58.0.3029.110 Safari/537.36");

Не знаю, почему за это проголосовали отрицательно. Возможно, форматирование формулировки какое угодно. Но представленное решение, похоже, помогает, поэтому против него проголосовали.

Ralf 20.08.2024 17:57

Также прокомментировал это: здесь требуется заголовок UserAgent. Нет необходимости в CookieContainer

Jimi 20.08.2024 19:07

Из документации : «403: метод, требующий определенных разрешений, был вызван с токеном доступа, у которого отсутствуют эти разрешения». Не похоже, что вы устанавливаете токен доступа.

Похоже, вы, вероятно, можете использовать неявный поток, описанный здесь, чтобы получить его.

Другие вопросы по теме