📌 이 포스팅에서는 Youtube API를 연동하여 Django에서 Search-Bar API를 구현하는 과정에 대해 정리하였습니다.
🔥 Youtube API Key 발급 받기
🔥 Youtube API 사용 방법
🔥 Django와 연동하여 API 구현하기
✔️ Google Cloud Platfrom에 진입(https://console.cloud.google.com/)하여, 새로운 프로젝트를 생성 후 생성한 새로운 프로젝트 선택한다.
✔️ 새로운 프로젝트를 생성하였다면, 검색창에 'youtube data api v3' 검색 뒤, 아래 화면에 나타난다면 "사용"을 클릭한다.
✔️ "사용"을 클릭하면, 오른쪽에 있는 "사용자 인증 정보 만들기" 버튼을 눌러, 사용할 API를 설정해 준다.
✔️ 아래 설정을 한 뒤, "완료" 버튼을 클릭한다.
✔️ Key가 발급된 것을 확인할 수 있습니다. 이를 잘 은폐해두고 Django로 불러와 사용된다.
✔️ youtube api 문서(https://developers.google.com/youtube/v3/docs)에 들어가면, 유튜브 관련 검색이나 채널 정보를 얻는 등 다양한 api 기능을 지원한다.
✔️ 이 중 search를 클릭하면, youtube 검색 api를 사용할 수 있는 방법이 친절히 설명되어있다.
✔️ 여러가지 parameter 이미 제공되기 때문에 응답값으로 필요한 정보들에 대한 parameter를 설정해주면 된다.
✔️ parameter 중 필수 매개변수인 part 값은 꼭 필요하고, 나머지 parameter는 이를 filter해오기 위한 옵션들이다.
✔️ code로 구현하기 전에 test해보고 싶다면, 맨 아래 Try this API로 실험해보면 된다.
✔️ 참고로 Youtube API는 1회 최대 50개의 데이터를 응답주기 때문에 51번째 데이터부터 추가 요청하고 싶다면, 그 다음 요청부터 pageToken값을 실어 보내줘야 한다.
✔️ 서버에 요청을 보내기 위해서 requests 를 설치한다.
$ pip install requests
✔️ Django 서버로 search 요청이 들어온다면, 해당 keyword를 query parameter에서 추출해 다시 youtube api로 전송하고 이 응답값을 다시 정리해서 프론트로 응답한다.
✔️ 바로 모든 data를 전달해줄 수도있지만, front단에서 필요한 정보만 정리해서 주는게 좋다고 생각했다.
✔️ 여기서 linke_url은 item['id']['videoId'] 값이 영상에 id값이기 때문에 앞에 주소에 붙이면 해당 영상일 바로 실행되지 않을까 생각해봤는데 정말 그랬다. embed를 추가한 것은 영상만 추출하기 위함이고, 이를 붙이지 않는다면 실제 Youtube 화면처럼 댓글이나 추천 영상들이 다 같이 나오는 페이지로 이동된다.
✔️ page값은 front단에서 두번째 요청 시, 서버에 page값을 query parameter로 전달했다면 youtube api에 이를 함께 요청해 그 다음 51번째 data를 받아오게 하기 위함이다.
class SearchContentView(View): def get(self, request): keyword = request.GET.get('keyword') OFFSET = request.GET.get("page") LIMIT = int(request.GET.get("limit", 50)) search_url = 'https://www.googleapis.com/youtube/v3/search' params = { 'q' : keyword, 'part' : 'snippet', 'key' : settings.YOUTUBE_DATA_API_KEY, 'regionCode' : 'KR', 'order' : 'relevance', 'maxResults' : LIMIT, 'type' : 'video', 'pageToken' : OFFSET } data = requests.get(search_url, params=params).json() page = data['nextPageToken'] items = data['items'] result = [ { 'link_url' : 'https://www.youtube.com/embed/'+item['id']['videoId'], 'title' : item['snippet']['title'], 'image_url' : item['snippet']['thumbnails']['medium']['url'], 'channel_id' : item['snippet']['channelId'], 'channel_title' : item['snippet']['channelTitle'], 'published_at' : item['snippet']['publishedAt'], } for item in items ] return JsonResponse({'message': result, 'page' : page}, status=200)