Youtube APIについて
やりたい事はこの通り
Youtube APIを使って、動画を特定のキーワードで検索し、 動画それぞれの視聴数・like/unlikeの数などを取得したい。
これを実現するには、search/list APIで動画のIDを取得し、個々の動画のlike/dislikeの情報を videos APIで取得する必要があるようだ。
各APIについての概要はこちらから。 [:contents]
search API
search APIのレスポンスには、動画のIDやサムネイルの情報などの基本的な情報しか含まれていないため、動画の詳細な情報はvideosAPIにて個別に取得する必要がある。
ドキュメントURL: https://developers.google.com/youtube/v3/docs/search/list
APIエンドポイントURL:
GET https://www.googleapis.com/youtube/v3/search
レスポンス:
{ "kind": "youtube#searchListResponse", "etag": etag, "nextPageToken": string, "prevPageToken": string, "pageInfo": { "totalResults": integer, "resultsPerPage": integer }, "items": [ 検索リソース ] }
検索リソースのデータ構造
{ "kind": "youtube#searchResult", "etag": etag, "id": { "kind": string, "videoId": string, "channelId": string, "playlistId": string }, "snippet": { "publishedAt": datetime, "channelId": string, "title": string, "description": string, "thumbnails": { (key): { "url": string, "width": unsigned integer, "height": unsigned integer } }, "channelTitle": string } }
videos API
レスポンスのデータ構造を見たところ、自分が必要としているlike/dislikeの情報が含まれている事が確認できた。
ドキュメントURL:
https://developers.google.com/youtube/v3/docs/videos/list
APIエンドポイントURL:
GET https://www.googleapis.com/youtube/v3/videos
レスポンス:
{ "kind": "youtube#videoListResponse", "etag": etag, "nextPageToken": string, "prevPageToken": string, "pageInfo": { "totalResults": integer, "resultsPerPage": integer }, "items": [ 動画リソース ] }
動画リソースのデータ構造
{ "kind": "youtube#video", "etag": etag, "id": string, "snippet": { "publishedAt": datetime, "channelId": string, "title": string, "description": string, "thumbnails": { (key): { "url": string, "width": unsigned integer, "height": unsigned integer } }, "channelTitle": string, "tags": [ string ], "categoryId": string }, "contentDetails": { "duration": string, "dimension": string, "definition": string, "caption": string, "licensedContent": boolean, "regionRestriction": { "allowed": [ string ], "blocked": [ string ] }, "contentRating": { "mpaaRating": string, "tvpgRating": string, "bbfcRating": string, "chvrsRating": string, "eirinRating": string, "cbfcRating": string, "fmocRating": string, "icaaRating": string, "acbRating": string, "oflcRating": string, "fskRating": string, "kmrbRating": string, "djctqRating": string, "russiaRating": string, "rtcRating": string, "ytRating": string } }, "status": { "uploadStatus": string, "failureReason": string, "rejectionReason": string, "privacyStatus": string, "license": string, "embeddable": boolean, "publicStatsViewable": boolean }, "statistics": { "viewCount": unsigned long, "likeCount": unsigned long, "dislikeCount": unsigned long, "favoriteCount": unsigned long, "commentCount": unsigned long }, "player": { "embedHtml": string }, "topicDetails": { "topicIds": [ string ], "relevantTopicIds": [ string ] }, "recordingDetails": { "locationDescription": string, "location": { "latitude": double, "longitude": double, "altitude": double }, "recordingDate": datetime }, "fileDetails": { "fileName": string, "fileSize": unsigned long, "fileType": string, "container": string, "videoStreams": [ { "widthPixels": unsigned integer, "heightPixels": unsigned integer, "frameRateFps": double, "aspectRatio": double, "codec": string, "bitrateBps": unsigned long, "rotation": string, "vendor": string } ], "audioStreams": [ { "channelCount": unsigned integer, "codec": string, "bitrateBps": unsigned long, "vendor": string } ], "durationMs": unsigned long, "bitrateBps": unsigned long, "recordingLocation": { "latitude": double, "longitude": double, "altitude": double }, "creationTime": string }, "processingDetails": { "processingStatus": string, "processingProgress": { "partsTotal": unsigned long, "partsProcessed": unsigned long, "timeLeftMs": unsigned long }, "processingFailureReason": string, "fileDetailsAvailability": string, "processingIssuesAvailability": string, "tagSuggestionsAvailability": string, "editorSuggestionsAvailability": string, "thumbnailsAvailability": string }, "suggestions": { "processingErrors": [ string ], "processingWarnings": [ string ], "processingHints": [ string ], "tagSuggestions": [ { "tag": string, "categoryRestricts": [ string ] } ], "editorSuggestions": [ string ] } }