본문 바로가기
Develop/Python

[카카오톡/챗봇/API] 고려대학교 학식 식단표 알리미 만들기 - 2

by favorcat 2023. 9. 7.
반응형
 

[Python/셀레니움/크롤링] 고려대학교 학식 식단표 알리미 만들기 - 1

동기 학식 식단표를 볼 수 있는 페이지가 있으나, 오늘의 식단표를 보려면 오늘 날짜를 찾아서 스크롤을 해야하는 번거로움 호잇 어플에서도 식사 탭을 클릭하면 볼 수 있으나, 위와 마찬가지로

blog.favorcat.dev

이전에 학교 식단표를 크롤링하는 것을 했으니, 식단표를 공유할 챗봇을 만들어 보자.


챗봇을 만들기 위해서..?

일단 텔레그램으로 만드는 챗봇은 아주 쉬운데 솔직히 텔레그램을 이용하는 학생들이 얼마나 있을까..
우선 카톡 메세지를 자동으로 보내주는 것을 알아봤다.

방법을 알아보자...

첫째, 카카오톡 채널 만들기를 통해 메세지 전송
알아보니 메세지 전송을 할 때 마다 비용이 부과되는 문제가 있는 것 같았다.
둘째, 카카오톡 챗봇 만들기
이거는 OBT를 승인을 받아야 하고, 시간이 소요된다는 단점이 있었다.
셋째, kakao developers에 있는 메세지 전송 API 이용
토큰만 받고 이것저것 하면 바로 사용가능하다는 장점
이용할 모두가 거쳐야 할 단계가 있다는 조금의 수고스러움이 있다.
하지만 본인의 카톡 친구 목록에 있는 사람이나 자신에게 메세지를 보내는 방법이 있는데,
결론적으로 이게 필요해서 만든 나는 카톡알림을 받을 수 없다.. 동기나 가족의 토큰을 이용해 나에게도 전송되게 해야함..
이 문제점을 해결하기 위해서는 별개의 카톡 계정을 만들어야 하는데 이럴려면 휴대폰번호가 필요하다.

1. kakao developers 가입

 

Kakao Developers

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

developers.kakao.com

나는 이미 가입이 되어 있어서 별개의 절차를 거치지 않았다.

2. 애플리케이션 생성

내 애플리케이션 > 애플리케이션 추가하기

앱 아이콘은 우리 귀여운 호이를 넣어 주었다.
이름은 간단하게 애기능 식단으로 했고, 이는 추후에 카톡 메세지가 보내질 때 하단에 쓰일 텍스트가 된다.
사업자명은 내 이름으로 했다.

3. 애플리케이션 설정

앱 설정 > 플랫폼 > Web
사이트 도메인에 https://www.korea.ac.kr 추가
여기서 도메인으로 추가하는 것은 카톡 공유와 메시지 API를 통해 발송할 때 Web링크의 기본값으로 사용된다.
나는 식단표가 올라오는 페이지의 기본 도메인이 학교 사이트라 학교 주소로 했다.

그리고, 메세지를 보내야 하니 권한 설정을 해주어야 한다.
옆 메뉴에서 제품 설정 > 카카오 로그인 탭에서 활성화를 해주어야 한다.

하단에 Redirect URI에 https://localhost:3000을 추가해준다.

메뉴에서 카카오 로그인 아래에 있는 동의항목에 들어가서
`카카오 서비스 내 친구목록(프로필사진, 닉네임, 즐겨찾기 포함)`와 `카카오톡 메시지 전송`을 이용 중 동의로 설정한다.

4. 알림 받을 친구 초대하기

앱 설정 > 팀 관리 > 팀원 초대

카카오 로그인 이메일로 초대를 보내면 된다. 앱 권한은 READER (사실 아무거나 해도 상관없는거 같은데, 이게 가장 하위 권한이니 이걸로)

5. 초대 받은 친구 및 본인이 해야할 것

5-1. 카카오톡 연결

내 애플리케이션 > 앱 설정 > 앱 키 > REST API 키 값
키 값을 복사한 뒤 아래 주소에 넣고 접속하면 흔히 소셜로그인 할 때 뜨는 정보제공 선택과 연결하기가 뜬다.
여기서 선택사항 모두 선택하고 연결해야한다.

https://kauth.kakao.com/oauth/authorize?client_id={REST API 키}&redirect_uri=https://localhost:3000&response_type=code&scope=talk_message

연결하기를 누르면 서비스가 없는 페이지로 넘어가게 되는데, 이는 정상이다.
카톡을 보낼 사람(챗휴먼이 될 사람)은 새로 넘어가게 된 페이지의 주소를 잘 복사해야 한다.
주소는 아래와 같이 나오는데 이때 코드 값에 해당하는 부분을 복사해서 잘 저장해 두어야 한다.

https://localhost:3000/?code={코드 값}

5-2. REST API 엑세스 토큰 발급

https://developers.kakao.com/tool

도구 > REST API 테스트 > 카카오톡 소셜 > 카카오톡 친구 목록 가져오기
인증 앱에서 아까 만든 앱을 고르고 토큰 발급을 눌러 토큰을 얻는다.

6. 토큰 저장 및 갱신

6-1. 토큰 저장하기

5-1에서 저장했던 코드 값을 이용하는 단계이다.
아래 코드를 실행하면 토큰을 저장할 수 있다.

import requests
import json

# 카카오톡 메시지 API
url = "https://kauth.kakao.com/oauth/token"
data = {
    "grant_type" : "authorization_code",
    "client_id" : "앱 REST API 값",
    "redirect_url" : "https://localhost:3000",
    "code" : "코드 값"
}
response = requests.post(url, data=data)
tokens = response.json()
print(tokens)
with open("kakao_code.json", "w") as fp:
    json.dump(tokens, fp)

저장된 json 파일을 확인해 보면 access token과 refresh token이 있고 각 토큰에 대해 만료기간이 있는걸 확인할 수 있다.

6-2. 토큰 갱신하기

테스트해보니 access token은 6시간에서 12시간 정도 지나면 만료가 되므로 refresh token을 가지고 다시 갱신해주어야 한다.
나의 목적은 평일 아침마다 메세지를 보내는 것 이기 때문에, 메세지를 보내기 전에 토큰을 갱신해 주는 것으로 만들었다.
엑세스 토큰 갱신은 아래의 코드를 실행하면 된다.

import requests
import json

# 저장된 refresh token을 읽어온다
with open("kakao_code.json", "r",encoding="utf-8") as fp:
    json_data = json.load(fp)
    refresh_token = json_data['refresh_token']
    
url = "https://kauth.kakao.com/oauth/token"
header = {"Content-Type": "application/x-www-form-urlencoded"}
data = {
    "grant_type": "refresh_token",
    "client_id": "앱 REST API 값",
    "refresh_token": refresh_token # 읽어온 토큰으로 갱신
}
response = requests.post(url, headers=header, data=data)
tokens = response.json()

# 편의상 엑세스 토큰 값만 바꿔서 다시 저장한다
json_data['access_token'] = tokens['access_token']
with open("kakao_code.json", "w") as fp:
    json.dump(json_data, fp)

7. 채팅 보내기

7-1. 친구 목록 확인하기

아까 저장한 토큰을 잘 불러와서 아래 코드를 실행한다.
코드를 실행하면 등록된 친구의 uuid를 불러올 수 있다. 이 uuid를 통해 해당 친구에게 카톡 메세지를 보내게 된다.
참고: https://developers.kakao.com/docs/latest/ko/kakaotalk-social/rest-api#get-friends 

추가) 친구 목록을 불러오는 과정에서 시간이 지나면? 친구 목록이 뜨지 않는걸 확인했다. 왜인지는 모르겠으나 친구의 uuid는 고유하고 바뀌지 않으므로 uuid를 json 파일로 저장해서 메세지를 보낼 때, 친구들의 uuid 값을 불러와서 메세지를 보내는 것으로 수정했다.

import requests
import json

access_token = "엑세스 토큰"

# 친구 목록 불러오기
url = "https://kapi.kakao.com/v1/api/talk/friends"
header = {"Authorization": 'Bearer ' + access_token}
result = json.loads(requests.get(url, headers=header).text)
friends_list = result.get("elements")
for i in range(len(friends_list)):
  friend_id = friends_list[i].get("uuid")
  print(friend_id)

7-2. 친구에게 메시지 보내기

친구 목록을 불러오고 친구의 수 만큼 반복해서 친구들에게 식단표를 보낸다.
참고: https://developers.kakao.com/docs/latest/ko/message/rest-api#default-template-msg-friend

# 카카오톡
access_token = "엑세스 토큰"

# 친구 목록 불러오기
url = "https://kapi.kakao.com/v1/api/talk/friends"
header = {"Authorization": 'Bearer ' + access_token}
result = json.loads(requests.get(url, headers=header).text)
friends_list = result.get("elements")
for i in range(len(friends_list)):
  friend_id = friends_list[i].get("uuid")

  # 채팅 보내기
  url = 'https://kapi.kakao.com/v1/api/talk/friends/message/default/send'
  headers = {
      # 엑세스 토큰
      "Authorization": "Bearer " + access_token
  }
  data = {
  'receiver_uuids': '["{}"]'.format(friend_id),
      "template_object": json.dumps({
          "object_type":"text",
          "text":"오늘의 식단표\n" + sendText,
          "link":{
              "web_url" : "https://www.korea.ac.kr/user/restaurantMenuAllList.do?siteId=university&id=university_050402000000",
              "mobile_web_url" : "https://www.korea.ac.kr/user/restaurantMenuAllList.do?siteId=university&id=university_050402000000"
          },
          "button_title": "식단표"
      })
  }
  response = requests.post(url, headers=header, data=data)

 


여기까지 했다면 거의 완성이다..
친구에게 식단표를 카톡으로 보낼 수 있다.

자동화를 하고 싶다면?

나는 맥북을 쓰고 있으니 크론탭으로 자동화를 해줘서 매일 아침에 카톡을 보내도록 설정했다.
하지만 이렇게 쓰려면 내 맥북이 켜져있어야 하니 시간 될 때 라즈베리파이로 옮겨야겠다.

추가) 라즈베리파이 재설정하기 귀찮아서 aws에 올려뒀다. 크론탭으로 할때 UTC 기준으로 되어 있어서 제대로 실행되지 않아 KST로 변경해 주었다.

 

맥에서 크론탭(crontab)으로 파이썬 실행하기

크론탭은 맥과 같은 리눅스에서 작동하는 자동 스케쥴러와 같은 친구이다. 크론탭을 이용하기 위해서는 터미널에서 명령어를 치면 된다. # 크론탭을 편집하기 위한 vi창으로 들어가기 $ crontab -e

blog.favorcat.dev


다 먹고 살자고 하는건데... 점심에 진심이 되어서 만들게 되었다..

 

GitHub - favorcat/KU-menu-chatbot: 고려대학교 애기능생활관 2층 학식당 식단표 크롤러/챗봇

고려대학교 애기능생활관 2층 학식당 식단표 크롤러/챗봇. Contribute to favorcat/KU-menu-chatbot development by creating an account on GitHub.

github.com


참고 : https://foss4g.tistory.com/1636

반응형

Comment