- 0
- 78 단어
안녕하세요 케이입니다.
지난 글에서는 텔레그램 봇에 /news, /help 같은 명령어를 직접 추가해봤습니다.
명령어 자체를 만드는 것까지는 생각보다 어렵지 않았는데, 막상 /news를 입력하고 나니까 바로 다음 문제가 생겼습니다.
제가 원했던 건 이런 방식이었습니다.
/news 입력
→ 봇이 “검색할 뉴스 키워드를 입력해주세요.”라고 답장
→ 제가 “인공지능”이라고 입력
→ 인공지능 관련 뉴스가 검색돼서 텔레그램으로 도착
처음에는 당연히 이런 흐름이 자연스럽게 될 거라고 생각했습니다.
그런데 실제로 해보니 그렇지 않았습니다.
봇은 제가 조금 전에 /news를 입력했다는 사실을 알아서 기억하고 있지 않았습니다.
그래서 이번에는 봇에게
“지금부터 다음에 들어오는 메시지는 뉴스 검색어로 받아들여.”
라는 상태를 저장해보는 작업을 해봤습니다.
저처럼 코딩을 전혀 모르는 분들이 보면 처음에는 또 어렵게 느껴질 수 있는데, 이번에도 원리를 먼저 이해하고 나니까 조금 편해졌습니다.
왜 그냥 검색어를 입력하면 안 될까?
처음에는 이 부분이 가장 이해가 안 됐습니다.
예를 들어 제가 텔레그램에서
/news
를 보내고 몇 초 뒤에
삼성전자
라고 입력했다고 해보겠습니다.
사람이 보면 아주 자연스럽습니다.
“아까 뉴스 검색을 눌렀으니까 삼성전자 뉴스를 찾아달라는 뜻이구나.”
라고 바로 이해할 수 있습니다.
그런데 제가 만든 봇은 그렇지 않았습니다.
봇 입장에서는
첫 번째 메시지 : /news
두 번째 메시지 : 삼성전자
이렇게 그냥 서로 다른 두 개의 메시지가 들어온 것입니다.
그래서 중간에
이 사용자는 현재 뉴스 검색어를 입력하는 중이다
라는 상태를 따로 저장할 필요가 있었습니다.
처음에는 이것 때문에 별도의 데이터베이스 같은 걸 만들어야 하나 싶었습니다.
그런데 Google Apps Script 안에 간단하게 값을 저장할 수 있는 기능이 있었습니다.
바로 PropertiesService라는 기능이었습니다.
PropertiesService라는 걸 처음 써봤습니다
이름부터 굉장히 어렵습니다.
저도 처음 봤을 때는 이게 뭔가 싶었습니다.
그런데 실제로 사용해보니 그냥
작은 메모장
정도로 생각하면 편했습니다.
예를 들어 /news를 입력했을 때
“이 사람은 지금 뉴스 검색 중”
이라는 내용을 저장해두는 겁니다.
그리고 다음 메시지가 들어왔을 때 그 메모를 확인합니다.
메모에 뉴스 검색 중이라고 적혀 있으면
“아, 지금 들어온 글자는 검색어구나.”
라고 판단하게 만드는 방식입니다.
우선 /news 부분을 조금 수정했습니다.
if (text == "/news") {
var properties = PropertiesService.getScriptProperties();
properties.setProperty("mode_" + chatId, "news");
sendMessage(chatId, "검색할 뉴스 키워드를 입력해주세요.");
return;
}
처음 코드만 보면 또 복잡해 보입니다.
저는 이것도 한 줄씩 나눠서 이해했습니다.
var properties = PropertiesService.getScriptProperties();
이 부분은 저장 공간을 가져오는 부분이라고 생각했습니다.
그리고
properties.setProperty("mode_" + chatId, "news");
이 부분에서 실제로
현재 상태가 news
라는 값을 저장합니다.
여기에서 chatId를 같이 사용하는 이유도 이번에 조금 이해했습니다.
텔레그램 봇을 여러 사람이 사용할 수도 있기 때문입니다.
예를 들어 제가 /news를 입력했다고 해서 다른 사람까지 뉴스 검색 상태가 되어버리면 이상합니다.
그래서
mode_내 Chat ID
이런 식으로 사람마다 따로 상태를 저장하는 방식입니다.
다음 메시지가 들어왔을 때 상태를 확인했습니다
이제 /news를 입력하면 뉴스 검색 상태가 저장됩니다.
그다음 할 일은 새 메시지가 들어왔을 때 현재 상태가 무엇인지 확인하는 것입니다.
기존 코드에 이런 내용을 추가했습니다.
var properties = PropertiesService.getScriptProperties();
var mode = properties.getProperty("mode_" + chatId);
이 코드도 쉽게 생각하면
“이 사용자가 지금 뭘 하고 있었는지 확인해봐.”
정도였습니다.
그리고 아래에 조건을 하나 넣었습니다.
if (mode == "news") {
searchNews(text);
properties.deleteProperty("mode_" + chatId);
return;
}
뜻은 생각보다 단순했습니다.
현재 상태가 news라면
방금 들어온 text를 검색어로 사용해서
searchNews(text)
를 실행하라는 의미입니다.
그리고 검색이 끝난 뒤에는
properties.deleteProperty("mode_" + chatId);
이 부분으로 저장해둔 상태를 삭제합니다.
이걸 지우지 않으면 그 이후에 제가 보내는 모든 메시지를 계속 뉴스 검색어로 받아들일 수 있기 때문입니다.
이 부분도 직접 만들어보면서 알게 됐습니다.
상태를 저장하는 것도 중요하지만
작업이 끝난 뒤 상태를 없애는 것도 중요했습니다.
실제로 텔레그램에서 테스트해봤습니다
코드를 저장하고 다시 텔레그램으로 돌아왔습니다.
이번에는 제가 만든 봇에게
/news
라고 입력했습니다.
그러자 봇이
“검색할 뉴스 키워드를 입력해주세요.”
라고 답했습니다.
여기까지는 지난번에도 됐던 부분입니다.
이번에는 이어서
인공지능
이라고 입력해봤습니다.
제가 기대했던 대로라면 이제 이 문장을 일반 메시지가 아니라 뉴스 검색어로 받아들여야 합니다.
정상적으로 연결됐을 때는 기존에 만들어둔 뉴스 검색 기능이 실행되면서 인공지능 관련 기사들이 텔레그램에 표시됐습니다.
처음 결과가 나왔을 때는 상당히 만족스러웠습니다.
사실 이전까지는 코드 안에 검색어를 직접 넣어서 테스트하는 느낌이 강했습니다.
그런데 이제는 텔레그램 채팅창에서 제가 원하는 검색어를 자유롭게 입력할 수 있게 된 겁니다.
삼성전자
갤럭시
인공지능
환율
처럼 그때그때 원하는 단어를 입력해서 검색할 수 있으니 확실히 실제 사용하는 봇 같은 느낌이 들었습니다.
중간에 제가 한 번 실수했던 부분
물론 처음부터 바로 되지는 않았습니다.
제가 처음 코드를 넣었을 때는 /news를 입력한 뒤 검색어를 입력해도 기존 동작이 먼저 실행되는 문제가 있었습니다.
코드를 하나씩 보니까 조건문의 위치가 문제였습니다.
예를 들어 일반 메시지를 처리하는 코드가 먼저 나오고
뉴스 검색 상태를 확인하는 코드가 그 아래에 있으면
제가 입력한 인공지능이라는 글자가 뉴스 검색까지 도달하기 전에 일반 메시지로 처리될 수 있었습니다.
그래서 저는 코드의 순서를
명령어 확인
→ 현재 상태 확인
→ 일반 메시지 처리
순서로 정리했습니다.
이런 부분은 설명만 볼 때는 별것 아닌 것 같은데 직접 해보면 꽤 헷갈렸습니다.
저처럼 코딩을 처음 접하는 사람은
“코드 내용이 맞는데 왜 작동하지?”
싶은 경우가 있는데 이번에는 코드의 위치와 순서도 중요하다는 걸 알게 됐습니다.
전체 흐름은 이렇게 이해하면 쉬웠습니다
이번에 만든 기능을 제가 이해한 방식대로 다시 정리하면 이렇습니다.
제가 /news를 입력합니다.
그러면 봇은
“이 사용자는 현재 뉴스 검색 중”
이라는 내용을 임시로 저장합니다.
그다음 제가
인공지능
이라고 입력합니다.
봇은 먼저 제가 뉴스 검색 중인지 확인합니다.
뉴스 검색 중이라면
인공지능
이라는 단어를 뉴스 검색 함수에 전달합니다.
검색 결과를 보내고 나면
뉴스 검색 중이라는 상태를 삭제합니다.
이게 전부였습니다.
처음에는 ‘봇이 이전 대화를 기억한다’고 해서 훨씬 복잡한 기술이라고 생각했는데 이번에 사용한 정도의 기능은 간단한 상태값 하나만 저장해도 가능했습니다.
검색어를 직접 입력할 수 있으니 활용도가 많이 올라갔습니다
이전까지 제가 만든 뉴스봇은 사실 테스트용에 가까웠습니다.
코드 안에 미리 정해놓은 키워드를 검색하거나 특정 기능을 실행하는 정도였습니다.
그런데 검색어를 직접 입력할 수 있게 되면서부터 사용 방식이 완전히 달라졌습니다.
아침에 궁금한 주제가 있으면
/news
를 입력하고
미국 증시
라고 검색할 수도 있고
일하다가 특정 회사가 궁금하면
/news
다음에 회사명을 입력할 수도 있습니다.
굳이 네이버를 열고 검색해서 여러 기사를 찾아보지 않아도 텔레그램 안에서 바로 결과를 볼 수 있게 된 것입니다.
물론 아직 완성됐다고 보기는 어렵습니다.
실제로 몇 번 사용해보니 또 불편한 점이 생겼습니다.
검색 결과가 너무 많이 나오는 경우였습니다.
제가 원하는 건 중요한 뉴스 몇 개 정도인데 검색 결과를 그대로 보내다 보니 메시지가 계속 길어졌습니다.
그래서 다음에는 뉴스 검색 결과를 무작정 많이 가져오는 대신
제가 원하는 개수만큼만 표시하도록 제한하는 기능
을 추가해보려고 합니다.
이번에 직접 해보고 느낀 점
이번 작업을 하면서 텔레그램 봇을 조금 다르게 보게 됐습니다.
처음에는 봇이라는 것이 뭔가 굉장히 복잡한 프로그램이라고 생각했습니다.
그런데 제가 지금까지 만들어본 걸 보면
메시지를 받는다.
내용을 확인한다.
현재 상태를 저장한다.
조건에 따라 다른 기능을 실행한다.
결국 이런 단순한 동작들이 계속 연결되는 구조였습니다.
물론 아직 모르는 게 훨씬 많습니다.
특히 코드 대부분을 제가 처음부터 직접 작성할 수 있는 수준은 전혀 아닙니다.
그래도 코드를 하나씩 추가하고 실제로 텔레그램에서 실행해보면서
“이 부분을 바꾸면 이런 식으로 움직이는구나.”
정도는 조금씩 알게 됐습니다.
처음부터 코딩 공부를 시작했다면 아마 금방 포기했을 것 같은데, 제가 실제로 사용할 기능을 하나씩 만들어보니까 생각보다 재미있게 따라갈 수 있었습니다.
다음에는 지금 만든 뉴스 검색 기능을 조금 더 사용하기 편하게 바꿔보겠습니다.
현재는 검색 결과가 너무 많이 나오기 때문에 원하는 뉴스 개수만 골라서 받아볼 수 있도록 직접 수정해보겠습니다.