안녕하세요 케이입니다.

앞에서는 텔레그램으로 오는 뉴스 메시지를 조금 더 보기 좋게 꾸며봤습니다.

제목은 굵게 만들고, 설명은 짧게 붙이고, 긴 링크도 기사 보기처럼 정리해놓으니까 확실히 실제로 쓰는 느낌이 많이 좋아졌습니다.

그런데 계속 사용하다 보니 이번에는 검색 과정 자체가 조금 귀찮아졌습니다.

제가 자주 검색하는 단어가 거의 정해져 있었기 때문입니다.

예를 들어

인공지능

삼성전자

환율

이런 단어를 자주 본다고 하면 매번

/news

를 입력하고

다시 검색어를 입력해야 했습니다.

처음에는 별것 아니었는데 하루에 몇 번씩 반복하니까 슬슬 귀찮았습니다.

그래서 이번에는 제가 자주 보는 검색어를 미리 저장해두고, 필요할 때 바로 불러오는 기능을 만들어봤습니다.

이번에도 핵심은 저장이었습니다

앞에서 상태를 저장할 때 PropertiesService를 사용했었습니다.

이번에도 같은 기능을 사용했습니다.

다만 이번에는

“현재 뉴스 검색 중”

같은 상태를 저장하는 게 아니라

내가 자주 보는 검색어 목록

을 저장했습니다.

처음에는 여러 검색어를 어떻게 저장해야 하나 고민했습니다.

하나씩 따로 저장할 수도 있었지만 그러면 관리가 복잡해질 것 같았습니다.

그래서 저는 일단 검색어를 하나의 문자열로 묶어서 저장하는 방식으로 시작했습니다.

예를 들어 이런 식입니다.

var keywords = "인공지능,삼성전자,환율";

이렇게 하면 한 줄 안에 여러 검색어를 넣을 수 있습니다.

검색어를 배열로 바꿔봤습니다

그런데 실제로 사용하려면 이 문자열을 하나씩 나눠서 써야 합니다.

그래서 split이라는 기능을 사용했습니다.

var keywordList = keywords.split(",");

처음에는 또 새로운 단어가 나와서 어렵게 느껴졌습니다.

그런데 뜻은 아주 단순했습니다.

쉼표를 기준으로 글자를 잘라서 목록으로 만드는 기능이었습니다.

즉

인공지능,삼성전자,환율

이렇게 되어 있던 내용을

인공지능
삼성전자
환율

처럼 각각 따로 사용할 수 있게 만들어주는 방식이었습니다.

저는 그냥

쉼표 기준으로 나눠주는 기능

이라고 이해했습니다.

키워드를 저장하는 명령어를 하나 만들어봤습니다

이번에는 텔레그램에서 직접 키워드를 저장할 수 있게 만들고 싶었습니다.

예를 들어

/add 인공지능

이라고 입력하면

인공지능

이라는 검색어가 저장되는 방식입니다.

그래서 먼저 /add 명령어인지 확인했습니다.

if (text.startsWith("/add ")) {

startsWith도 이번에 처음 제대로 사용해봤습니다.

뜻은

이 문장이 특정 글자로 시작하는지 확인한다

정도였습니다.

즉

/add 인공지능

이라는 문장은 /add 로 시작하기 때문에 조건을 통과합니다.

그다음에는 실제 검색어 부분만 꺼내야 했습니다.

var keyword = text.replace("/add ", "").trim();

이렇게 하면

/add 인공지능

에서 /add 부분을 지우고

인공지능

만 남길 수 있었습니다.

저장된 키워드가 없으면 새로 만들었습니다

이제 기존에 저장된 키워드 목록을 불러왔습니다.

var properties = PropertiesService.getScriptProperties();

var saved =
  properties.getProperty("keywords_" + chatId);

여기에서도 chatId를 붙였습니다.

여러 사람이 같은 봇을 사용한다면 사람마다 관심 뉴스가 다를 수 있기 때문입니다.

그리고 아직 저장된 게 없으면 빈 값으로 시작했습니다.

if (!saved) {
  saved = "";
}

그다음 새 키워드를 추가했습니다.

처음 저장하는 경우라면 그냥 키워드를 넣고

이미 저장된 키워드가 있다면 쉼표 뒤에 붙였습니다.

if (saved == "") {
  saved = keyword;
} else {
  saved += "," + keyword;
}

그리고 다시 저장했습니다.

properties.setProperty(
  "keywords_" + chatId,
  saved
);

이렇게 하면 제가 텔레그램에서

/add 인공지능

이라고 입력할 때마다 검색어가 하나씩 쌓입니다.

실제로 저장됐는지 확인 메시지도 넣었습니다

기능이 작동해도 아무 메시지가 없으면 저장이 된 건지 알기 어렵습니다.

그래서 성공 메시지를 같이 보내도록 했습니다.

sendMessage(
  chatId,
  "'" + keyword + "' 키워드를 저장했습니다."
);

실제로는

'인공지능' 키워드를 저장했습니다.

이런 식으로 답장이 왔습니다.

이런 작은 안내가 저한테는 꽤 중요했습니다.

무언가를 눌렀을 때 아무 반응이 없으면 항상

“이게 된 건가?”

싶었기 때문입니다.

같은 키워드를 두 번 저장하는 문제도 생겼습니다

테스트하다 보니 같은 키워드를 여러 번 입력할 수 있었습니다.

예를 들어

/add 인공지능

을 두 번 보내면

저장된 내용이

인공지능,인공지능

처럼 될 수 있었습니다.

그래서 저장하기 전에 이미 있는지 확인하는 기능도 넣었습니다.

var keywordList = saved
  ? saved.split(",")
  : [];

if (keywordList.includes(keyword)) {
  sendMessage(
    chatId,
    "이미 저장된 키워드입니다."
  );
  return;
}

이제 같은 단어를 또 추가하면 저장하지 않고

이미 저장된 키워드입니다.

라고 알려줍니다.

앞에서 사용했던 includes가 여기서도 다시 나왔습니다.

한 번 본 기능이 다른 데서 또 나오니까 조금씩 익숙해졌습니다.

저장된 키워드 목록을 보고 싶었습니다

키워드를 계속 추가하다 보면 나중에는 뭐를 넣었는지 기억이 안 날 수 있습니다.

그래서 /list 명령어도 만들어봤습니다.

if (text == "/list") {
  var saved =
    properties.getProperty("keywords_" + chatId);

  if (!saved) {
    sendMessage(
      chatId,
      "저장된 키워드가 없습니다."
    );
    return;
  }

  var keywordList = saved.split(",");
}

그리고 보기 좋게 번호를 붙였습니다.

var message = "저장된 뉴스 키워드\n\n";

for (var i = 0; i < keywordList.length; i++) {
  message +=
    (i + 1) + ". " + keywordList[i] + "\n";
}

텔레그램에서는 대략 이렇게 표시됩니다.

저장된 뉴스 키워드

1. 인공지능
2. 삼성전자
3. 환율

생각보다 훨씬 보기 편했습니다.

이제 제가 무슨 키워드를 저장했는지 바로 확인할 수 있었습니다.

삭제 기능도 필요했습니다

추가만 계속 할 수 있으면 언젠가는 필요 없는 검색어가 쌓일 것 같았습니다.

그래서 이번에는

/remove 환율

처럼 입력하면 해당 검색어를 지우는 기능도 만들어봤습니다.

먼저 삭제할 단어를 꺼냈습니다.

if (text.startsWith("/remove ")) {
  var keyword =
    text.replace("/remove ", "").trim();

그리고 저장된 검색어를 배열로 바꾼 뒤

삭제할 단어만 빼고 다시 저장했습니다.

var keywordList = saved.split(",");

keywordList =
  keywordList.filter(function(item) {
    return item != keyword;
  });

filter라는 것도 처음에는 굉장히 어려워 보였습니다.

저는 그냥

조건에 맞는 것만 다시 골라내는 기능

이라고 이해했습니다.

여기에서는 삭제할 단어와 다른 것들만 남겼습니다.

그다음 다시 문자열로 합쳤습니다.

saved = keywordList.join(",");

split이 나누는 기능이었다면

join은 다시 합치는 기능이었습니다.

이 둘을 같이 사용하니까 생각보다 이해하기 쉬웠습니다.

이제 저장된 키워드로 뉴스를 검색해봤습니다

여기까지 만들고 나니까 이제 진짜 하고 싶었던 기능을 붙일 차례였습니다.

저장된 키워드를 하나씩 꺼내서 뉴스 검색을 실행하는 겁니다.

예를 들어

var keywordList = saved.split(",");

for (var i = 0; i < keywordList.length; i++) {
  searchNews(keywordList[i]);
}

이렇게 하면 저장된 키워드마다 뉴스 검색 기능이 실행됩니다.

예를 들어 제가

인공지능

삼성전자

환율

세 개를 저장해뒀다면

세 검색어를 순서대로 검색할 수 있습니다.

/mynews 명령어를 만들어봤습니다

저는 저장된 뉴스들을 한 번에 검색하기 위해

/mynews

라는 명령어를 만들어봤습니다.

if (text == "/mynews") {
  var saved =
    properties.getProperty("keywords_" + chatId);

  if (!saved) {
    sendMessage(
      chatId,
      "저장된 뉴스 키워드가 없습니다."
    );
    return;
  }

  var keywordList = saved.split(",");

  for (var i = 0; i < keywordList.length; i++) {
    searchNews(keywordList[i], chatId);
  }

  return;
}

이제는 매번 /news를 입력하고 검색어를 따로 쓰지 않아도 됐습니다.

그냥

/mynews

한 번만 입력하면 제가 저장해둔 검색어들이 순서대로 검색됐습니다.

이 기능을 만들고 나니 확실히 편해졌습니다.

문제는 뉴스가 또 너무 많아졌습니다

그런데 역시 한 번에 끝나지는 않았습니다.

키워드가 세 개 있고

각 검색어마다 뉴스 5개씩 나오면

총 15개가 한꺼번에 옵니다.

키워드가 다섯 개면 25개가 될 수도 있습니다.

앞에서 뉴스가 너무 많이 와서 5개로 줄여놨는데 다시 메시지가 많아진 겁니다.

그래서 이번에는 키워드마다 2~3개 정도만 보여주는 방법도 테스트해봤습니다.

예를 들어 저장 키워드 자동 검색에서는

검색어 하나당 3개만 보여주고

제가 직접 /news로 검색할 때는 5개를 보여주는 방식입니다.

직접 사용해보니까 이런 식으로 용도마다 개수를 다르게 정하는 것도 괜찮았습니다.

검색어 이름을 먼저 표시하니 보기 편했습니다

여러 키워드를 한꺼번에 검색하면 어떤 기사가 어느 검색어에서 나온 건지 헷갈릴 수 있었습니다.

그래서 각 검색을 시작할 때 검색어 이름을 먼저 보내도록 해봤습니다.

예를 들어

sendMessage(
  chatId,
  "🔎 " + keywordList[i] + " 관련 뉴스"
);

그러면 텔레그램에서는

🔎 인공지능 관련 뉴스

뉴스 1
뉴스 2
뉴스 3

🔎 삼성전자 관련 뉴스

뉴스 1
뉴스 2
뉴스 3

이런 식으로 구분됐습니다.

이렇게 해놓으니까 훨씬 보기 쉬웠습니다.

직접 사용해보니 명령어가 조금씩 많아졌습니다

여기까지 만들고 보니까 제가 만든 봇에도 명령어가 꽤 생겼습니다.

/news

직접 뉴스 검색

/add

관심 키워드 추가

/remove

키워드 삭제

/list

저장된 키워드 확인

/mynews

저장된 키워드 전체 검색

처음에는 /news 하나였는데 어느새 작은 메뉴처럼 바뀌었습니다.

그래서 앞에서 만들었던 /help 내용도 다시 수정했습니다.

/news - 원하는 뉴스 검색
/add 키워드 - 관심 키워드 저장
/remove 키워드 - 저장 키워드 삭제
/list - 저장된 키워드 확인
/mynews - 관심 뉴스 한 번에 검색
/help - 사용방법

이렇게 해두니까 저도 가끔 명령어가 생각나지 않을 때 바로 확인할 수 있었습니다.

여기까지 만들고 나니까 자동으로 실행하고 싶어졌습니다

지금 상태에서도 /mynews만 입력하면 저장한 키워드의 뉴스를 한 번에 볼 수 있습니다.

처음보다 훨씬 편해졌습니다.

그런데 결국 제가 직접 /mynews를 눌러야 한다는 점은 그대로였습니다.

아침마다 같은 뉴스를 보는 거라면

굳이 제가 버튼을 누를 필요가 있을까 싶었습니다.

예를 들어 매일 아침 8시에

제가 저장해둔

인공지능

삼성전자

환율

관련 뉴스가 자동으로 텔레그램에 도착하면 더 편할 것 같았습니다.

그래서 다음에는 Google Apps Script에 있는 자동 실행 기능을 사용해서

제가 아무것도 누르지 않아도 정해진 시간에 뉴스가 자동으로 오도록

만들어보려고 합니다.

지금까지 만든 뉴스봇이 제가 직접 실행하는 도구였다면, 다음 단계부터는 조금 더 진짜 자동화에 가까워질 것 같습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

글쓴이

bluekei9@keinote.com

관련 게시물

코딩 하나도 모르던 제가 결국 개인 뉴스 자동화 시스템을 만든 전체 과정

안녕하세요 케이입니다. 처음 이걸 시작할 때만 해도 텔레그램 봇이 정확히 어떻게 움직이는지 잘 몰랐습니다. API라는 말은 많이 들어봤지만 정확히 어떤 역할을 하는지도...

모두 읽어보기

텔레그램 봇 코드를 수정했는데 반영이 안 돼서 직접 원인을 찾아봤습니다

안녕하세요 케이입니다. 텔레그램 봇을 만들면서 꽤 답답했던 문제가 하나 있었습니다. 분명 Google Apps Script에서 코드를 수정했습니다. 저장도 했습니다. 그런데 텔레그램에서 테스트해보면 예전...

모두 읽어보기

텔레그램 뉴스봇이 갑자기 멈췄을 때 초보자인 제가 확인한 순서

안녕하세요 케이입니다. 앞에서는 Google Apps Script의 트리거를 이용해서 정해진 시간에 뉴스가 자동으로 오도록 만들어봤습니다. 자동으로 뉴스가 도착하니까 상당히 편했습니다. 그런데 며칠 사용하다...

모두 읽어보기

텔레그램 뉴스 메시지가 너무 지저분해서 보기 좋게 꾸며봤습니다

안녕하세요 케이입니다. 앞에서는 텔레그램 뉴스봇에 뉴스 제목뿐만 아니라 간단한 설명까지 같이 표시해봤습니다. 기능 자체는 만족스러웠습니다. 제목만 볼 때보다 내용을 훨씬 빨리 파악할...

모두 읽어보기

뉴스 제목만 오던 텔레그램 봇에 간단한 내용까지 표시해봤습니다

안녕하세요 케이입니다. 앞에서는 텔레그램 뉴스봇에서 관심 없는 단어가 들어간 뉴스는 자동으로 제외하도록 만들어봤습니다. 뉴스 개수도 줄이고, 같은 기사도 어느 정도 걸러내고, 원하는...

모두 읽어보기

관심 없는 단어가 들어간 뉴스는 자동으로 빼도록 만들어봤습니다

안녕하세요 케이입니다. 앞에서는 텔레그램 뉴스봇에서 제가 원하는 언론사만 골라서 받아보는 기능을 만들어봤습니다. 그렇게 출처까지 어느 정도 정리하고 나니까 확실히 뉴스가 깔끔해졌습니다. 그런데...

모두 읽어보기