0. 들어가기
-. 대망의 챗봇 마지막... 챗봇으로 이미지 받기 포스팅을 한다.
-. 이번 포스팅에선 카톡으로 챗봇에 사진을 보내면 → 챗봇은 사진을 서버에 저장하는 부분을 만든다.
1. 챗봇으로 이미지를 전달하는 방법
-. 챗봇에 이미지를 전송하는 방법은 두가지가 있다.
1) 챗봇 플러그인 사용
-. 챗봇 메뉴얼에서 추천하는 방법이다. 카톡 챗봇은 위치, 바코드, 날짜, 그리고 사진을 포함한 다양한 데이터를 받기 전송받기 위한 플러그인(plugin)이라는 기능을 제공하는데, 간단한 보안 기능도 제공하는 것 같다.
-. 챗봇에 이미지를 전달하는 블록을 만들고, 필수 파라미터에 image 플러그인을 선택한다. (아래 그림 참고)
-. 플러그인을 사용하면 되묻기 질문을 누를 때 조금은 복잡한 설정을 해야한다.
-. 위의 "버튼명 입력"을 누르면 사진처럼 보안을 위한 몇가지 입력을 해줘야 한다.
-. 설정이 올바르게 되었다면, 챗봇에서 이미지 전송 블록에 진입하면 챗봇이 사진을 보내달라는 메시지를 자동으로 보내준다.
-. "사진보내기" 버튼을 누르면 이미지 보안 전송 페이지가 뜨고, 특수한(?) 프로토콜로 이미지가 전달된다.
2) 일반 이미지 전달
-. 사용자간의 대화와 같이, 일반적인 이미지 전송을 하는 방법도 있다. (카톡에서 추천하지는 않는 방법같지만) 사진을 보내는 입장에선 익숙한 방법이 더 나을 수도 있어서 가능한지 확인해봤고, 정상적으로 전달되는 것을 확인했다.
-. 요래 그냥 보내면 됨.
2. 챗봇 스킬(API) 서버에서의 처리
-. 위에서 선택한 이미지 전달 방식에 따라, 서버에서 받는 데이터의 형식도 달라진다.
1) 플러그인을 이용한 경우
-. 플러그인을 통해 이미지를 전달하면 json['action']['detailParams']['secureimage']['origin'] 변수에 string으로 image 링크 목록을 담아서 보내준다. (혹은 json['action']['params']['secureimage'] 내에 json string으로 제공되는 링크를 써도 되는데, 불편할듯.)
-. 챗봇 작업을 하면서 반복적으로 느끼는데, 베타테스트 기간의 잔재가 남아있는 것 같다. 베타테스트 때 사용하던 변수를 완전히 다 바꾸면 기존 서비스들의 수정이 불가피하니, 동일한 데이터를 여러 변수로 반복적으로 보내는 느낌이 든다.
{'action': {'clientExtra': {},
'detailParams': {'secureimage': {'groupName': '',
'origin': 'List(이미지1, 이미지2)',
'value': '{"privacyAgreement":"Y","imageQuantity":"2","secureUrls":"List(이미지1, 이미지2)","expire":"2022-01-04T13:56:31+0900"}'}},
'id': '블록 ID',
'name': 'receive_images',
'params': {'secureimage': '{"privacyAgreement":"Y","imageQuantity":"2","secureUrls":"List(이미지1, 이미지2)","expire":"2022-01-04T13:56:31+0900"}'}},
'bot': {'id': '챗봇 ID'!', 'name': '챗봇1'},
'contexts': [],
'intent': {'extra': {'reason': {'code': 0, 'message': 'OK'}},
'id': '인텐트 ID',
'name': 'send_images'},
'userRequest': {'block': {'id': '챗봇의 블럭 ID',
'name': 'send_images'},
'lang': 'ko',
'params': {'surface': 'Kakaotalk.plusfriend'},
'timezone': 'Asia/Seoul',
'user': {'id': '챗봇에 등록된 현 사용자의 카톡 고유 ID',
'properties': {'botUserKey': '챗봇에 등록된 현 사용자의 카톡 고유 ID',
'bot_user_key': '챗봇에 등록된 현 사용자의 카톡 고유 ID',
'isFriend': True,
'plusfriendUserKey': '챗봇에 등록된 현 사용자의 카톡 고유 ID',
'plusfriend_user_key': '챗봇에 등록된 현 사용자의 카톡 고유 ID'},
'type': 'botUserKey'},
'utterance': '사진보내기'}}
2) 일반적인 이미지 전송을 한 경우
-. 반면, 일반적인 이미지 전달을 할 경우 (챗봇을 대상으론 모아보내기가 안된다) 각 이미지마다 메시지 전달이 이루어진다. 따라서, 챗봇이 감당해야 할 메시지 수가 이미지 갯수에 비례하여 늘어난다 (돈이 더 든다) 대신에 이미지 링크는 훨씬 편하게 받을 수 있는데, json['userRequest']['params']['media']['url'] 변수에 담아서 개별 이미지 링크를 보내준다.
{'action': {'clientExtra': {},
'detailParams': {},
'id': '카톡 고유 ID',
'name': 'fallback',
'params': {}},
'bot': {'id': '챗봇 ID', 'name': '챗봇1'},
'contexts': [],
'intent': {'extra': {'reason': {'code': 1, 'message': 'fallback'}},
'id': '인텐트 ID',
'name': '폴백 블록'},
'userRequest': {'block': {'id': '챗봇의 블럭 ID', 'name': '폴백 블록'},
'lang': 'ko',
'params': {'media': {'type': 'image',
'url': '이미지 주소.jpg'},
'surface': 'Kakaotalk.plusfriend'},
'timezone': 'Asia/Seoul',
'user': {'id': '챗봇에 등록된 현 사용자의 카톡 고유 ID',
'properties': {'botUserKey': '챗봇에 등록된 현 사용자의 카톡 고유 ID',
'bot_user_key': '챗봇에 등록된 현 사용자의 카톡 고유 ID',
'isFriend': True,
'plusfriendUserKey': '챗봇에 등록된 현 사용자의 카톡 고유 ID',
'plusfriend_user_key': '챗봇에 등록된 현 사용자의 카톡 고유 ID'},
'type': 'botUserKey'},
'utterance': '이미지 주소.jpg'}}
3. 이미지를 PC에 저장
-. 1~2에서 이미지 링크를 뽑아내면, 이후 이미지 저장은 어렵지 않은 파이썬 스크립트로 수행할 수 있다.
import requests
import shutil
_url = "챗봇에서 전달받은 이미지 주소"
_res = requests.get(_url, stream=True)
if _res.status_code == 200:
with open("image.jpg", "wb") as f:
shutil.copyfileobj(_res.raw, f)
del _res
'python' 카테고리의 다른 글
[python] 유튜브영상 짤 자동생성: 영상 다운로드 + 자막합성 (0) | 2022.07.09 |
---|---|
[KAKAO + FLASK] 카카오 챗봇 만들기 (4) - 챗봇 출력 예제 (0) | 2021.12.26 |
[KAKAO + FLASK] 카카오 챗봇 만들기 (3) - API 서버 연동 (3) | 2021.12.18 |
[KAKAO + FLASK] 카카오 챗봇 만들기 (2) - 시나리오, 엔티티 (0) | 2021.12.13 |
[KAKAO + FLASK] 카카오 챗봇 만들기 (1) - 시작 (0) | 2021.12.03 |
최근댓글