본문 바로가기

프로그래밍/Django

[Django] 네이버 영화 API 사용하기

1주차 Naver API 연동하기

Django에서 Naver API 활용하기

네이버 영화 API의 예제코드는 영화탭이 아니라 블로그 탭에 있다.

# 네이버 검색 API예제는 블로그를 비롯 전문자료까지 호출방법이 동일하므로 blog검색만 대표로 예제를 올렸습니다.
# 네이버 검색 Open API 예제 - 블로그 검색
import os
import sys
import urllib.request
client_id = "YOUR_CLIENT_ID"
client_secret = "YOUR_CLIENT_SECRET"
encText = urllib.parse.quote("검색할 단어")
url = "https://openapi.naver.com/v1/search/blog?query=" + encText # json 결과
# url = "https://openapi.naver.com/v1/search/blog.xml?query=" + encText # xml 결과
request = urllib.request.Request(url)
request.add_header("X-Naver-Client-Id",client_id)
request.add_header("X-Naver-Client-Secret",client_secret)
response = urllib.request.urlopen(request)
rescode = response.getcode()
if(rescode==200):
    response_body = response.read()
    print(response_body.decode('utf-8'))
else:
    print("Error Code:" + rescode)

네이버 API 사이트에서 제공하는 예제코드를 초심자가 받아들이기에는 조금 어려운 면이 있었다. (Django에서는) 필요없는 ossys 모듈도 넣어져있다.

이번 포스팅의 목표는 가장 기본적으로 동작하는 네이버 API코드다. 여기서 사용하는 최소한의 동작코드는 충분히 개선 여지가 있는 코드이며, 차차 개선해나갈 생각이다.

urls.py

from django.conf.urls import url
from movie import views

app_name='movie'

urlpatterns = [
    url(r'^search/', views.search, name='api_search')
]

views.py

import json
import urllib.request

from django.shortcuts import render

def search(request):

    if request.method == 'GET':

        config_secret_debug = json.loads(open(CONFIG_SECRET_DEBUG_FILE).read())
        client_id = config_secret_debug['NAVER']['CLIENT_ID']
        client_secret = config_secret_debug['NAVER']['CLIENT_SECRET']

        q = request.GET.get('q')
        encText = urllib.parse.quote("{}".format(q))
        url = "https://openapi.naver.com/v1/search/movie?query=" + encText  # json 결과
        movie_api_request = urllib.request.Request(url)
        movie_api_request.add_header("X-Naver-Client-Id", client_id)
        movie_api_request.add_header("X-Naver-Client-Secret", client_secret)
        response = urllib.request.urlopen(movie_api_request)
        rescode = response.getcode()
        if (rescode == 200):
            response_body = response.read()
            result = json.loads(response_body.decode('utf-8'))
            items = result.get('items')
            pprint(result)  # request를 예쁘게 출력해볼 수 있다.

            context = {
                'items': items
            }
            return render(request, 'search/search.html', context=context)

가장 눈에 띄게 다른 점이 3가지가 있다.

  1. client_idclient_secret
    스크린샷, 2017-09-22 12-28-05
    스크린샷, 2017-09-22 12-29-15

    네이버에서 발급받은 id와 secret키는 노출되면 안좋은 부분이 있기 때문에 따로 json파일을 만들어서 로드(load)하는 방식을 사용했다.

  2. q라는 변수를 추가했다.

    q = request.GET.get('q')
    
    <form action="{% url 'movie:api_search' %}" method="GET">
      <input name="q" placeholder="검색할 단어를 입려하세요">
      <input type="submit" value="검색">
    </form>
    

    검색버튼을 누르면 네이버 API에 정보검색을 요청해야 한다. input 태그에 q를 붙인다.

  3. 예제코드의 request의 변수 이름을 변경했다.

    movie_api_request = urllib.request.Request(url)
    
    • serach 함수에서 이미 request라는 파라미터를 받기 때문에 예제코드의 변수명과 겹친다.
      변수 이름이 다소 길어지더라도, 명확하도록 변경했다.

  4. request를 context에 담았다.

    • 네이버 영화 API 검색 결과는 result라는 변수에 담긴다.
    • result 내에 items 라는 항목에 우리가 원하는 정보들이 들어있다.
    • 우리가 진짜 원하는 정보들을 템플릿에 담아 보낼 거다.
    {'display': 1,
       'items': [{'actor': '안재홍|황승언|정우식|강봉성|황미영|',
                  'director': '우문기|',
                  'image': 'http://imgmovie.naver.com/mdi/mit110/1037/103797_P29_103649.jpg',
                  'link': 'http://movie.naver.com/movie/bi/mi/basic.nhn?code=103797',
                  'pubDate': '2013',
                  'subtitle': 'The King of Jokgu',
                  'title': '<b>족구왕</b>',
                  'userRating': '8.56'}],
       'lastBuildDate': 'Fri, 22 Sep 2017 12:33:09 +0900',
       'start': 1,
       'total': 1}

templates.html

스크린샷, 2017-09-22 12-43-47

<h1> 네이버 영화 검색 API</h1>

  <form action="{% url 'movie:api_search' %}" method="GET">
      <input type="text" name="q" placeholder="검색">
      <input type="submit" value="검색">
  </form>
  <div>
  {% for item in items %}
      <ul>
          <div>{{ forloop.counter }}
            <img src="{{item.image}}" alt="" width="110" height="150"> : {{ item.title|safe }} ( {{item.pubDate}} ) : {{ item.director }} : {{ item.actor }} 평점 : {{ item.userRating }}
          &llt;/div>
      </ul>
  {% endfor %}
  </div>

설명해야 할 부분은 2가지 정도로 보인다.

  1. {% url 'movie:api_search' %}

    app_name='movie'
    
    urlpatterns = [
        url(r'^search/', views.search, name='api_search')
    ]
    

    <app_name>:<url_name>을 사용하면 태그를 명시화할 수 있다.

  2. {{ items|safe }}
    • 이스케이프 문자(공백)를 출력하지 않는다.

출력결과는 자신이 원하는 것만 뽑아 내면 된다. 나는 모든 정보가 필요할 것 같아서 일단 다 써놓긴 써놨다.
네이버에서 제공하는 정보는 아래에 더 잘 나와있다.

스크린샷, 2017-09-22 12-42-28

마무리

위에서도 언급했듯이, 충분히 개선여지가 남아있는 코드들이다. 이를 개선하는 코드들도 추후 포스팅하고자 한다.
스크린샷, 2017-09-22 12-51-52

또한, 네이버에서 검색에 해당하는 API들은 모두 비슷비슷하다. 하나만 잘 익혀두면 나머지도 손쉽게(?) 활용할 수 있을 것이다. 본 포스팅을 보면서 이해가 잘 안되시는 부분은 피드백 해주쉬면 감사하겠습니다.