반응형

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

 

 

 

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기