본문 바로가기

Python/파이썬 프로젝트

파이썬 API 활용의 기초 1 - 카카오 메세지 API 활용

[이론] API의 정의와 사용법

이미지 출처 : https://www.geeksforgeeks.org/what-is-an-api/

 

 

API란

API는 "Application Programming Interface"의 약자로, 여러 소프트웨어 간에 정보를 교환하고 서로 상호 작용할 수 있도록 설계된  툴을 말합니다. API는 사용자와 서버 간의 통신을 담당하며, 외부 개발자가 서비스에 접근할 수 있도록 제공되는 인터페이스입니다. API를 사용하면 한 프로그램이 다른 프로그램의 기능을 사용할 수 있게 해줍니다.

예를 들어, 여러분이 특정 위치의 날씨 정보를 웹사이트에 표시하고 싶다면, 날씨 정보를 제공하는 서비스의 API를 사용할 수 있습니다. 이 API를 통해 원하는 위치의 현재 날씨 데이터를 요청하고, 이 데이터를 웹사이트에 표시할 수 있습니다.

API를 레스토랑의 점원과 요리사의 상호작용에 비유할 수 있습니다.

 고객(소프트웨어 애플리케이션)이 레스토랑에 들어와서 메뉴(기능 목록)를 살펴보고, 음식(서비스)을 주문하게 됩니다. 하지만 고객은 직접 주방에 들어가서 요리사에게 주문을 하지 않습니다. 대신 점원(API)이 고객의 요청을 받아 주방(서버나 다른 프로그램)에 전달합니다.

점원(API)은 고객의 요구사항을 정확히 이해하고, 주방의 요리사에게 알맞게 전달합니다. 요리사는 요청된 주문을 처리하고, 요리(데이터나 서비스)를 완성한 후 다시 점원(API)에게 전달합니다. 점원(API)은 이 완성된 요리(응답 데이터)를 고객에게 서빙합니다.

이 비유를 통해, API가 클라이언트와 서버 간의 중개자 역할을 하며, 양쪽의 요구사항과 응답을 적절하게 처리한다는 점을 이해할 수 있습니다.

 

API 사용법


API 찾기: 먼저, 원하는 기능이나 정보를 제공하는 API를 찾아야 합니다. 예를 들어, 날씨 정보, 주식 가격, 지리적 위치 등의 정보를 제공하는 다양한 API가 있습니다.

API 문서 확인: 대부분의 API는 개발자를 위한 문서를 제공합니다. 이 문서를 통해 API가 어떤 기능을 제공하고, 어떤 형태의 요청을 받아들이며, 어떤 형태의 응답을 주는지 등을 확인할 수 있습니다.

API Key 받기: 많은 API는 사용자 인증을 위해 API Key를 요구합니다. 이는 사용자가 얼마나 많은 요청을 했는지 추적하고, 무분별한 사용을 제한하기 위함입니다. 보통 API를 제공하는 서비스의 웹사이트에서 가입 과정을 거쳐 API Key를 발급받을 수 있습니다.

API 요청하기: API Key와 API 문서를 확인한 뒤, 실제로 API에 요청을 보낼 수 있습니다. 요청은 HTTP 프로토콜을 통해 이루어지며, 주로 GET, POST, PUT, DELETE 등의 메서드를 사용합니다.

응답 처리하기: API 요청에 대한 응답을 받으면, 그 응답을 애플리케이션에서 처리해야 합니다. 응답은 주로 JSON 형태로 오며, 이를 파싱하여 원하는 정보를 추출하고 사용합니다.

마지막으로, API는 다양한 언어와 플랫폼에서 사용할 수 있습니다. Python, Java, JavaScript 등의 언어는 모두 HTTP 요청을 보내고 받는 라이브러리를 제공하므로, API를 활용하는 데 있어 언어는 크게 제한이 되지 않습니다.

 

가상화폐 API에서 비트코인 가격 가져오기 예제 

Python에서 API를 사용하기 위해, 일반적으로 requests 라이브러리를 많이 사용합니다. 아래는 requests를 사용하여 간단하게 HTTP GET 요청을 보내는 예제입니다.

업비트의 비트코인 한국 가격 정보 제공 API 주소 (따로 인증 없음) : 

https://crix-api-endpoint.upbit.com/v1/crix/candles/days/?code=CRIX.UPBIT.KRW-BTC 

import requests

# URL = 'api 주소 넣기'
URL = https://crix-api-endpoint.upbit.com/v1/crix/candles/days/?code=CRIX.UPBIT.KRW-BTC 

response = requests.get('URL')

# 상태 코드가 200(성공)이면
if response.status_code == 200:
    # 응답의 JSON 데이터를 파이썬 딕셔너리로 변환
    data = response.json()

    # 데이터의 일부를 출력
    for item in data[:5]:
        print(item)
else:
    print(f"Error: {response.status_code}")

 

응답 상태 코드가 200이면, 즉 요청이 성공적으로 처리되었다면, response.json() 메서드를 사용해 JSON 응답을 파이썬의 딕셔너리로 변환합니다. 그 후 데이터의 일부를 출력합니다.

이처럼, Python의 requests 라이브러리를 사용하면 API 요청을 쉽게 보내고 응답을 처리할 수 있습니다. 다만 실제 API를 사용할 때는 인증, 에러 처리, 제한된 요청 횟수 등 다양한 사항을 고려해야 할 수 있습니다.

 

API의 종류


웹 API(Web API): HTTP를 통해 통신하며, 대부분의 경우 웹 서버와 클라이언트 간에 데이터를 주고 받는데 사용됩니다. 대표적으로 REST와 SOAP 방식이 있습니다.

  -   REST API: 대부분의 웹 API는 REST(Representational State Transfer) 스타일을 따릅니다. 이는 웹의 장점을 최대한 활용할 수 있는 아키텍처로, 간단하게 URI를 통해 자원을 표현하고 HTTP 메서드(GET, POST, PUT, DELETE 등)를 이용해 해당 자원에 대한 CRUD 작업을 수행합니다.

  -  SOAP API: SOAP(Simple Object Access Protocol)는 메시지를 교환하는 프로토콜입니다. SOAP는 HTTP 외에도 다른 프로토콜(SMTP, FTP 등)을 지원하며, 복잡한 트랜잭션을 처리하는데 주로 사용됩니다.

라이브러리 기반 API(Library-Based API): 특정 프로그래밍 언어에 내장되거나 외부 라이브러리로 제공되는 API입니다. 예를 들어, Python의 경우 표준 라이브러리인 os, sys 등이 있고, 외부 라이브러리인 numpy, requests 등도 있습니다.

운영체제 API(Operating System API): 운영체제가 제공하는 서비스에 접근할 수 있게 해주는 API입니다. 예를 들어, 파일 시스템에 접근하거나 네트워크 통신을 수행하는 등의 기능을 제공합니다. Windows API, POSIX API 등이 여기에 해당합니다.

데이터베이스 API(Database API): 데이터베이스 시스템과 통신하게 해주는 API입니다. SQL 쿼리를 실행하거나, 데이터베이스와의 연결을 관리하는 기능을 제공합니다. 예를 들면, JDBC(Java Database Connectivity)가 있습니다.

이 외에도 여러 가지 분류의 API가 있으며, 어떤 API를 사용할지는 사용하려는 기능, 데이터, 언어, 플랫폼 등에 따라 결정됩니다.

 

API 보안

API를 통해 데이터를 주고받을 때, 데이터의 보안은 매우 중요합니다. 특히나, 민감한 사용자 정보를 다루는 경우에는 이보다 더욱 중요해집니다. API 보안을 위해 가장 많이 사용되는 방법 중 하나가 API 토큰을 사용하는 것입니다.

API 토큰(Token): API 토큰은 사용자를 식별하고 인증하는 데 사용되는 짧은 문자열입니다. API를 사용할 때, 토큰을 요청 헤더에 포함시켜 사용자를 인증합니다. 이 토큰은 일반적으로 서버에서 생성하고, 한번 생성된 토큰은 특정 시간동안 유효하며, 이 시간이 지나면 만료됩니다.

API Key: API Key도 사용자를 인증하는 데 사용되는 문자열이지만, API 토큰과는 약간 다른 점이 있습니다. API 키는 사용자가 API를 사용할 수 있는 권한을 제공하는 역할을 합니다. 즉, API 키를 가진 사용자만이 API에 접근할 수 있습니다. API 키는 주로 사용자의 요청 수를 제한하거나, 특정 서비스에 대한 접근을 제어하는 데 사용됩니다.

OAuth: OAuth는 사용자가 별도의 아이디와 패스워드 없이, 다른 애플리케이션에서 제공하는 인증을 활용할 수 있게 하는 프로토콜입니다. 예를 들어, '구글 계정으로 로그인하기'와 같은 기능이 이에 해당합니다. OAuth를 통해, 서드파티 애플리케이션은 사용자의 ID와 패스워드를 직접 다루지 않고도 사용자를 인증할 수 있습니다.

JWT(JSON Web Token): JWT는 JSON 기반의 오픈 스탠다드입니다. JWT는 클라이언트와 서버 간에 정보를 안전하게 전송하기 위한 간결하고 독립적인 방법을 제공합니다. JWT는 디지털 서명되어 있어 정보의 신뢰성을 보장하며, 이는 비밀 키로 서명되거나 공개/비공개 키 쌍을 이용한 RSA나 ECDSA를 통해 서명됩니다.

이들 방법을 적절히 조합하여 사용하면, API를 통해 데이터를 안전하게 주고받을 수 있습니다. 보안 방법의 선택은 사용하는 API와 어플리케이션의 특성, 필요한 보안 수준 등에 따라 달라집니다.

 

참고. 카카오 api 보안 방식 : OAuth에서 Redirect URI를 활용

OAuth에서 Redirect URI는 사용자가 서비스 제공자로부터 인증을 받은 후에 리다이렉트 될 클라이언트 애플리케이션의 URI를 의미합니다.

OAuth 인증 프로세스에서, 사용자는 일반적으로 다음과 같은 단계를 거칩니다:

클라이언트 애플리케이션을 통해 인증 서버(예: 카카오)로 이동합니다.
인증 서버에서 사용자로부터 해당 애플리케이션의 접근 권한을 부여받습니다.
인증이 성공하면, 인증 서버는 사용자를 Redirect URI로 돌려보냅니다. 이 때, 인증 서버는 "code"라는 인증 코드를 Redirect URI에 첨부해 보냅니다.
클라이언트 애플리케이션은 이 인증 코드를 사용하여 인증 서버에서 액세스 토큰을 받습니다.
카카오 API를 사용하는 경우, 개발자 사이트에서 앱을 생성할 때 Redirect URI를 등록해야 합니다. 사용자가 카카오 로그인을 완료한 후에 돌아갈 애플리케이션의 주소를 의미합니다. 이 주소는 클라이언트 애플리케이션이 실행되는 서버의 주소여야 하며, 이 주소로 인증 코드가 전송됩니다.

예를 들어, Redirect URI가 https://myapp.com/oauth/callback이라고 가정하면, 사용자가 카카오 로그인을 완료한 후에는 https://myapp.com/oauth/callback?code=xxxxx와 같은 주소로 리다이렉트 됩니다. 여기서 xxxxx는 카카오 서버에서 발급한 인증 코드입니다. 이 인증 코드를 이용해 최종적으로 액세스 토큰을 받아 사용자의 카카오 계정에 접근할 수 있게 됩니다.

 

[실습 1] 카카오 메시지 보내기(파이썬)

참고. 카카오 개발자 도구 공식 문서 사용 가이드라인 확인

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

 

1. API를 취득하기 위해 카카오 개발자 도구 사이트 회원 가입 후 로그인한다.

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

 

2. 내 어플리케이션 클릭

 

3. 앱 아이콘 그림파일을 넣고, 내용을 기입합니다.

 

3. 요약정보에서 REST API키를 확인합니다. 키의 내용이 유출되지 않게 보안에 신경씁니다.

 

4. 카카오 로그인 설정을 해줍니다. 활성화를 on 하고, REDIRECT URI를 설정합니다.

 

5. REDIRECT URI는 예시에 있는 주소를 그대로 씁니다. 

 

6. 동의 항목에서 카카오 메시지 전송을 선택동의 해줍니다.

 

7. 카카오 로그인 코드 받기

 - 아래 주소 형식에서 본인의 REST-API와 REDECTION URI를 기입합니다.

https://kauth.kakao.com/oauth/authorize?client_id=레스트api 넣어주세요&redirect_uri=https://example.com/oauth&response_type=code 

 

- 동의하고 로그인해주세요.(아래 창은 최초에만 뜹니다.)

 

- 주소창의 CODE= 의 뒷부분이 로그인 인증 코드입니다. 복사해서 메모장에 넣어주세요. 

(12시간 뒤에는 만료됩으로 계속 쓸수는 없습니다.)

 

8. 카카오 메세지 전송 보안 코든 생성하기

- 아래 코드에서 client_id에 rest api를 입력하고, code에는 로그인 인증 코드를 넣습니다.

- 코드를 돌리고 acess token이 잘 생성되었는지 확인합니다.

import requests
import json

url = 'https://kauth.kakao.com/oauth/token'
client_id = '자신의 REST 키값'
redirect_uri = 'https://example.com/oauth'
code = '자신의 CODE 값'

data = {
    'grant_type':'authorization_code',
    'client_id':client_id,
    'redirect_uri':redirect_uri,
    'code': code,
    }

response = requests.post(url, data=data)
tokens = response.json()

#발행된 토큰 저장
with open("token.json","w") as kakao:
    json.dump(tokens, kakao)

 

9. 카카오 메세지 보내기.

- text 변수에 카카오톡으로 보내고 싶은 내용을 넣습니다. 

### 카카오톡 메세지 보내기 테스트

import requests
import json

#발행한 토큰 불러오기
with open("token.json","r") as kakao:
    tokens = json.load(kakao)

url="https://kapi.kakao.com/v2/api/talk/memo/default/send"

headers={
    "Authorization" : "Bearer " + tokens["access_token"]
}

data = {
       'object_type': 'text',

        #여기에 카카오톡 전송 메세지 내용을 담는다.
       'text': '파이썬 카카오 메세지 전송 테스트',

       'link': {
           'web_url': 'https://developers.kakao.com',
           'mobile_web_url': 'https://developers.kakao.com'
       },
       'button_title': '키워드'
   }

data = {'template_object': json.dumps(data)}
response = requests.post(url, headers=headers, data=data)
response.status_code

 

- 내게쓰기 카카오톡에서 메세지가 잘 들어왔는지 확인합니다. 

 

스스로 해결 해보기 1. 카카오톡 메세지 함수 만들기

기존 코드를 잘 정리하여 카카오톡 메세지 함수를 만듭니다.

 

- 결과를 테스트 합니다.

 

 

스스로 해결 해보기 2. 카카오톡 메세지로 알람시간 알려주는 파이썬 프로그램

 

- 현재시간을 알려주는 datetime 함수를 테스트 합니다.

Q. 구글 코랩에서 현재시간과 한국 시간과 다른 이유는 무엇일까? 

Q. 이를 어떻게 해결하면 좋을까?

 

- 아래 코드를 참고하여 문제를 해결하시오.

 

- 동작화면 예시

 

 

스스로 해결 해보기 3. 카카오톡 메세지로 주식정보 알려주는 프로그램 제작

지난 실습에서는 현재가가 아닌 시가(장 시작 가격)을 알려주는 주식정보 함수를 만들었습니다. 아래는 코드를 참고하여 실습 예제 코드를 작성하였습니다.

### 코드 수정제공자 : 서울전자고 홍성수 선생님(Thank you !!)

# 주가 추적 프로그램의 함수화
# 입력 : 종목 코드, 목표치
# 출력 : 현재 주가 정보 및 수익 추천 출력문

import requests
import bs4
import re
import time

pre_price = {}

def tracking_stock(item_number, target_price):
    global pre_price
    url = 'https://finance.naver.com/item/main.nhn?code='+item_number
    stock = requests.get(url)
    soup = bs4.BeautifulSoup(stock.text, 'html.parser')

    # target 데이터 찾아가기
    # 원하는 타겟 데이터는 <dl> 태그, 선택자는 blind
    data = soup.find('dl', 'blind')
    dd_data = data.find_all('dd')

    state_market = str(dd_data[0])
    name = str(dd_data[1])
    present_price = str(dd_data[3])

    state_market = state_market.strip('<dd> ')
    state_market = state_market.strip(' </dd>')

    name = name.split()[-1].strip(' </dd>')

    present_price = int(present_price.split()[1].replace(',',''))
    if name not in pre_price:
        pre_price[name] = 0


    if pre_price[name] != present_price:
        print(state_market)
        print(name + '의 현재가 : {:,}원'.format(present_price))
        pre_price[name] = present_price
        if target_price < present_price:
            print('목표 도달. 수익실현 추천')
        else:
            print('목표까지 남은 금액 {:,}원'.format(target_price - present_price))
            print('')

 

- 아래 코드를 참고하여 네이버 금융에서 종목번호를 검색하여 장마감시간, 종목명, 현재가, 수익률 정보를 카카오톡 메세지를 전달하는 파이썬 코드를 작성하시오.

 

- 동작 예시

 

[자유 프로젝트 과제] 특정 조건에서 주식 정보를 알려주는 카카오 메세지 파이썬 프로그램 설계 및 제작

어떤 조건에서 메세지를 받을 때 유용할 수 있을까요?
예를 들어, 특정 시간 마다 주식정보를 알려줘도 되고, 특정 수익률이나 특정 가격에 도달했을 때 카카오톡 메세지를 보낼 수도 있겠지요.

자유롭게 특정 조건을 생각하고 코드를 작성하시오.

 

전체 실습코드 공개( 주어진 문제를 조금만 고민해 보고 코드를 확인하면 좋습니다 !)

 

@WonkingPythonClass2023