Ошибка “недопустимый параметр фильтра” при запросе на большое количество видео

Вопрос или проблема

Я пытаюсь извлечь некоторые данные из всех видео на канале YouTube (2055 видео). Я сохранил каждый ID видео в массиве video_ids[] и отправляю запрос на получение данных о всех 2055 видео в следующем коде:

all_video_data = []

request = youtube.videos().list(
        part="snippet,contentDetails,statistics",
        id=video_ids
    )
response = request.execute()

for video in response['items']:
    data_keep = {'snippet': ['channelTitle', 'title', 'publishedAt'],
                 'statistics': ['viewCount', 'likeCount', 'commentCount'],
                 'contentDetails': ['duration']
                }
    video_data = {}
    video_data['video_id'] = video['id']

    for k in data_keep.keys():
        for v in data_keep[k]:
            video_data[v] = video[k][v]

    all_video_data.append(video_data)

ОШИБКА:

HttpError                                 Traceback (most recent call last)
Cell In[36], line 7
      1 all_video_data = []
      3 request = youtube.videos().list(
      4         part="snippet,contentDetails,statistics",
      5         id=video_ids[0:999]
      6     )
----> 7 response = request.execute()
      9 for video in response['items']:
     10     data_keep = {'snippet': ['channelTitle', 'title', 'publishedAt'],
     11                  'statistics': ['viewCount', 'likeCount', 'commentCount'],
     12                  'contentDetails': ['duration']
     13                 }

File ~\AppData\Local\Programs\Python\Python312\Lib\site-packages\googleapiclient\_helpers.py:130, in positional.<locals>.positional_decorator.<locals>.positional_wrapper(*args, **kwargs)
    128     elif positional_parameters_enforcement == POSITIONAL_WARNING:
    129         logger.warning(message)
--> 130 return wrapped(*args, **kwargs)

File ~\AppData\Local\Programs\Python\Python312\Lib\site-packages\googleapiclient\http.py:938, in HttpRequest.execute(self, http, num_retries)
    936     callback(resp)
    937 if resp.status >= 300:
--> 938     raise HttpError(resp, content, uri=self.uri)
    939 return self.postproc(resp, content)

HttpError: <HttpError 400 when requesting https://youtube.googleapis.com/youtube/v3/videos returned "The request specifies an invalid filter parameter.". Details: "[{'message': 'The request specifies an invalid filter parameter.', 'domain': 'youtube.parameter', 'reason': 'invalidFilters', 'location': 'parameters.', 'locationType': 'other'}]"> 

Я понимаю, что ошибка в моем запросе, но не знаю, как это исправить.

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

Ответ или решение

Ваш вопрос о получении данных о видеороликах на YouTube с использованием API и ошибкой "недопустимый параметр фильтра" очень актуален. Давайте разберёмся, как можно решить эту проблему.

Причина ошибки

Ошибка, с которой вы столкнулись, скорее всего, связана с ограничением API по количеству идентификаторов видео, которые можно передавать в одном запросе. YouTube API позволяет отправлять не более 50 идентификаторов видео за один запрос к методу videos().list(). Если вы пытаетесь передать в запросе больше 50 идентификаторов, API возвращает ошибку.

Как исправить

Чтобы избежать этой ошибки, вам нужно разбивать массив video_ids на более мелкие куски (по 50 идентификаторов) и отправлять отдельный запрос для каждой группы. Вот как можно это реализовать:

all_video_data = []  # Список для хранения всех данных о видео

# Функция для разбивки списка на подсписки фиксированной длины
def chunk_list(lst, chunk_size):
    for i in range(0, len(lst), chunk_size):
        yield lst[i:i + chunk_size]

# Разбиваем массив video_ids на куски по 50
for video_id_chunk in chunk_list(video_ids, 50):
    request = youtube.videos().list(
        part="snippet,contentDetails,statistics",
        id=','.join(video_id_chunk)  # Объединяем идентификаторы в строку
    )

    response = request.execute()  # Выполняем запрос

    for video in response['items']:
        data_keep = {
            'snippet': ['channelTitle', 'title', 'publishedAt'],
            'statistics': ['viewCount', 'likeCount', 'commentCount'],
            'contentDetails': ['duration']
        }

        video_data = {'video_id': video['id']}
        for k in data_keep.keys():
            for v in data_keep[k]:
                video_data[v] = video[k][v]

        all_video_data.append(video_data)  # Добавляем данные видео в общий список

# Теперь all_video_data содержит данные для всех видео

Пояснение к коду

  1. Функция chunk_list: Эта функция разбивает исходный список идентификаторов видео на части заданного размера (в данном случае 50).

  2. Цикл по частям video_ids: Мы проходимся по всем частям и для каждой части формируем запрос к API.

  3. Объединение идентификаторов: Мы используем метод .join() для преобразования списка идентификаторов в строку, разделённую запятыми, требуемую для API.

  4. Обработка ответа: После выполнения запроса мы обрабатываем ответ, извлекая необходимые данные о каждом видео и добавляя их в общий список.

Заключение

Следуя данным рекомендациям, вы сможете избежать ошибки "недопустимый параметр фильтра" и корректно извлечь данные о видео с канала YouTube, обрабатывая их в рамках ограничений API. Если у вас возникнут дополнительные вопросы или сложности, не стесняйтесь задавать их!

Оцените материал
Добавить комментарий

Капча загружается...