안녕하세요 ~
오늘은 오랜만에 코딩 공부를 했는데, 머리도 돌아가고 너무 좋네유 ! (빨리 대학원 가고 싶다)
이번 포스팅에서는 텔레그램 봇으로 학교 급식을 가져오도록 코드를 작성해보겠습니다.
-m python venv (가상환경 이름, "."점을 찍으면 현재 폴더와 똑같은 이름의 가상환경이 만들어진다.)
가상환경이 만들어지면, TELEPOT 폴더 안에 Include, Lib, Scripts, share 등의 하위 폴더가 만들어지는 것을 볼 수 있다.
API란?
(Application Programming Interface, 응용 프로그래밍 인터페이스)
= 어플리케이션을 서로 연결하여 서로 통신할 수 있게 하는 것
우리(User)가 API를 활용해서, 서버에 request를 요청하면, 서버에서는 응답을 해주는 방식으로 작동한다.
1. 학교 급식 API 가져오기
급식식단정보 | 데이터셋 상세 Open API | 나이스 교육정보 개방 포털 (neis.go.kr)
급식식단정보 | 데이터셋 상세 Open API | 나이스 교육정보 개방 포털
메타 정보 메타 정보 상세 분류명 교육여건 > 급식식단 DATA 개방일 2019-04-01 태그 급식식단정보, 학교급식, 급식정보, 요리명 제공 기관 교육부, 17개 시도교육청 적재 주기 매일 이용 허락 범위 이
open.neis.go.kr
이 사이트에 들어가면, 급식 식단 정보에 대한 Open API를 제공하고 있다.
기본인자와 신청 인자가 나와 있다. 기본인자는 기본값으로 두고, 우리가 검색할 시도-학교-급식일자에 따라 신청인자만 변경해서 API를 가져올 수 있다.
샘플 URL을 제공하고 있는데, 3번째 출력명 (기본인자와 신청 인자별 JSON 호출예시) url로 접속해보겠습니다.
제주특별자치도교육청의 제주 영지학교의 급식이 json 형태의 예시로 나오는걸 볼 수 있습니다.
교육청과 학교 부분의 신청인자를 바꿔주면 되는데,
교육청 신청인자 - ATPT_OFCDC_SC_CODE = 시도 교육청 코드
표준 학교 코드 - SD_SCHUL_CODE
교육청 신청인자와 표준 학교 코드는 아래 사이트에서 내가 원하는 시도교육청 소속 학교를 검색해보면 나온다.
학교기본정보 | 데이터셋 상세 Sheet | 나이스 교육정보 개방 포털 (neis.go.kr)
2. 필요한 모듈 임포트 하기
import requests
from pprint import pprint
requests 모듈과 pprint 모듈을 가져오겠다.
pprint 모듈은 json 형식의 데이터를 보기 좋게 출력해서 가독성을 높여주는 모듈이다.
3. requests.get(URL)과 json()활용해서 menu 가져오기
requests.get(URL) 함수는 URL을 활용해서, 서버에서 원하는 정보를 가져올 수 있는 메소드이다.
json이란 JavaScriptsObjectNotation의 약자로, Javascript 객체 문법으로 구조화된 데이터를 표현할 수 있는 포맷이다.
json()을 사용하지 않으면, 포맷 적용이 안되서 아래와 같이 데이터를 볼 수 없다.
다시 위로 돌아가보면, json 형태로 출력된 menu는 dict type이라 우리가 원하는 정보를 골라낼 수 있다.
json은 자바스크립트 객체인데, 이 타입이 파이썬의 dict와 맞아떨어져서 dict로 변환 가능하기 때문에 dict type으로 출력이 된다.
우리가 필요한 값만 쉽게 찾기 위해서, 출력 결과물을 코드 창에 복사 붙여넣기 했다.
그냥 출력창으로 보면 어디서 부터 어디까지가 괄호의 시작과 끝인지 알기가 쉽지 않다.
우선 Key는 'mealServiceDietInfo'이고, Value값이 리스트로 'head'부터 '20221012'까지이다.
그리고 이 Value값 리스트 안에도 2가지 이상의 dict가 있다.
첫번째 dict.

두번째 dict.
두번째 key가 row의 value도 리스트 !
하나의 리스트만 있으므로, 우리가 원하는 정보인 'DDISH_NM'만 가져오고 싶다면,
menu = response.json()['mealServiceDietInfo'][1]['row'][0]['DDISH_NM']
menu = menu.replace("<br/>", "\n")
메뉴의 <br/>태그를 '\n' 엔터로 변경해주기 위해서는 replace 함수를 쓰면 된다!
그럼 출력 결과로 오늘의 급식 메뉴가 잘 나오는것을 볼 수 있다.
get_meal()의 파라미터의 날짜만 바꿔주면 원하는 날의 메뉴를 가져올 수 있다.
4. 텔레그램 봇 만들기
(1) 봇 father 검색하고 start하기
(2) /newbot 타이핑 or 클릭하기
(3) 나만의 bot 이름 적기
나의 새로운 봇이 만들어지면, 내가 새로 만든 봇의 HTTP API도 보여진다.
https://api.telegram.org/ + 내 봇의 고유 API + endpoint
엔드포인트 = API가 서버에서 리소스에 접근할 수 있도록 가능하게 하는 URL
각각의 엔드포인트는 그마다의 기능이 존재한다.
URL의 끝에 엔드포인트를 어떻게 붙이느냐에 따라 정보가 다르다.
엔트포인트의 종류에는, (1) getMe (2) getUpdates (3) sendMessage 등이 존재한다.
5. 텔레그램 봇에 정보 보내기
위에서 정의해놓은 get_meal() 안의 파라미터로 원하는 날짜 데이터를 넣고,
서버에 요청을 보낼 url을 다음과 같이 작성한다.
https://api.telegram.org/+봇의 HTTP API + /sendmessage ? chat_id = 내 봇의 챗 ID
메시지를 보내는 것이기 때문에 send message 메소드를 사용한다.
내 봇의 챗 ID를 알기 위해서는 https://api.telegram.org/+봇의 HTTP API + getme 메소드를 통해서 받아올 수 있다.
'파이썬 python > 파이썬 활용' 카테고리의 다른 글
[python] Playwright로 탐욕-공포 지수 웹 크롤링하기! (0) | 2022.10.30 |
---|---|
[python] 비트코인 금액 표시 GUI 프로그램 만들기 (2) | 2022.10.17 |
[python] streamlit 으로 쉬운 웹앱 만들기, 비트코인 시세 출력해주는 웹앱 코드 만드는 법 ! (2) | 2022.10.06 |
[python] 파이썬 영어 문서를 한글로 번역하는 자동화 프로그램 만들기 (1) | 2022.10.02 |
[python] 오토마우스를 활용한 웹페이지 자동화 프로그램 만들기 (1) | 2022.09.30 |