Эффективная автоматизация работы с YouTube API на Python: советы GPT-4: I need to create a title for an informational article about automating YouTube channel management with Python and API. The title should be concise, informative, and attract the target audience of programmers, analysts, and content creators.
Пройти тест: моя идеальная работа
Узнай, какая работа подходит именно тебе по характеру и способностям
Пройти тест

Эффективная автоматизация работы с YouTube API на Python: советы

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

GPT-4: I need to create a title for an informational article about automating YouTube channel management with Python and API. The title should be concise, informative, and attract the target audience of programmers, analysts, and content creators. Для кого эта статья:

  • Программисты и разработчики, заинтересованные в работе с API и автоматизации процессов
  • Владельцы и управляющие YouTube-каналами, желающие упростить управление контентом
  • Аналитики и маркетологи, стремящиеся использовать данные для улучшения стратегии продвижения и анализа вовлеченности аудитории

    Вы когда-нибудь представляли, сколько ручной работы можно избежать при управлении YouTube-каналом с помощью автоматизации? Программисты, аналитики и создатели контента ежедневно сталкиваются с необходимостью обрабатывать огромные массивы данных с видеоплатформы. Python с его лаконичным синтаксисом и мощными библиотеками идеально подходит для взаимодействия с YouTube API, позволяя автоматизировать загрузку видео, анализировать статистику канала, управлять комментариями и многое другое — всё через несколько строк кода. 🐍📊

Если вы давно хотели освоить программирование для работы с API, Обучение Python-разработке от Skypro откроет перед вами новые возможности. Курс построен на практических задачах, где вы научитесь не просто писать код, но и создавать реальные проекты с API-интеграциями. Студенты осваивают работу с YouTube API уже на третьем месяце обучения, применяя эти навыки для автоматизации и аналитики своих проектов.

Подготовка рабочего окружения для YouTube API в Python

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

Начнём с установки необходимых компонентов. Вам потребуется Python версии 3.6 или выше и несколько специализированных библиотек:

pip install google-api-python-client
pip install google-auth google-auth-oauthlib google-auth-httplib2

Библиотека google-api-python-client — это официальный клиент для работы с API Google, включая YouTube Data API v3. Остальные пакеты обеспечивают корректную авторизацию и безопасную передачу данных.

Алексей Петров, Python-разработчик и автор курсов

Однажды я столкнулся с задачей создания аналитической системы для образовательного YouTube-канала клиента с более чем 500 видео. Вручную анализировать такой объем было нереально. Я помню, как потратил почти два дня на изучение документации и настройку окружения, пока не понял простую истину: важно настроить всё правильно с самого начала.

После нескольких неудачных попыток я разработал чек-лист подготовки среды, который теперь использую во всех проектах. Виртуальное окружение стало моим спасением — оно позволяет избежать конфликтов между зависимостями разных проектов. А правильная структура проекта с отдельными файлами для хранения ключей API экономит массу времени при масштабировании.

Для изоляции проекта рекомендую использовать виртуальное окружение. Это убережёт вас от конфликтов между библиотеками разных проектов:

python -m venv youtube_api_env
source youtube_api_env/bin/activate # для Linux/Mac
youtube_api_env\Scripts\activate # для Windows

После активации виртуального окружения можно приступать к установке необходимых библиотек и созданию структуры проекта. Рекомендуемая структура проекта:

  • credentials/ — директория для хранения файлов авторизации
  • scripts/ — директория с Python-скриптами для различных задач
  • data/ — директория для хранения полученных данных
  • config.py — файл с конфигурационными параметрами
  • requirements.txt — список необходимых зависимостей

Создание файла requirements.txt позволит быстро развернуть проект на другом компьютере:

pip freeze > requirements.txt

Далее, необходимо проверить, что всё работает корректно. Напишите простой тестовый скрипт:

from googleapiclient.discovery import build
print("Окружение настроено корректно!")

Если скрипт выполняется без ошибок, значит базовое окружение готово к работе с YouTube API. 🎯

Компонент Назначение Необходимость
google-api-python-client Основная библиотека для работы с API Google Обязательно
google-auth Библиотека авторизации Обязательно
google-auth-oauthlib Поддержка OAuth 2.0 для авторизации Обязательно для авторизации от имени пользователя
google-auth-httplib2 HTTP-клиент для авторизации Рекомендуется
pandas Обработка и анализ данных Опционально (для аналитики)
matplotlib/seaborn Визуализация данных Опционально (для графиков)
Пошаговый план для смены профессии

Получение доступа к API YouTube и настройка авторизации

Получение доступа к YouTube API — это не просто техническая процедура, а важный стратегический этап, который определит возможности вашего приложения. Google предоставляет два основных типа аутентификации: с использованием API-ключа (для публичных данных) и OAuth 2.0 (для действий от имени пользователя). 🔑

Для начала работы необходимо:

  1. Создать проект в Google Cloud Console
  2. Включить YouTube Data API v3
  3. Создать учетные данные (API-ключ или OAuth клиента)

Шаги для создания проекта и получения API-ключа:

  • Перейдите на Google Cloud Console
  • Создайте новый проект или выберите существующий
  • В разделе "API и сервисы" > "Библиотека" найдите и активируйте YouTube Data API v3
  • В разделе "Учетные данные" создайте новый API-ключ
  • Ограничьте API-ключ только нужными API и IP-адресами для безопасности

Для действий от имени пользователя (загрузка видео, обновление плейлистов и т.д.) необходима авторизация OAuth 2.0:

  1. В том же разделе "Учетные данные" создайте "ID клиента OAuth"
  2. Укажите тип приложения (веб-приложение, десктопное и т.д.)
  3. Добавьте разрешенные URI перенаправления (например, http://localhost:8080/ для локальной разработки)
  4. Скачайте JSON-файл с учетными данными

Теперь используем полученные учетные данные в коде. Пример авторизации с API-ключом:

from googleapiclient.discovery import build

# Инициализация сервиса с API-ключом
API_KEY = 'ваш_API_ключ'
youtube = build('youtube', 'v3', developerKey=API_KEY)

# Теперь можно делать запросы к API
request = youtube.channels().list(
part='snippet,contentDetails,statistics',
forUsername='GoogleDevelopers'
)
response = request.execute()

print('Канал: ', response['items'][0]['snippet']['title'])
print('Подписчиков: ', response['items'][0]['statistics']['subscriberCount'])

Для OAuth 2.0 авторизации процесс немного сложнее, так как требует взаимодействия с пользователем:

import os
import pickle
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from googleapiclient.discovery import build

# Области доступа, которые требуются вашему приложению
SCOPES = ['https://www.googleapis.com/auth/youtube.force-ssl']

def get_authenticated_service():
credentials = None

# Проверяем, есть ли сохраненный токен
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
credentials = pickle.load(token)

# Если нет валидных учетных данных, получаем новые
if not credentials or not credentials.valid:
if credentials and credentials.expired and credentials.refresh_token:
credentials.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'client_secret.json', SCOPES)
credentials = flow.run_local_server(port=8080)

# Сохраняем учетные данные для следующего запуска
with open('token.pickle', 'wb') as token:
pickle.dump(credentials, token)

return build('youtube', 'v3', credentials=credentials)

# Использование функции
youtube = get_authenticated_service()

При первом запуске скрипта откроется браузер, где необходимо подтвердить доступ приложения к YouTube-аккаунту. После этого токен будет сохранен для последующих запусков.

Важно понимать ограничения API YouTube:

Тип операции Квота (единиц) Примерное количество запросов в день
Поиск видео 100 ~1,000
Получение данных о видео 1 ~100,000
Загрузка видео 1,600 ~60
Обновление метаданных видео 50 ~2,000
Работа с комментариями 1 ~100,000

Каждый проект имеет стандартную квоту в 10,000 единиц в день. Для больших проектов можно запросить увеличение квоты, обосновав необходимость.

Базовые операции с YouTube API на Python

Освоив настройку авторизации, можно переходить к базовым операциям с YouTube API. В этом разделе мы рассмотрим фундаментальные функции, которые помогут вам начать эффективно взаимодействовать с платформой через Python. 🚀

Начнём с поиска видео — одной из самых распространённых операций:

def search_videos(youtube, query, max_results=10):
"""
Поиск видео по ключевым словам
"""
search_response = youtube.search().list(
q=query,
part='id,snippet',
maxResults=max_results,
type='video' # Только видео, без каналов и плейлистов
).execute()

videos = []
for item in search_response['items']:
video = {
'id': item['id']['videoId'],
'title': item['snippet']['title'],
'channelTitle': item['snippet']['channelTitle'],
'publishedAt': item['snippet']['publishedAt'],
'thumbnail': item['snippet']['thumbnails']['high']['url']
}
videos.append(video)

return videos

# Пример использования
results = search_videos(youtube, 'Python Tutorial', max_results=5)
for video in results:
print(f"Название: {video['title']}")
print(f"Канал: {video['channelTitle']}")
print(f"Дата публикации: {video['publishedAt']}")
print(f"ID видео: {video['id']}")
print("---")

Получение информации о конкретном видео по его ID:

def get_video_details(youtube, video_id):
"""
Получение подробной информации о видео
"""
video_response = youtube.videos().list(
part='snippet,contentDetails,statistics',
id=video_id
).execute()

if not video_response['items']:
return None

video = video_response['items'][0]
details = {
'title': video['snippet']['title'],
'description': video['snippet']['description'],
'publishedAt': video['snippet']['publishedAt'],
'channelTitle': video['snippet']['channelTitle'],
'tags': video['snippet'].get('tags', []),
'viewCount': video['statistics'].get('viewCount', 0),
'likeCount': video['statistics'].get('likeCount', 0),
'commentCount': video['statistics'].get('commentCount', 0),
'duration': video['contentDetails']['duration'] # Формат ISO 8601
}

return details

# Пример использования
video_details = get_video_details(youtube, 'dQw4w9WgXcQ') # Известный ID видео
print(f"Название: {video_details['title']}")
print(f"Просмотры: {video_details['viewCount']}")
print(f"Лайки: {video_details['likeCount']}")

Работа с комментариями видео:

def get_video_comments(youtube, video_id, max_results=100):
"""
Получение комментариев к видео
"""
comments = []
next_page_token = None

while True:
comment_response = youtube.commentThreads().list(
part='snippet',
videoId=video_id,
maxResults=min(100, max_results – len(comments)), # API ограничивает 100 комментариев за запрос
pageToken=next_page_token
).execute()

for item in comment_response['items']:
comment = item['snippet']['topLevelComment']['snippet']
comments.append({
'authorDisplayName': comment['authorDisplayName'],
'text': comment['textDisplay'],
'likeCount': comment['likeCount'],
'publishedAt': comment['publishedAt']
})

next_page_token = comment_response.get('nextPageToken')

if next_page_token is None or len(comments) >= max_results:
break

return comments

# Пример использования
comments = get_video_comments(youtube, 'dQw4w9WgXcQ', max_results=5)
for comment in comments:
print(f"Автор: {comment['authorDisplayName']}")
print(f"Текст: {comment['text'][:100]}...") # Ограничиваем вывод для читаемости
print(f"Лайков: {comment['likeCount']}")
print("---")

Получение информации о канале:

def get_channel_info(youtube, channel_id=None, username=None):
"""
Получение информации о YouTube канале по ID или имени пользователя
"""
if channel_id:
request = youtube.channels().list(
part='snippet,contentDetails,statistics',
id=channel_id
)
elif username:
request = youtube.channels().list(
part='snippet,contentDetails,statistics',
forUsername=username
)
else:
return None

response = request.execute()

if not response['items']:
return None

channel = response['items'][0]
info = {
'id': channel['id'],
'title': channel['snippet']['title'],
'description': channel['snippet']['description'],
'subscriberCount': channel['statistics'].get('subscriberCount', 0),
'videoCount': channel['statistics'].get('videoCount', 0),
'viewCount': channel['statistics'].get('viewCount', 0),
'uploadsPlaylist': channel['contentDetails']['relatedPlaylists']['uploads']
}

return info

# Пример использования
channel_info = get_channel_info(youtube, username='GoogleDevelopers')
print(f"Канал: {channel_info['title']}")
print(f"Подписчиков: {channel_info['subscriberCount']}")
print(f"Всего просмотров: {channel_info['viewCount']}")

Получение видео из плейлиста (включая плейлист загрузок канала):

def get_playlist_videos(youtube, playlist_id, max_results=50):
"""
Получение видео из плейлиста
"""
videos = []
next_page_token = None

while True:
playlist_response = youtube.playlistItems().list(
part='snippet',
playlistId=playlist_id,
maxResults=min(50, max_results – len(videos)), # API ограничивает 50 видео за запрос
pageToken=next_page_token
).execute()

for item in playlist_response['items']:
video = {
'id': item['snippet']['resourceId']['videoId'],
'title': item['snippet']['title'],
'position': item['snippet']['position'],
'publishedAt': item['snippet']['publishedAt'],
'channelTitle': item['snippet']['channelTitle']
}
videos.append(video)

next_page_token = playlist_response.get('nextPageToken')

if next_page_token is None or len(videos) >= max_results:
break

return videos

# Пример использования (получение последних загруженных видео канала)
channel_info = get_channel_info(youtube, username='GoogleDevelopers')
uploads_playlist = channel_info['uploadsPlaylist']
recent_videos = get_playlist_videos(youtube, uploads_playlist, max_results=5)

for video in recent_videos:
print(f"Название: {video['title']}")
print(f"Дата публикации: {video['publishedAt']}")
print(f"Позиция в плейлисте: {video['position']}")
print("---")

Эти базовые операции покрывают большинство потребностей при работе с YouTube API. Комбинируя их, можно создавать более сложные функции, например, для анализа активности на канале, отслеживания конкурентов или мониторинга комментариев.

Помните о квотах API при разработке приложений — каждый запрос имеет свою стоимость в единицах квоты. Оптимизируйте запросы, запрашивая только необходимые данные и объединяя запросы там, где это возможно.

Автоматизация управления контентом через Python

Михаил Соколов, YouTube-маркетолог и технический консультант

Мне никогда не забыть случай с клиентом, управляющим сетью из 12 образовательных каналов. Он тратил около 30 часов в неделю только на ручную загрузку и обновление метаданных видео. Когда мы внедрили автоматизацию через Python, его команда освободила почти 80% этого времени.

Ключевым моментом стала разработка скрипта для массовой загрузки видео с автоматическим заполнением метаданных из CSV-файла. Особенно впечатляющей оказалась возможность установить расписание публикаций на месяц вперёд. После успешного тестирования мы добавили модуль для автоответов на типовые комментарии и мониторинга упоминаний. Через три месяца взаимодействие с аудиторией выросло на 47%, а охват канала увеличился почти вдвое.

Автоматизация управления контентом YouTube через Python открывает обширные возможности для создателей контента и маркетологов. Вы можете программировать весь цикл работы с видео: от загрузки и публикации до мониторинга и взаимодействия с аудиторией. 📈

Рассмотрим наиболее полезные сценарии автоматизации:

1. Загрузка видео

Для загрузки видео на YouTube требуется OAuth 2.0 авторизация с расширенными правами:

from googleapiclient.http import MediaFileUpload

def upload_video(youtube, file_path, title, description, category_id='22',
keywords=None, privacy_status='private'):
"""
Загрузка видео на YouTube

Категории (category_id):
1 – Фильмы и анимация
2 – Автомобили и транспорт
10 – Музыка
15 – Животные
17 – Спорт
22 – Люди и блоги
23 – Комедия
26 – Развлечения
27 – Образование
28 – Наука и техника
"""
body = {
'snippet': {
'title': title,
'description': description,
'categoryId': category_id
},
'status': {
'privacyStatus': privacy_status
}
}

if keywords:
body['snippet']['tags'] = keywords

media = MediaFileUpload(file_path, 
chunksize=1024*1024,
resumable=True)

# Вызов API для загрузки видео
insert_request = youtube.videos().insert(
part=','.join(body.keys()),
body=body,
media_body=media
)

response = None
while response is None:
status, response = insert_request.next_chunk()
if status:
print(f"Загружено {int(status.progress() * 100)}%")

print(f"Видео успешно загружено! ID: {response['id']}")
return response['id']

# Пример использования
video_id = upload_video(
youtube,
'my_video.mp4',
'Мое тестовое видео',
'Это описание моего тестового видео, загруженного через YouTube API',
keywords=['python', 'youtube api', 'tutorial'],
privacy_status='unlisted' # Может быть 'private', 'unlisted' или 'public'
)

Для массовой загрузки видео можно создать функцию, обрабатывающую CSV-файл с метаданными:

import csv
import time

def batch_upload_videos(youtube, csv_file_path):
"""
Массовая загрузка видео из CSV-файла

Формат CSV:
file_path,title,description,category_id,keywords,privacy_status,publish_at
"""
with open(csv_file_path, 'r', encoding='utf-8') as file:
reader = csv.DictReader(file)
for row in reader:
keywords = row.get('keywords', '').split(',') if row.get('keywords') else None

try:
video_id = upload_video(
youtube,
row['file_path'],
row['title'],
row['description'],
category_id=row.get('category_id', '22'),
keywords=keywords,
privacy_status=row.get('privacy_status', 'private')
)

# Если указана дата публикации, устанавливаем ее
if 'publish_at' in row and row['publish_at']:
youtube.videos().update(
part='status',
body={
'id': video_id,
'status': {
'privacyStatus': 'private',
'publishAt': row['publish_at'] # Формат: 2023-12-31T12:00:00Z
}
}
).execute()
print(f"Видео {video_id} будет опубликовано в {row['publish_at']}")

print(f"Успешно обработано видео: {row['title']}")
time.sleep(2) # Пауза между загрузками для избежания превышения квоты
except Exception as e:
print(f"Ошибка при обработке {row['file_path']}: {str(e)}")

return "Массовая загрузка завершена"

2. Обновление метаданных видео

Изменение заголовка, описания, тегов и других параметров существующего видео:

def update_video_metadata(youtube, video_id, title=None, description=None, 
tags=None, category_id=None, privacy_status=None):
"""
Обновление метаданных видео
"""
# Получаем текущие данные видео
video_response = youtube.videos().list(
part='snippet,status',
id=video_id
).execute()

if not video_response['items']:
return f"Видео с ID {video_id} не найдено"

video_snippet = video_response['items'][0]['snippet']
video_status = video_response['items'][0]['status']

# Обновляем только те поля, которые переданы в функцию
if title:
video_snippet['title'] = title
if description:
video_snippet['description'] = description
if tags:
video_snippet['tags'] = tags
if category_id:
video_snippet['categoryId'] = category_id

body = {
'id': video_id,
'snippet': video_snippet
}

if privacy_status:
body['status'] = {'privacyStatus': privacy_status}

# Вызов API для обновления видео
update_response = youtube.videos().update(
part='snippet,status' if privacy_status else 'snippet',
body=body
).execute()

return f"Видео {update_response['id']} успешно обновлено"

3. Управление плейлистами

Создание плейлиста и добавление видео в него:

def create_playlist(youtube, title, description='', privacy_status='private'):
"""
Создание нового плейлиста
"""
playlists_insert_response = youtube.playlists().insert(
part='snippet,status',
body={
'snippet': {
'title': title,
'description': description
},
'status': {
'privacyStatus': privacy_status
}
}
).execute()

return playlists_insert_response['id']

def add_video_to_playlist(youtube, playlist_id, video_id, position=0):
"""
Добавление видео в плейлист
"""
add_video_response = youtube.playlistItems().insert(
part='snippet',
body={
'snippet': {
'playlistId': playlist_id,
'resourceId': {
'kind': 'youtube#video',
'videoId': video_id
},
'position': position
}
}
).execute()

return add_video_response['id']

4. Работа с комментариями

Автоматическое добавление и ответы на комментарии:

def add_comment(youtube, video_id, text):
"""
Добавление комментария к видео
"""
comment_insert_response = youtube.commentThreads().insert(
part='snippet',
body={
'snippet': {
'videoId': video_id,
'topLevelComment': {
'snippet': {
'textOriginal': text
}
}
}
}
).execute()

return comment_insert_response['id']

def reply_to_comment(youtube, comment_id, text):
"""
Ответ на существующий комментарий
"""
reply_insert_response = youtube.comments().insert(
part='snippet',
body={
'snippet': {
'parentId': comment_id,
'textOriginal': text
}
}
).execute()

return reply_insert_response['id']

С помощью этих базовых функций можно создавать сложные системы автоматизации для YouTube-каналов. Например:

  • Автоматическое создание и заполнение плейлистов по тематикам
  • Планирование публикаций на недели вперед
  • Автоответчик на типовые комментарии с использованием AI для анализа текста
  • Периодическое обновление описаний видео с актуальными ссылками
  • Автоматическое добавление свежих видео в тематические плейлисты
  • Массовое редактирование заголовков для SEO-оптимизации

Важно помнить о лимитах API при создании систем автоматизации. Для больших каналов с интенсивным управлением контентом рекомендуется:

  1. Реализовать механизм отслеживания использованной квоты
  2. Добавить задержки между запросами для распределения нагрузки
  3. Обрабатывать исключения и реализовать механизм повторных попыток
  4. При необходимости запросить увеличение квоты у Google

Аналитика и работа с данными YouTube с помощью Python

Python открывает широкие возможности для аналитики данных YouTube, превращая неструктурированную информацию в ценные бизнес-инсайты. Совмещение YouTube API с аналитическими библиотеками позволяет создавать мощные инструменты для принятия решений на основе данных. 📊

Для начала рассмотрим, как собрать основные метрики канала и видео:

import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime, timedelta

def get_channel_statistics(youtube, channel_id):
"""
Получение основных статистических данных канала
"""
request = youtube.channels().list(
part='statistics,snippet',
id=channel_id
)
response = request.execute()

if not response['items']:
return None

stats = response['items'][0]['statistics']
return {
'title': response['items'][0]['snippet']['title'],
'subscriberCount': int(stats.get('subscriberCount', 0)),
'viewCount': int(stats.get('viewCount', 0)),
'videoCount': int(stats.get('videoCount', 0)),
'commentCount': int(stats.get('commentCount', 0))
}

def get_video_performance(youtube, video_ids):
"""
Получение статистики производительности для списка видео
"""
if isinstance(video_ids, str):
video_ids = [video_ids]

chunks = [video_ids[i:i+50] for i in range(0, len(video_ids), 50)] # Разбиваем на части по 50 ID

all_videos_data = []
for chunk in chunks:
request = youtube.videos().list(
part='snippet,contentDetails,statistics',
id=','.join(chunk)
)
response = request.execute()

for video in response['items']:
stats = video['statistics']
snippet = video['snippet']

# Преобразуем ISO 8601 длительность в секунды
duration = video['contentDetails']['duration']
duration_seconds = parse_duration(duration)

# Получаем основные метрики
video_data = {
'id': video['id'],
'title': snippet['title'],
'publishedAt': snippet['publishedAt'],
'viewCount': int(stats.get('viewCount', 0)),
'likeCount': int(stats.get('likeCount', 0)),
'commentCount': int(stats.get('commentCount', 0)),
'duration': duration_seconds,
'durationText': format_duration(duration_seconds)
}

# Рассчитываем производные метрики
if video_data['duration'] > 0:
# Процент просмотра (лайки / просмотры)
video_data['engagementRate'] = video_data['likeCount'] / video_data['viewCount'] if video_data['viewCount'] > 0 else 0

# Время публикации в днях
publish_date = datetime.strptime(snippet['publishedAt'], '%Y-%m-%dT%H:%M:%SZ')
days_since_publish = (datetime.now() – publish_date).days

# Просмотры в день
video_data['viewsPerDay'] = video_data['viewCount'] / max(1, days_since_publish)

# CTR и удержание требуют YouTube Analytics API

all_videos_data.append(video_data)

return pd.DataFrame(all_videos_data)

def parse_duration(duration_str):
"""Преобразует строку ISO 8601 в секунды"""
hours, minutes, seconds = 0, 0, 0

# Находим часы, минуты и секунды
if 'H' in duration_str:
hours = int(duration_str.split('H')[0].split('T')[-1])
if 'M' in duration_str:
if 'H' in duration_str:
minutes = int(duration_str.split('H')[1].split('M')[0])
else:
minutes = int(duration_str.split('T')[1].split('M')[0])
if 'S' in duration_str:
if 'M' in duration_str:
seconds = int(duration_str.split('M')[1].split('S')[0])
elif 'H' in duration_str:
seconds = int(duration_str.split('H')[1].split('S')[0])
else:
seconds = int(duration_str.split('T')[1].split('S')[0])

return hours * 3600 + minutes * 60 + seconds

def format_duration(seconds):
"""Форматирует секунды в читаемый формат времени"""
hours = seconds // 3600
minutes = (seconds % 3600) // 60
seconds = seconds % 60

if hours > 0:
return f"{hours}:{minutes:02d}:{seconds:02d}"
else:
return f"{minutes}:{seconds:02d}"

Теперь можно использовать эти функции для анализа видео канала:

# Получаем ID канала
channel_info = get_channel_info(youtube, username='GoogleDevelopers')
channel_id = channel_info['id']

# Получаем список видео канала
uploads_playlist = channel_info['uploadsPlaylist']
videos = get_playlist_videos(youtube, uploads_playlist, max_results=50)
video_ids = [video['id'] for video in videos]

# Получаем данные производительности
performance_df = get_video_performance(youtube, video_ids)

# Базовый анализ
print("Самые популярные видео по просмотрам:")
print(performance_df.sort_values(by='viewCount', ascending=False)[['title', 'viewCount', 'likeCount']].head(5))

print("\nСамые вовлекающие видео (по рейтингу лайков):")
print(performance_df.sort_values(by='engagementRate', ascending=False)[['title', 'viewCount', 'likeCount', 'engagementRate']].head(5))

# Визуализация данных
plt.figure(figsize=(12, 6))
plt.scatter(performance_df['duration'], performance_df['viewCount'])
plt.title('Зависимость просмотров от длительности видео')
plt.xlabel('Длительность (сек)')
plt.ylabel('Количество просмотров')
plt.grid(True)
plt.show()

# Анализ тенденций
performance_df['publishDate'] = pd.to_datetime(performance_df['publishedAt'])
performance_df = performance_df.sort_values('publishDate')

plt.figure(figsize=(14, 7))
plt.plot(performance_df['publishDate'], performance_df['viewsPerDay'])
plt.title('Просмотры в день в зависимости от даты публикации')
plt.xlabel('Дата публикации')
plt.ylabel('Просмотры в день')
plt.grid(True)
plt.tight_layout()
plt.show()

Для более глубокого анализа можно использовать YouTube Analytics API, который предоставляет доступ к детальной статистике канала:

def get_channel_analytics(youtube_analytics, channel_id, metrics, dimensions=None, 
start_date=None, end_date=None, filters=None, sort=None, max_results=1000):
"""
Получение аналитических данных канала из YouTube Analytics API

metrics: список метрик, например ['views', 'likes', 'subscribersGained']
dimensions: список измерений, например ['day', 'video']
start_date: начальная дата в формате YYYY-MM-DD
end_date: конечная дата в формате YYYY-MM-DD
filters: строка фильтров, например 'video==VIDEO_ID'
sort: строка сортировки, например '-views'
"""
if not start_date:
start_date = (datetime.now() – timedelta(days=30)).strftime('%Y-%m-%d')
if not end_date:
end_date = datetime.now().strftime('%Y-%m-%d')

request = youtube_analytics.reports().query(
ids=f'channel=={channel_id}',
startDate=start_date,
endDate=end_date,
metrics=','.join(metrics),
dimensions=','.join(dimensions) if dimensions else None,
filters=filters,
sort=sort,
maxResults=max_results
)

response = request.execute()

# Преобразуем результаты в DataFrame
column_headers = response['columnHeaders']
header_names = [header['name'] for header in column_headers]

df = pd.DataFrame(response['rows'], columns=header_names)

# Преобразуем типы данных
for header in column_headers:
if header['dataType'] == 'INTEGER':
df[header['name']] = pd.to_numeric(df[header['name']])
elif header['dataType'] == 'FLOAT':
df[header['name']] = pd.to_numeric(df[header['name']], errors='coerce')
elif header['dataType'] == 'STRING' and header['name'] == 'day':
df[header['name']] = pd.to_datetime(df[header['name']])

return df

Теперь можно проводить разнообразные аналитические исследования:

Тип анализа Параметры Применение
Тренды аудитории metrics=['views', 'estimatedMinutesWatched', 'averageViewDuration'], dimensions=['day'] Отслеживание роста просмотров и вовлеченности аудитории
Сравнение видео metrics=['views', 'likes', 'subscribersGained'], dimensions=['video'] Определение наиболее эффективных видео
Географический анализ metrics=['views'], dimensions=['country'] Понимание географического распределения аудитории
Источники трафика metrics=['views'], dimensions=['insightTrafficSourceType'] Оптимизация стратегии продвижения
Демография metrics=['viewerPercentage'], dimensions=['ageGroup', 'gender'] Таргетирование контента под конкретную аудиторию
Устройства metrics=['views'], dimensions=['deviceType'] Оптимизация контента для определенных устройств

Пример комплексного анализа канала:

# Настройка YouTube Analytics API (требует отдельной аутентификации)
youtube_analytics = build('youtubeAnalytics', 'v2', credentials=credentials)

# Анализ просмотров по дням
views_by_day = get_channel_analytics(
youtube_analytics, 
channel_id, 
metrics=['views', 'estimatedMinutesWatched', 'averageViewDuration'],
dimensions=['day'],
start_date=(datetime.now() – timedelta(days=90)).strftime('%Y-%m-%d')
)

# Анализ по источникам трафика
traffic_sources = get_channel_analytics(
youtube_analytics, 
channel_id, 
metrics=['views', 'estimatedMinutesWatched'],
dimensions=['insightTrafficSourceType'],
sort='-views'
)

# Анализ географии просмотров
geography = get_channel_analytics(
youtube_analytics, 
channel_id, 
metrics=['views', 'estimatedMinutesWatched'],
dimensions=['country'],
sort='-views'
)

# Визуализация результатов
plt.figure(figsize=(15, 7))
plt.plot(views_by_day['day'], views_by_day['views'], 'b-', linewidth=2)
plt.fill_between(views_by_day['day'], views_by_day['views'], alpha=0.3)
plt.title('Просмотры канала за последние 90 дней')
plt.xlabel('Дата')
plt.ylabel('Просмотры')
plt.grid(True)
plt.tight_layout()
plt.show()

# Визуализация источников трафика
plt.figure(figsize=(12, 8))
plt.barh(traffic_sources['insightTrafficSourceType'], traffic_sources['views'])
plt.title('Источники трафика')
plt.xlabel('Просмотры')
plt.tight_layout()
plt.show()

# Визуализация географии просмотров (топ-10 стран)
top_countries = geography.head(10)
plt.figure(figsize=(12, 8))
plt.barh(top_countries['country'], top_countries['views'])
plt.title('Топ-10 стран по просмотрам')
plt.xlabel('Просмотры')
plt.tight_layout()
plt.show()

Для создания автоматизированной аналитической системы можно объединить сбор данных, анализ и визуализацию в единый пайплайн. Используйте библиотеки для отправки отчетов по электронной почте или интеграции с BI-системами:

def generate_weekly_report(youtube, youtube_analytics, channel_id, email=None):
"""
Генерация и отправка еженедельного отчета
"""
from io import BytesIO
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication

# Получение данных
channel_info = get_channel_info(youtube, channel_id=channel_id)

start_date = (datetime.now() – ti

Загрузка...