티스토리 뷰

카테고리 없음

Youtube Data API 댓글 조회

구스피크 2024. 5. 6. 16:54
728x90

 

Python을 통해 Youtube Data API 댓글 데이터를 조회해오는 코드를 작성하기에 앞서

Youtube Data API의 응답구조를 자세히 알아보자.

 

1. 수집코드

수집 코드는 다음과 같다.

from googleapiclient.discovery import build

api_key = 'gcp 발급 API Key'
video_id = '수집하고자하는 Youtube 영상 id'

api_obj = build('youtube', 'v3', developerKey=api_key)
response = api_obj.commentThreads().list(part='snippet,replies', videoId=video_id, maxResults=100).execute()

 

 

2. 응답 데이터 구조

다음은 response의 구조다

  • kind = {str} 'youtube#commentThreadListResponse'
  • etag = {str} '해당 response의 etag'
  • pageInfo = {dict: 2} 
  • Items = {list: 37 }

response에서 주목할 데이터는 pageInfo와 Items이다. 

pageInfo {dict}는 다음과 같은 구조이다.

  • totalResults = {int} 37
  • resultsPerPage = {int} 100

Items는 댓글목록을 포함한 list이다.댓글 하나를 Item이라 칭할 때, Item의 구조는 다음과 같다.

  • kind  = {str} 'youtube#commentThread'
  • etag = {str} '해당 댓글의 etag'
  • id = {str} '해당 댓글의 id'
  • snippet = {dict: 6}
  • replies = {dict: 1} 대댓글이 없으면 해당 컬럼 없음

replies 와 snippet이 중요하다. 먼저 snippet의 구조를 확인하고 그 뒤에 replies를 확인한다.

snippet은 아래와 같은 구조를 취한다.

  • channelId = {str} '해당 댓글이 작성된 체널의 id'
  • videoId = {str}  '해당 댓글이 작성된 영상의 id'
  • canReply = {bool} 대댓글작성가능여부
  • totalReplyCount = {int} 대댓글 갯수
  • isPublic = {bool} 공개여부
  • topLevelComment = {dict: 4}

topLevelCommnet를 통해 더 자세한 댓글의 내용을 확인할 수 있다.

  • kind  = {str} 'youtube#comment'
  • etag = {str} '해당 댓글의 etag'
  • id = {str} '해당 댓글의 id'
  • snippet = {dict: 13}

한번더 snippet을 봐야한다.

  • channelId = {str} '해당 댓글이 작성된 체널의 id'
  • videoId = {str}  '해당 댓글이 작성된 영상의 id'
  • textDisplay = {str}  '[거인의시간 구매링크]<br> 교보: <a href="https://shorturl.at/qtP48">https://shorturl.at/qtP48</a>'
  • textOrigina  = {str}  '[거인의시간 구매링크]\n 교보: https://shorturl.at/qtP48'
  • authorDisplayName = {str}  '@작성자닉네임'
  • authorProfileImageUrl = {str} 'https://작성자프로필이미지url'
  • authorChannelUrl = {str} 'http://www.youtube.com/@작성자닉네임'
  • authorChannelId = {dict: 1 } {value: 'channel id'}
  • canRate = {bool} True 시청자의 댓글 평가 가능여부
  • viewerRating = {str} 'none' || 'like' dislike는 존재하지 않고, 시청자들이 우호적으로 봤으면 like 그외에는 모두 none이라고 함 (공식문서 참고)
  • likeCount = {int} 2 좋아요 갯수
  • publishedAt = {str} '2024-03-06T00:39:19Z' 게시된 날짜
  • updatedAt = {str} '2024-03-06T00:39:19Z' 가장 최근 수정된 날짜

여기까지 내려와야 공식문서에서 확인할 수 있는 comment의 구조를 확인할 수 있다.

https://developers.google.com/youtube/v3/docs/comments?hl=ko#resource

 

Comments  |  YouTube Data API  |  Google for Developers

이 페이지는 Cloud Translation API를 통해 번역되었습니다. Comments 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. comment 리소스에는 단일 YouTube 댓글에 대한 정보

developers.google.com

 

 

replies의 구조는 아래와 같다.

  • comments = {list: 3}

대댓글 데이터가 comments에 list 형태로 들어간 형태이며 이를 comment라고 지칭하여 comment를 살펴보면 topLevelCommnet 의 구조와 동일하다

 

3. 응답 데이터 예시 JSON

위에서 풀이한 내용을 정리하면 아래와 같은 예시 Json 으로 정리할 수 있다.

response = {
	kind: 'youtube#commentThreadListResponse',
    etag: 'etag',
    pageInfo: {
    	totalResults: 37,
        resultsPerPage: 100
    },
    Items: [
    	{
        	kind: 'youtube#commentThread',
            etag: 'etag',
            id: 'id',
            snippet: {
            	channelId: 'channelId',
                videoId: 'videoId',
                canReply: True,
                totalReplyCount: 3,
                isPublic: True,
                topLevelComment: {
                	kind: 'youtube#comment',
                    etag: 'etag',
            		id: 'id',
                    snippet: {
                        channelId: 'channelId',
                        videoId: 'videoId',
                    	textDisplay: '[거인의시간 구매링크]<br> 교보: <a href="https://shorturl.at/qtP48">https://shorturl.at/qtP48</a>',
                        textOriginal: '[거인의시간 구매링크]\n 교보: https://shorturl.at/qtP48',
                        authorDisplayName: '@작성자닉네임',
                        authorProfileImageUrl: 'https://작성자프로필이미지url',
                        authorChannelUrl: 'http://www.youtube.com/@작성자닉네임',
                        authorChannelId: {
                        	value: 'channel id'
                        },
                        canRate: True,
                        viewerRating: 'none',
                        likeCount: 2,
                        publishedAt: '2024-03-06T00:39:19Z',
                        updatedAt: '2024-03-06T00:39:19Z'
                    }
                }
            },
            replies: {
            	comments: [
                	kind: 'youtube#comment',
                    etag: 'etag',
            		id: 'id',
                    snippet: {
                        channelId: 'channelId',
                        videoId: 'videoId',
                    	textDisplay: '대댓글이요',
                        textOriginal: '대댓글이요',
                        authorDisplayName: '@작성자닉네임',
                        authorProfileImageUrl: 'https://작성자프로필이미지url',
                        authorChannelUrl: 'http://www.youtube.com/@작성자닉네임',
                        authorChannelId: {
                        	value: 'channel id'
                        },
                        canRate: True,
                        viewerRating: 'none',
                        likeCount: 1,
                        publishedAt: '2024-03-06T00:39:19Z',
                        updatedAt: '2024-03-06T00:39:19Z'
                    }
                ]
            } // 대댓글이 없을 경우 해당 프로퍼티 없음
        }
    ]
}

 

 

4. 특정 정보 확인

목적에 알맞는 정보를 확인할 수 있는지 한가지씩 확인해본다

4-1. 업로더가 좋아요를 눌렀는지 여부

화면에서는 보이는데, 해당 api로는 확인이 어렵다. likeCount만 있을 뿐, 체널주인이 하트표시를 했는지에 대한 정보가 포함되어 있지 않다.

 

4-2. 상단고정 여부

데이터에서 특정 프로퍼티로서 상단고정된 댓글인지는 알려주지 않는다. 다만 위 수집코드로 요청했을 때 응답데이터는 publishedAt 혹은 updatedAt 기준으로 최신순으로 데이터가 조회되는 것으로 확인된다. 이 때, 상단고정된 데이터는response.Items 의 첫번째 데이터로 들어온다. 해당 데이터가 response.Items[0] 의 publishedAt이 response.Items[1] 의 publishedAt 보다 앞서있다면 해당 데이터는 상단고정된 데이터로 추정할 수 있다.

 

4-3. 댓글 작성자 국가정보

일단 해당 api에서 댓글 작성자의 국가 데이터가 직접적으로 확인되지는 않는다. 다만 작성자의 프로필 이미지와 작성자의 id 정보를 제공해주니, 이 데이터를 기반으로 Youtube의 다른 데이터와 조합한다면 수집 가능성이 있다. 하지만, 1일기준 10000 unit이라는 제한된 요청만 가능한데 댓글마다 각 댓글 작성자의 국가정보를 확인하려면 1000개의 댓글을 위해 1000개의 추가 요청 비용이 발생하는 것이다. 정말 필요한 정보가 아니라면 사용하지 않는편이 유리해보인다.

 

 

728x90