본문 바로가기

Node.js

유튜브 API 사용법 - 동영상 검색하기

Youtube에서 제공하는 api를 이용해서 동영상을 검색할 수 있습니다. 검색만으로는 별로 쓸 데가 없겠지만, 이러한 검색 작업을 통해 영상의 제목, id 등을 파싱하고 결과적으로 Youtube동영상을 로컬로 다운받게 해주는 등 편리함을 제공해주기 때문에 아주 유용합니다. 또한 nodejs를 배우는 사람에게 REST API를 사용해보는 재미있는 예제가 될 수 있습니다. (REST API란 http request를 이용해, 쉽게 말하면 url을 이용해 사용할 수 있는 api라고 할 수 있습니다.)


● API를 이용하기 전에


대부분의 REST API는 개발자 신청을 하고 자신의 인증KEY를 발급받아야 사용이 가능합니다. 아마 REST API를 운영하는 서버의 안정 때문에, 한 사람이 이용할 수 있는 트래픽을 제한해야하기도 하고 기타 보안 등의 이유가 있는 듯 합니다. 따라서 웬만해서는 자신의 인증KEY가 노출되지 않도록 주의하는 게 좋다고 합니다.

우선 Youtube API 의 인증key를 발급받기 위해 구글 디벨로퍼 콘솔에서 Youtube API 페이지로 가봅시다.

항상 어떤 모듈이나 라이브러리 등의 사용법을 공부해 볼 때 가장 좋은 방법은 우선 공식 홈페이지에 나온 설명을 잘 알아듣고 설명대로 해보는 것이라고 생각합니다.

유튜브 API 공식 홈페이지 : https://developers.google.com/youtube/v3/getting-started?hl=ko

구글 디벨로퍼 콘솔에서 애플리케이션 등록을 웹으로 한 뒤, API 인증키를 받고, 애플리케이션을 ON으로 해놨으면 준비는 거의 완료.

사용법은 생각보다 어렵지 않습니다. 그냥 옵션으로 쓰이는 인자만 원하는 대로 전달해주면 되는 정도.


● API 호출하는 법

다음은 YouTube Data API 요청에 적용되는 요구 사항입니다.

  1. 모든 요청은 API 키(key 매개변수 포함)를 지정하거나 OAuth 2.0 토큰을 제공해야 합니다. API 키는 APIs Console에서 프로젝트의 API Access 창에 있습니다.

공식홈페이지에 나와있는 API 호출법입니다.

저는 OAuth 2.0 토큰이 아닌 간단한 API키를 이용할 겁니다. 

(아직 OAuth에 대해 제대로 배우지도 못했고 그냥 검색만 하는 용으로는 좀 복잡해보여서..)

key 매개변수를 이용해서 API Key값을 전달하라고 하네요.


우리는 검색을 할 것이니까 Search 리소스(검색을 위한 자원이라고 그냥 가볍게 생각하시면 될 것 같아요)를 사용하면 되는데, 

공식홈페이지(https://developers.google.com/youtube/v3/docs/search/list?hl=ko)에는 아래의 url로 https요청을 보내라고 적혀있네요.

GET : https://www.googleapis.com/youtube/v3/search

즉 Get 방식으로 HTTP요청을 하라고 하네요 그럼 여기에 key 매개변수를 포함시키면

https://www.googleapis.com/youtube/v3/search?key=내KEY값

이런식으로 GET method를 이용해 해당 url에 파라미터를 전달해주면 되는 겁니다.

(내KEY값은 자기 key값으로 입력해줘야해요)


그리고는 이제 필수 매개변수를 전달해줘야겠죠. 이게 좀 헷갈릴 수 있어요.

공식 

partstring
part 매개변수는 API 응답이 포함하는 search 리소스 속성 하나 이상의 쉼표로 구분된 목록을 지정합니다. 매개변수 값에 포함할 수 있는 part 이름 값은은 id 및 snippet입니다.

매개변수가 하위 속성을 포함하는 속성을 식별하는 경우 하위 속성이 응답에 포함됩니다. 예를 들어 search 결과에서 snippet 속성은 결과의 제목, 설명 등을 식별하는 다른 속성을 포함합니다. part=snippet을 설정하는 경우 API 응답은 중첩된 속성도 모두 포함합니다.


part라는 매개변수를 전달해야하는데 이 값은 "id"나 "snippet"으로 설정해야합니다.

이게 무슨 소리냐면, 우리가 Search를 통해 받는 리소스는 크게 아래의 형식을 가진 JSON리소스인데

{     kind: ...,

etag: ...,

id: ...., 

snippet: ...

}


partid로 하면 snippet은 안받겠다는 거고,

part를 snippet으로 하면 id랑 snippet을 중첩으로 하여 둘 다 받겠다는 겁니다.

id만 받을 거의 video id만 받을 수 있고 그 video에 대한 정보는 거의 없다고 보면 돼요 그래서 보통 snippet쓰면 될 듯!

(영문 reference에는 그냥 별 설명 없이 snippet으로 설정하라고 나와있습니다. 왜 굳이 part변수를 설정해놨는지 잘 모르겠네요 어차피 다 snippet으로 할 거면..)


● API 호출 시 주의 사항 - Youtube 검색 API 이용 시 한글로 검색이 안 될 때


q=코코몽 이런 식으로 한글을 전달하면 (검색어를 코코몽으로 하겠다고 뜻)

youtube api에서 제대로 알아듣지를 못합니다. header설정이 영어로 되있어서 라는 설이 있는 것 같기는 한데 아직 저도 확실히는 모르겠네요.

따라서 어쨋든 검색어에 한글이 포함된 경우 uri encoding을 해주면 됩니다.

javascript 자체를 이용해 간단하게 할 수 있습니다.

var value=encodeURI(코코몽);

이런식으로 ㅎㅎ

영어는 상관없어요. 인코딩해봤자 원래 영어 그 자체와 동일하기 때문에.


그리고 기타 매개변수는 취향대로 넣으시면 됩니다. 

(기타 매개변수이기 때문에 다 입력 안해도 무방. q는 검색어니까 웬만하면 필요하실 거예요)


● API 호출 후 전달 받는 response


이제 API에서 어떤 식으로 response를 주는 지 알아봐야하는데, 

사실 공식홈페이지 (https://developers.google.com/youtube/v3/docs/search?hl=ko) 에 잘 정리되어있습니다... 딱히 더 설명할 게 없을 것 같습니다.

그래도 혹시 어려워하시는 분들을 위해 아래의 최소한의 기능만 하는 심플코드를 통해 한 번 response를 확인해보겠습니다.

★자기 key값에는 자기 애플리케이션이 받은 api key값을 넣어야합니다.

//Simple Code

var request=require('request');

var optionParams={
	q:"kakao",
	part:"snippet",
	key:"★자기key값★",
	maxResults:2
 };
//그냥 간단하게 확인하기 쉽게하려고 maxResults 2로 했음
var url="https://www.googleapis.com/youtube/v3/search?";
for(var option in optionParams){
	url+=option+"="+optionParams[option]+"&";
}

//url의마지막에 붙어있는 & 정리
url=url.substr(0, url.length-1);

request(url, function(err, res, body){
	console.log(body)
});


    {

         "kind": "youtube#searchListResponse",

         "etag": "\"XI7nbFXulYBIpL0ayR_gDh3eu1k/Gu8w0ilRS0N17EGsZ5D7iQfulvI\"",

         "nextPageToken": "CAEQAA",

         "regionCode": "KR",

         "pageInfo": {

          "totalResults": 874636,

          "resultsPerPage": 1

         },

         "items": [....여기서부터가 동영상 검색 정보....]

    } 



위와 같은 식으로 콘솔에 찍히네요.

즉 1차적인 프로퍼티들은 그냥 검색에 대한 정보이고 items가 검색결과인 동영상의 배열이에요.

따라서 우리가 필요한 것(동영상의 제목이라거나 동영상의 아이디 등등)을 얻기 위한 작업은 아래 코드 정도입니다.

 


    var data=JSON.parse(body)    

    //서버에게서 받은 body가 json형식이니까 파싱해서 저장


    for(var item in data){

    각 동영상 item으로 할 작업 입력

    }

 


● 마치며


다음 글에선 id.videoId를 통해 유튜브에 있는 video를 다운 받는 법을 공부해보겠습니다.

아래는 Youtube search api를 이용하는 참고 소스입니다.(★에는 자기 key 넣어야합니다)

//YOUTUBE DATA API v3. Search
//help for params : https://developers.google.com/youtube/v3/docs/search/list#--

var request=require('request');
var optionParams={
	q:"코코몽",
	part:"snippet",
	key:"★★자기키값넣으세요★★",
	type:"video",
	maxResults:10,
	regionCode:"KR",
	videoDuration:"short"
 };

//한글을 검색어로 전달하기 위해선 url encoding 필요!
optionParams.q=encodeURI(optionParams.q);

var url="https://www.googleapis.com/youtube/v3/search?";
for(var option in optionParams){
	url+=option+"="+optionParams[option]+"&";
}

//url의마지막에 붙어있는 & 정리
url=url.substr(0, url.length-1);

request(url, function(err, res, body){
	// console.log(body)
	
	//json형식을 서버로 부터 받음
	var data=JSON.parse(body).items;
	for(var content in data){
		
		//youtube downloader에 videoId 넘기면 됨.
		console.log(data[content].snippet.title+" : "+data[content].id.videoId);
		
	}
});