카카오봇 제작 - UDP Socket 을 이용한 명령어 처리 with 메신저봇R

개요

오늘은 메신저봇R을 이용해 socket 서버와 통신을 하는 걸 만들어 보려 합니다. 이미 제가 구축한 카카오봇에서 작동하는 소스를 발췌해 echo 기능을 넣어보는 예제로 쉽게 풀어보았습니다. 

 

동작 방식은 다음과 같습니다.

 

python 으로 작성된 UDP 서버 <-> 카카오봇 

 

카카오봇은 들어오는 메시지를 UDP 서버로 전송하고 서버는 전달받은 메시지에  From UDP Server by python 워터마크 텍스트를 추가해서 다시 보내주는 방식으로 구현해보았습니다.

 

socket 통신의 경우 TCP와 UDP 방식이 존재하는데 연결지향 방식인 TCP의 경우 데이터 전송을 보장하지만 속도가 느린 반면에 UDP는 데이터 전송은 보장하지 않지만 속도가 빠른 장점을 가지고 있습니다. 개발 시 둘의 차이에 맞는 방식을 사용하며 되며, 오늘의 예제는 가볍고 또 빠르게 구현이 가능한 UDP 서버와의 통신을 이용하기로 했습니다. 사실 메신저봇R에 UDP 소켓 통신을 구현해둔 코드가 있어서 이 코드를 활용하기 위해서 이렇게 했습니다.

 

 

 

 

본문

메신저봇R에서 UDP 서버와 통신 전용으로 돌릴 bot을 하나 생성합니다.

 

 

 

그리고 아래 리포지토리의 소스를 넣고 컴파일 해줍니다.

https://github.com/eunipapa/kakao_bot/blob/main/bot_server.js

 

GitHub - eunipapa/kakao_bot: 메신저봇R 구현부

메신저봇R 구현부. Contribute to eunipapa/kakao_bot development by creating an account on GitHub.

github.com

소스의 출처는 소스파일 내에도 명시해두었고 포스팅 제일 하단에도 명시해두었음을 밝힙니다.

 

 

그리고 파이썬 UDP 서버 코드를 작성해줍니다.

socket 옵션을 지정해주고 IP와 포트를 할당 한 뒤 바인딩 시켜주면 listen 상태로 데이타가 들어오길 기다리는 상태가 됩니다. 데이타 수신시 콘솔에 수신 받은 데이타 정보를 출력한 뒤 handle_date() 함수에서 데이터를 한번 정제한 후 리턴 받은 데이터를 다시 UDP 클라이언트에게 전송해주는 코드입니다.

 

 

 

start() 함수

# Create a UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

sock.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 4096)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 4096)

sock.bind((self.ip_address, self.port))

print(f"Server listening on {self.ip_address}:{self.port}")

# Loop forever, listening for incoming datagrams
while True:
    data, address = sock.recvfrom(4096)
    print(f"Received {len(data)} bytes from {address}")
    print(f"Received data : {data.decode()}")

    # Handle the incoming data with the FastAPI endpoint function

    response = self.handle_data(data)

    # Send the response back to the client
    print(f"Sent {response} bytes back to {address}")
    sock.sendto(response.encode(), address)

 

 

 

 

handle_data() 함수

 

handle_data 함수에서는 전달받은 데이터 뒤에 From UDP Server by python 텍스트를 추가한 뒤 다시 클라이언트에게 던져서 처리될 수 있도록 event 값은 response 로, rescon 이라는 추가 항목을 넣어 보내줍니다.

# Implement your business logic here
# This example just uppercases the input data

try:
    obj = json.loads(data.decode())

    event = obj['event']
    room = obj['data']['room']
    content = obj['data']['content']
    print(event, room, content)


    obj['event'] = 'response'
    obj['data']['rescon'] = content + ' From UDP Server by python'

except :
    traceback.print_exc()
    obj = data.decode()

return json.dumps(obj)

 

 

 

 

카카오봇 구현부

 

카카오봇은 handleMessage 함수에서 서버로부터 내려받은 데이터의 event 값이 response 일 경우에만 채팅방에 전송해줍니다.

var handleMessage = function (msg) {  
    var _a;
    var _b = JSON.parse(decodeURIComponent(msg)), event = _b.event, data = _b.data, session = _b.session;

    switch (event) {
        case 'response':           
            Api.replyRoom(data.room, data.rescon);            
            break;
        default:
          break;
    }
};

 

 

 

이렇게 작성된 코드로 카카오봇과의 대화를 시도해보았습니다. 제가 전송한 대화의 뒤에 From UDP Server by python 텍스트를 넣고 응답을 하고 있습니다.

마무리

파이썬으로 간단하게 서버를 뚝딱 만들어서 카카오봇과 socket 통신이 가능한 모듈을 만들어보았습니다. python 으로 코드 작성이 어렵다면 chatGPT를 통해 쉽고 빠르게 UDP 서버를 구축도 할 수 있으니 chatGPT를 활용해보시는것도 생산성을 높이는 방법이 될겁니다. 

 

다만, UDP 소켓이 연결지향성이 아니고 1:1 특화 서버를 만든거여서 제 용도에는 맞을지 모르나 UDP 서버로 계속 응답을 날려주지 않으면 서버에서 연결을 끊어버리게 됩니다. 체감상 마지막 통신후 5분이 지나면 연결이 끊기더군요.

서버에서 클라이언트 address 정보를 저장해놓고 양방향 통신을 하기에는 무리가 있습니다. 연결지향성으로 양방향 통신을 하면서 양방향 제어를 하는 프로그램을 만드실거라면 TCP 연결을 권장합니다. 

 

다음에는 정말 간단하게 구현이 가능한 openAI의 chatGPT에게 명령을 내려서 응답을 받는 것을 해보겠습니다.

 

repository

https://github.com/eunipapa/kakao_bot/blob/main/udp_server.py

https://github.com/eunipapa/kakao_bot/blob/main/bot_server.js

 

참고

https://velog.io/@whrod/mebot-kakao1

 

카카오톡봇 + 외부API(1)

메신저봇R + remote_kakao

velog.io

https://quantrader.tistory.com/104

 

카카오봇 제작 방법 - 메신저봇R with javascript

요즘 카카오 오픈채팅방에서 개인정보가 다 유출되어서인지 주식 리딩방 추천 문자가 엄청나게 날아오더군요. 심지어 오픈챗방에 사용중인 제 대화명까지 다 붙여서 오는거 보고 깜놀했습니다

quantrader.tistory.com

https://quantrader.tistory.com/128

 

 

카카오봇 제작 - chatGPT를 메신저봇R에 내장하기

개요 메신저봇r을 이용해서 카카오봇을 만들어온게 몇일 안된거 같은데 여러모로 활용할 수 있는 방안을 만든것 같습니다. 이번에는 역시나 핫한 openAI의 chatGPT api를 이용해보려 하는데요. 구글

quantrader.tistory.com

https://quantrader.tistory.com/108

 

카카오봇 제작 - 네이버 날씨 정보 가져오기 with 메신저봇R

개요 지난번 메신저봇R을 이용해서 카카오봇을 만들고 echo 기능을 통해 뼈대를 만들었습니다. https://quantrader.tistory.com/104 카카오봇 제작 방법 - 메신저봇R with javascript 요즘 카카오 오픈채팅방에

quantrader.tistory.com