티스토리 뷰
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
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개의 추가 요청 비용이 발생하는 것이다. 정말 필요한 정보가 아니라면 사용하지 않는편이 유리해보인다.
- Total
- Today
- Yesterday
- 통계의 오류 마이클조던
- 유투브 댓글 조회
- gcp app engine 리디렉션 규칙 관리
- 스트리밍 채팅 API
- xe제로보드
- 아프리카tv 댓글
- 최종학력 별 임금격차
- xe xampp 설치
- 구스피크
- app engine 커스텀 서브 도메인 추가
- s24 장점
- 치지직 댓글
- 수집
- 아프리카TV 채팅
- 유투브 댓글
- xampp 설치
- API
- dispath.yaml 파일 구문
- 스트리밍 댓글 API
- ai 서비스 기획
- goosepeak
- xe 개발 셋팅
- blue ocean shift
- copilot 서비스 기획
- 유투브 채팅
- 레드오션 반대
- 치지직 채팅
- dispatch.yaml 사용방법
- xe 환경설치
- window 셋팅
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |