카테고리 없음

Python_SkillUP 6주차 (파이썬 연구수업)

INVENT_GUY 2019. 10. 24. 18:02

파이썬 스킬업 6주차.

오늘은 네이버의 openApi를 사용해 파파고나 아니면 이곳에서 지원하는 기능들을 사용한다.

(홈페이지의 파이썬 예제 코드에는 에러가 많으니 주의!)

 

Naver Developers

https://developers.naver.com/main/

 

NAVER Developers

네이버 오픈 API들을 활용해 개발자들이 다양한 애플리케이션을 개발할 수 있도록 API 가이드와 SDK를 제공합니다. 제공중인 오픈 API에는 네이버 로그인, 검색, 단축URL, 캡차를 비롯 기계번역, 음성인식, 음성합성 등이 있습니다.

developers.naver.com

이곳으로 들어가면 네이버에서 지원하는 api를 사용할수있다.

먼저 위에 사용자 모양이 있는곳에 로그인 버튼으로 네이버에 로그인한다.

그리고 위 프로덕트 칸에 네이버 아이디로 로그인을 또 클릭한다.

 

신청하기

그러면 이젠 맨 밑에 세개의 버튼이 나오는데 여기서 첫번째 '오픈 API 이용 신청' 을 클릭한다.

 

다음 이용약관에 동의후 '확인'을 클릭한다.

다음칸에선 휴대폰으로 문자를 보내 인증 하고, 회사이름은 아무거나하고 체크후 확인을 클릭한다.

 

그러면 이제 에플리케이션 이름을 쓰고 사용api를 위와같이 선택한다.

이젠 환경을 WEB설정으로 선택하고 도메인을 위와같이 적은후 등록하기를 누른다.

 

그러면 Client ID와 Client Secret이 옆에 나오는데 이건 남에게 공개돼서 좋을게 없다.

따라고 이 아이디와 Secret 을 어디에 적어놓자. (secret은 보기를 눌러서 볼수있고, 털릴경우 재발급버튼으로 재발급 받을수 있다.

 

____________________________________________________________

첫번째 예제 : 파파고 api 이용하기 / papago_test.py

import os
import sys
# import urllib.request
import requests
from pprint import pprint

client_id = '' # 개발자센터에서 발급받은 Client ID 값
client_secret = '' # 개발자센터에서 발급받은 Client Secret 값

# 요청 파라미터
# encText = urllib.parse.quote("반갑습니다")
# data = "source=ko&target=en&text=" + encText

#(변경) 요청 파라미터
data  = {'text' : '안녕하세요',
         'source'  : 'ko',
         'target' : 'en'}

url = "https://openapi.naver.com/v1/papago/n2mt"

# 웹 요청후 응답데이터
# 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, data=data.encode("utf-8"))
# rescode = response.getcode()

# 헤더 제작
header = {'X-Naver-Client-Id' : client_id,
          'X-Naver-Client-Secret' : client_secret}

# 웹 요청후 응답데이터 받기
response = requests.post(url, headers = header, data = data)
rescode = response.status_code

if (rescode==200) :
    # 응답 데이터 확인 영역
    # response_body = response.read()
    # print(response_body.decode('utf-8'))
    t_data = response.json()
    pprint(t_data)
    print('-' * 100)
    print(t_data['message']['result']['translatedText'])

else:
    print("Error Code:", rescode)

이 코드는 먼저 필요한 모듈들을 가져오는데 원래 예제에서 바꾼거라 필요없는 모듈들이 있다.

그리고 두 변수에 아까 발급받은 비밀코드들을 작성한다.

여기서 중요한데 url에는 요청할 기능의 url을 작성해야한다. (각각의 이 openapi.naver.com의 예제 문서에서 찾을수 있음)

이제 데이터에 요청할 파라미터를 딕셔너리 형태로 만드는데 여기엔 번역할 말, 이 언어와 대상 언어가 필요하다.

그 다음 header라는 딕셔너리에 비밀코드를 넣고, response에 웹 응답을 저장하고 프린트한다.

{'message': {'@service': 'naverservice.nmt.proxy',
             '@type': 'response',
             '@version': '1.0.0',
             'result': {'srcLangType': 'ko',
                        'tarLangType': 'en',
                        'translatedText': 'Hello.'}}}
----------------------------------------------------------------------------------------------------
Hello.

이런식으로 출력된다.

 

 

 

papago_test_def.py

import requests

client_id = ''  # 개발자센터에서 발급받은 Client ID 값
client_secret = '' # 개발자센터에서 발급받은 Client Secret 값


def get_translate(text, lang) :
    data  = {'text' : text,
             'source'  : 'ko',
             'target' : lang}
    url = "https://openapi.naver.com/v1/papago/n2mt"
    header = {'X-Naver-Client-Id' : client_id,
              'X-Naver-Client-Secret' : client_secret}
    response = requests.post(url, headers = header, data = data)
    rescode = response.status_code

    if (rescode==200) :
        t_data = response.json()
        # pprint(t_data)
        # print('-' * 100)
        return t_data['message']['result']['translatedText']
    else:
        print("Error Code:", rescode)


if __name__ == '__main__':
    while True :
        text = input("한국말  : ")
        lang = input("번역할 언어 (영어: en, 일본어: ja)  : ")
        print(get_translate(text, lang))

또 이거는 방금 코드를 input으로 입력을 받는 기능과 함수화를 시킨 코드이다.

____________________________________________________________

두번째 예제 : 사진의 사람 / 사람들을 분석하기, naver_face.py

import os
import sys
import requests
from pprint import pprint

# 전역변수 - 인증정보
client_id = ''
client_secret = ''

# 요청 url - 어떤 서비스에 웹 요청할건지 변수로 저장
url = "https://openapi.naver.com/v1/vision/face" # 얼굴감지
#url = "https://openapi.naver.com/v1/vision/celebrity" # 유명인 얼굴인식

# 사진파일 바이너리로 열어서 웹 요청 후 응답받음
files = {'image': open('./images/trump_obama.jpg', 'rb')}
headers = {'X-Naver-Client-Id': client_id, 'X-Naver-Client-Secret': client_secret }
response = requests.post(url,  files=files, headers=headers)
rescode = response.status_code

# 응답 상태(성공 / 실패)에 따라서 다르게 수행
if (rescode==200) :
    # print (response.text)
    data = response.json() #json형태로 쓰인 문자열데이터를 dict형태로 만들기
    pprint(data)

else :
    print("Error Code:", rescode)

먼저 모듈을 불러온다. 그리고 비밀코드를 작성한다.

그리고 이번엔 url을 face로 한다.

이번에는 files에 images폴더에 trump_obama를 'rb'형태로 가져와  그것을 웹에 요청한다.

그러면 많은 dict데이터가 돌아오는데 여기선 대략적인 사진 내부 사람의 정보(나이, 성별등등....)를

분석해서 사람수만큼 보여주고  사람수도 리턴된다.

____________________________________________________________

 

마지막 예제 : 방탄소년단 사진으로 사람얼굴들을 잘라서  저장하고, 

    모자이크 처리를 해서 리턴하는 프로그램 / naver_cfr.py (PIL패키지 필요)

import os
import sys
import requests
import json
from pprint import pprint
from PIL import Image, ImageDraw,ImageFilter

url = "https://openapi.naver.com/v1/vision/face" # 얼굴감지
# url = "https://openapi.naver.com/v1/vision/celebrity" # 유명인 얼굴인식

file_path = './images/' # ./  : 현위치, .. : 위로 올라가기
client_id = '' 
client_secret = ''
file_name = 'bts.jpg'

files = {'image': open(file_path + file_name, 'rb')} # 전송을 위한 파일열기(바이너리 모드(0101, 이진수 데이터))
headers = {'X-Naver-Client-Id': client_id, 'X-Naver-Client-Secret': client_secret }
response = requests.post(url,  files=files, headers=headers) # POST방식으로 웹 요청
rescode = response.status_code # 200성공, 400~500실패
if(rescode==200):
    # print (response.text)
    data = json.loads(response.text)
    pprint(data)
    # faceCount = data['info']['faceCount']
    # print("감지된 얼굴 수는 {}입니다.".format(faceCount))


    ###가공하기

    #얼굴 좌표 수집하기 - ['faces'][인덱스]['roi'] -> {'height': 36, 'width': 36, 'x': 120, 'y': 91}
    faces = data['faces']

    #roi 좌표 별로 자르기
    img = Image.open(file_path+file_name)

    #좌표를 x,y,w,h를 x1, y1, x2, y2로 만들기
    faces_box = []
    for face in faces:
        x1 = face['roi']['x']
        y1 = face['roi']['y']
        x2 = x1 + face['roi']['width']
        y2 = y1 + face['roi']['height']

        box = (x1,y1,x2,y2)
        faces_box.append(box)

    #얼굴만 저장하기
    for index, box in enumerate(faces_box):
        crop_img = img.crop(box) #자르기
        crop_img.save('./results/{}{}.jpg'.format(file_name,index))

    #인식된 부분 사각형으로 표현하기
    rect_img = img.copy() #원본 복사해서 변수에 저장
    draw = ImageDraw.Draw(rect_img) #해당 그림에 선을 그려줄 ImageDraw 객체 생성(ImageDraw.py 의 ImageDraw 클래스)
    print(type(draw))
    for box in faces_box:
        draw.rectangle(box, outline="black") #ImageDraw인스턴스를 이용한 좌표로 사각형 그리기
    # rect_img.show() #창 띄우기
    rect_img.save('./results/rect_{}.jpg'.format(file_name)) #저장

    #원본 블러처리
    blur_img = img.copy()
    blur_img = blur_img.filter(ImageFilter.BLUR)
    # blur_img.show()
    blur_img.save('./results/blur_{}.jpg'.format(file_name))  # 저장

    #얼굴만 블러처리
    #crop(자르기) -> 블러처리 -> 전체 그림에 붙이기
    news_img = img.copy()
    for box in faces_box:
        crop_img = img.crop(box)
        crop_img = crop_img.filter(ImageFilter.BLUR)
        news_img.paste(crop_img,box)
    # news_img.show()
    news_img.save('./results/news_{}.jpg'.format(file_name)) #저장


else:
    print("Error Code:{}".format(rescode))

이번에도 url은 face로 들어가고, images폴더의 bts.jpg열어 아까와 같은 방식으로 웹에 요청한다.

그러면 돌아온 정보를 바탕으로 results폴더에  많은 사진들이 들어온다.

자세히 보면 방탄소년단의 비트맵사진, 맴버들의 얼굴을 잘라 각각 저장한 사진들, 얼굴만 모자이크한 사진과

얼굴에 사각형을 그린 사진들이 PIL패키지로 복잡하게 가공되어 되돌아온다.

___________________________________________________________

 

이것으로 오늘의 포스팅을 마친다.

참고 : 127.0.0.1 = 루프백

          ./ 현재위치를 뜻함, .. 위로 올라가기

          그리고 모든 코드에는 응답  코드를 받아 에러가 나면 에러가 났다고 알려줌.