Если вы захотите получить все комментарии на канале (своем или чужом) по channelId канала через YouTube Data API, то вероятнее всего первое что вы найдете будет метод comments.list и … получить им комментарии на канале не получится. Потому что этот метод предназначен для получения содержимого комментариев (текста, даты публикации, автора и т.д.) по id комментариев. Также comments.list может отдать список ответов на комментарий parentId который вы можете передать. Но получить список комментариев к каналу, видео, шортсу или посту этот метод отдать не может.
Так как получить все комментарии на канале через YouTube API
Для этого есть метод commentThreads.list — именно он может отдать комментарии к видео или к каналу. Принцип его работы таков:
- он отдает комментарии верхнего уровня
- даже если у комментария нет ответов и по сути этот комментарий не является веткой комментариев (comments thread), мы можем получить его методом commentThreads.list
- может отдать ответы к комментариям верхнего уровня
- может отдать комментарии ко всему каналу (allThreadsRelatedToChannelId, не channelId !!! ) и к конкретному видео (videoId)
- можно получить треды комментов, где упоминается поисковая фраза (searchTerms)
За один запрос можно получить до maxResults=100 комментариев верхнего уровня и неограниченное (но это не точно!) количество вложенных комментариев. Сейчас YouTube поддерживает только один уровень вложенности, поэтому проблем ветвления нет. Чтобы получить более 100 тредов комментариев
Видео про получение списка комментариев на YouTube Data API + Python
Как обычно я снял видео для своего канала Azzrael Code, где показал работу commentThreads.list более подробно, разобрал ответ, вообщем посмотри:
Исходный код на Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
import json import time import _creds from googleapiclient.discovery import build def snippet_to_dict(comment_id, channel_id, snippet, parent_comment_id=False): t = { 'comment_id':comment_id, 'parent_id':parent_comment_id, 'video_id': snippet['videoId'], 'text':snippet['textOriginal'], 'author':snippet['authorDisplayName'], 'author_channel_id' : snippet['authorChannelId']['value'] if 'authorChannelId' in snippet else False, 'date' : snippet['publishedAt'], 'likes': snippet['likeCount'] } t['author_comment'] = t['author_channel_id'] and t['author_channel_id'] == channel_id return t if __name__ == '__main__': print("** Hola Hey, Azzrael Code YT subs!!!\n") channel_id = 'UCf6kozNejHoQuFhBDB8cfxA' # channel_id = 'UC4JX40jDee_tINbkjycV4Sg' # tim service = build('youtube', 'v3', developerKey=_creds.yt_api_key) # тут _creds.yt_api_key замени на свой API Key из GCC args = { 'allThreadsRelatedToChannelId':channel_id, 'part':'id,snippet,replies', 'maxResults':100 } comments = [] for page in range(0, 100): # большк 10К запросов делать нет смысла - упрусь в квоту r = service.commentThreads().list(**args).execute() # print(json.dumps(r)) print(f"{page}/9 000 = {r['pageInfo']['totalResults']}") if page % 90 == 0: time.sleep(2) # Queries per minute per user 180,000 - но пусть будет for top_level in r['items']: comment_id = top_level['snippet']['topLevelComment']['id'] snippet = top_level['snippet']['topLevelComment']['snippet'] comments.append(snippet_to_dict(comment_id, channel_id, snippet)) if 'replies' in top_level: for reply in top_level['replies']['comments']: comments.append(snippet_to_dict(reply['id'], channel_id, reply['snippet'], comment_id)) args['pageToken'] = r.get('nextPageToken') if not args['pageToken']: break # [print(c) for c in comments] with open(f"lists/{channel_id}.csv", "w+", encoding="utf-8") as f: for comment in comments: f.write(";".join([str(v) for v in comment.values()]) + "\n") |
В зависимостях только
google-api-python-client .
Обратите внимание что при получении всех комментариев через YouTube API на большом канале возможно придется отправить много запросов. И, даже не смотря на малый расход квот при commentThreads.list (1 юнит на запрос), можно запросто упереться в лимит (10000 запросов в сутки).
Если вам интересна тема YouTube Data API, то посмотрите плейлист YouTube API, особенно если раньше вы не работали с Google API.
Трэвис 2023-12-03