안녕하세요 케이입니다.

앞에서는 텔레그램 뉴스봇에서 검색 결과를 너무 많이 보내지 않도록 5개 정도만 나오게 제한해봤습니다.

그렇게 해놓으니까 확실히 보기는 편해졌습니다.

그런데 이번에는 또 다른 문제가 눈에 들어왔습니다.

뉴스 개수는 줄었는데, 비슷한 뉴스가 계속 반복해서 나왔습니다.

예를 들어 제가 인공지능이라고 검색하면 제목만 조금 다를 뿐 거의 같은 내용의 기사가 여러 개 나오는 경우가 있었습니다.

특히 큰 뉴스가 있는 날에는 더 심했습니다.

같은 이슈를 여러 언론사에서 거의 동시에 보도하다 보니까, 5개만 받아도 비슷한 내용이 3~4개씩 섞여 있었습니다.

그래서 이번에는

이미 한 번 보낸 뉴스는 다시 보내지 않도록 만들어보자

고 생각했습니다.

처음에는 이 기능이 꽤 어려울 것 같았습니다.

그런데 원리를 아주 단순하게 생각하니까 조금 이해가 됐습니다.

중복 뉴스를 막는 방법은 생각보다 단순했습니다

제가 이해한 방식은 이렇습니다.

뉴스를 하나 보냅니다.

그 뉴스를 보냈다는 기록을 어딘가에 저장합니다.

다음에 같은 뉴스가 또 검색되면

“이건 전에 보낸 뉴스네.”

라고 판단해서 보내지 않는 겁니다.

결국 필요한 건 두 가지였습니다.

보낸 뉴스를 기억하는 것

그리고

새 뉴스와 비교하는 것

이 두 가지만 하면 됐습니다.

문제는 뭘 기준으로 같은 뉴스라고 판단할 것인가였습니다.

제목으로 비교할지 링크로 비교할지 고민했습니다

처음에는 뉴스 제목을 저장하면 될 것 같았습니다.

예를 들어 이런 뉴스가 있다고 해보겠습니다.

AI 시장 급성장, 국내 기업 투자 확대

이 제목을 저장해두고 다음에 똑같은 제목이 나오면 중복으로 판단하는 방식입니다.

그런데 생각해보니까 제목은 조금씩 바뀔 수 있습니다.

같은 기사라도 제목이 수정될 수 있고, 같은 내용을 다룬 기사도 제목은 전혀 다를 수 있습니다.

그래서 저는 일단 뉴스 링크를 기준으로 중복 여부를 확인하는 방식으로 시작했습니다.

같은 URL이면 거의 확실하게 같은 기사라고 볼 수 있기 때문입니다.

물론 완벽한 방법은 아니지만 초보자인 제가 처음 적용하기에는 가장 이해하기 쉬웠습니다.

이번에도 PropertiesService를 사용했습니다

지난 글들에서 뉴스 검색 상태를 저장할 때 PropertiesService를 사용했었습니다.

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

다만 이번에는

“지금 뉴스 검색 중이다.”

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

“이 뉴스 링크는 이미 보냈다.”

라는 기록을 저장했습니다.

대략 이런 식입니다.

var properties = PropertiesService.getScriptProperties();

이렇게 저장 공간을 가져온 다음, 뉴스 하나를 보낼 때마다 링크를 저장했습니다.

properties.setProperty(item.link, "sent");

제가 이해한 방식대로라면

item.link

라는 뉴스 주소를 이름표처럼 사용하고

그 안에 sent

라는 값을 저장하는 것입니다.

즉

“이 주소는 이미 보냈음”

이라는 표시를 남기는 셈입니다.

뉴스 보내기 전에 먼저 확인하도록 바꿨습니다

이제 뉴스를 보내기 전에

이 링크가 저장되어 있는지 먼저 확인하면 됩니다.

예를 들어 이런 식으로 만들었습니다.

var alreadySent = properties.getProperty(item.link);

if (alreadySent) {
  continue;
}

처음에는 continue라는 것도 낯설었습니다.

제가 이해한 의미는

이번 뉴스는 건너뛰고 다음 뉴스로 넘어가라

정도였습니다.

즉 이미 보낸 뉴스라면 텔레그램으로 보내지 않고 다음 기사로 넘어가는 방식입니다.

반대로 처음 보는 뉴스라면 메시지를 보낸 뒤 기록을 저장했습니다.

sendMessage(
  chatId,
  item.title + "\n" + item.link
);

properties.setProperty(item.link, "sent");

전체 흐름은 생각보다 단순했습니다.

검색 결과 하나 확인

→ 전에 보냈는지 확인

→ 보냈으면 건너뜀

→ 처음 보는 뉴스면 텔레그램으로 보냄

→ 보낸 뉴스로 기록

이 순서였습니다.

실제로 돌려보니까 바로 차이가 보였습니다

처음에는 제대로 되는지 확인하려고 같은 검색어를 연속으로 입력해봤습니다.

먼저

/news

를 입력하고

인공지능

을 검색했습니다.

처음에는 뉴스 5개가 정상적으로 왔습니다.

그리고 바로 다시 같은 검색어를 입력해봤습니다.

예전 같았으면 거의 똑같은 뉴스가 다시 왔을 텐데, 이번에는 이미 보낸 링크는 건너뛰고 다른 뉴스가 나오거나 결과가 줄어들었습니다.

이때 처음으로

“아, 진짜 기록이 남아 있긴 하구나.”

싶었습니다.

단순한 기능인데 실제로 써보니까 뉴스봇이 조금 더 똑똑해진 느낌이었습니다.

그런데 새로운 문제가 또 생겼습니다

잘 되긴 했는데 또 문제가 있었습니다.

한 번 보낸 뉴스는 계속 중복으로 처리됐습니다.

오늘 본 기사인데 며칠 뒤 다시 검색했을 때도 계속 제외될 수 있다는 뜻입니다.

처음에는 그게 좋아 보였는데 생각해보니까 오래된 기록이 계속 쌓이면 불편할 수도 있었습니다.

예를 들어 한 달 전에 봤던 뉴스라면 굳이 계속 막을 필요는 없을 수도 있습니다.

그래서

언제까지 중복으로 볼 것인지

도 생각해야 했습니다.

이 부분부터는 조금 더 복잡해졌습니다.

단순하게 날짜도 같이 저장해봤습니다

저는 일단 보낸 날짜를 같이 저장하는 방식으로 바꿔봤습니다.

예를 들어

properties.setProperty(
  item.link,
  new Date().getTime().toString()
);

이렇게 하면 sent라는 글자 대신 뉴스가 발송된 시간을 저장할 수 있습니다.

처음에는 이 숫자가 뭔지 몰랐습니다.

실제로 확인하면 굉장히 긴 숫자가 나옵니다.

제가 이해한 정도로는

현재 시간을 컴퓨터가 비교하기 편한 숫자로 바꿔서 저장하는 방식이었습니다.

이 숫자를 이용하면

“이 뉴스가 언제 발송됐는가”

를 나중에 확인할 수 있습니다.

저는 일단 하루 동안은 같은 뉴스를 보내지 않게 해봤습니다

테스트하면서 제가 원하는 기준을 생각해봤습니다.

한 번 본 뉴스를 영원히 안 보내는 건 조금 과한 것 같았고

몇 분마다 똑같은 뉴스가 반복되는 것만 막아도 충분했습니다.

그래서 일단 24시간 정도를 기준으로 잡아봤습니다.

개념은 이렇습니다.

현재 시간에서

뉴스를 마지막으로 보낸 시간을 뺍니다.

그 차이가 24시간보다 짧으면 중복으로 처리합니다.

24시간보다 오래됐으면 다시 보내도 된다고 판단합니다.

대략 이런 식입니다.

var lastSent = properties.getProperty(item.link);

if (lastSent) {
  var passedTime = new Date().getTime() - Number(lastSent);

  if (passedTime < 24 * 60 * 60 * 1000) {
    continue;
  }
}

처음 이 코드를 봤을 때는

24 * 60 * 60 * 1000

이게 뭔가 싶었습니다.

하나씩 보니까

24시간

× 60분

× 60초

× 1000밀리초

였습니다.

즉 하루를 밀리초 단위로 바꾼 숫자였습니다.

저는 이런 계산을 직접 외우지는 않았습니다.

그냥

“이 부분이 24시간 기준이구나.”

정도만 이해하고 사용했습니다.

완전히 같은 기사만 막는 방식에는 한계도 있었습니다

여기까지 만들고 나니 또 하나 알게 된 게 있었습니다.

링크 기준으로 중복을 제거하면

완전히 같은 기사

는 잘 걸러냅니다.

하지만 다른 언론사에서 거의 같은 내용을 보도한 경우는 걸러지지 않습니다.

예를 들어

A언론사

삼성, 새로운 AI 서비스 공개

B언론사

삼성전자 AI 서비스 발표

내용은 거의 같은데 링크는 완전히 다릅니다.

그러면 제 봇에서는 서로 다른 뉴스로 판단합니다.

처음에는 이것도 중복으로 제거하고 싶었습니다.

그런데 그렇게 하려면 제목을 비교하거나 뉴스 내용을 분석해서 비슷한 기사인지 판단해야 했습니다.

여기부터는 제가 만들었던 단순한 방식보다 조금 더 복잡해졌습니다.

그래서 이번에는 욕심내지 않고

같은 링크가 반복해서 오는 것부터 막는 정도

로 정리했습니다.

저처럼 처음 만드는 입장에서는 한 번에 너무 완벽하게 만들려고 하면 오히려 중간에 포기할 것 같았습니다.

중복 뉴스를 제거하니까 5개가 안 오는 경우도 있었습니다

또 하나 예상하지 못했던 문제가 있었습니다.

앞에서는 뉴스 결과를 5개로 제한해놨습니다.

그런데 검색 결과 처음 5개 중에서 3개가 이미 보낸 뉴스라면 실제로 텔레그램에는 2개밖에 오지 않을 수 있었습니다.

저는 처음에

“분명 5개로 설정했는데 왜 2개만 오지?”

하고 한참 봤습니다.

생각해보니 당연했습니다.

뉴스 5개를 가져온 다음

중복을 제거하고 있었기 때문입니다.

그래서 중복 제거 후에도 5개를 받고 싶다면 검색 결과를 조금 더 많이 가져온 다음

처음 보는 뉴스가 5개가 될 때까지만 보내야 했습니다.

예를 들어 검색 결과를 20개 가져오고

그 안에서 중복을 제외한 새로운 뉴스 5개를 골라 보내는 방식입니다.

보낸 개수를 따로 세어봤습니다

그래서 sentCount라는 숫자를 하나 만들어봤습니다.

var sentCount = 0;

뉴스를 하나 보낼 때마다 숫자를 1씩 늘립니다.

sentCount++;

그리고 5개를 보냈으면 반복을 끝냅니다.

if (sentCount >= 5) {
  break;
}

break라는 것도 이번에 처음 제대로 이해했습니다.

앞에서 사용했던 continue는

이번 것만 건너뛰기

였다면

break는

반복 자체를 여기서 끝내기

였습니다.

둘이 비슷해 보여서 처음에는 헷갈렸습니다.

정리하면

중복 뉴스면 continue

뉴스 5개를 다 보냈으면 break

이렇게 사용했습니다.

제가 사용한 흐름은 결국 이렇게 됐습니다

최종적으로는 뉴스 검색 결과를 하나씩 확인합니다.

이미 24시간 안에 보낸 링크인지 확인합니다.

이미 보냈다면 건너뜁니다.

처음 보는 뉴스라면 텔레그램으로 보냅니다.

보낸 시간을 저장합니다.

보낸 뉴스가 5개가 되었는지 확인합니다.

5개가 되면 검색을 끝냅니다.

이 방식으로 만들어놓으니 확실히 전보다 사용하기 편해졌습니다.

단순히 검색 결과 앞에서 5개를 잘라 보내는 것보다 실제로 새로운 뉴스 5개를 받는 느낌에 가까워졌습니다.

직접 써보니까 작은 기능 차이가 꽤 컸습니다

처음 뉴스봇을 만들 때는 그냥 뉴스가 텔레그램으로 오는 것만으로 만족했습니다.

그런데 실제로 계속 사용하다 보니

뉴스 개수 제한

중복 제거

검색 상태 저장

오류 확인

같은 작은 기능이 훨씬 중요했습니다.

이런 기능이 없으면 처음 며칠은 재미있게 사용해도 결국 불편해서 안 쓰게 될 것 같았습니다.

이번 중복 제거 기능도 눈에 띄게 대단한 기능은 아니지만 실제로는 꽤 만족도가 높았습니다.

특히 같은 검색어를 하루에 여러 번 확인할 때 차이가 컸습니다.

오전에 한 번 뉴스를 보고

오후에 다시 같은 검색어를 입력하면

아까 봤던 기사 대신 새롭게 검색된 기사를 중심으로 볼 수 있었습니다.

조금씩 제가 원했던 뉴스봇에 가까워지는 느낌입니다.

다음에는 원하는 언론사 뉴스만 받아보려고 합니다

중복 뉴스까지 어느 정도 정리하고 나니 이번에는 뉴스의 개수보다

어떤 언론사의 뉴스가 나오는지

가 신경 쓰이기 시작했습니다.

검색 결과를 보다 보면 제가 자주 보는 언론사도 있고

반대로 별로 보고 싶지 않은 사이트도 섞여 있었습니다.

그래서 다음에는 검색된 뉴스 중에서 특정 언론사만 남기거나

반대로 특정 사이트는 제외하는 기능을 직접 넣어보려고 합니다.

뉴스를 많이 가져오는 것보다

제가 실제로 보고 싶은 뉴스만 남기는 방향으로 하나씩 바꿔보겠습니다.

답글 남기기

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

글쓴이

bluekei9@keinote.com

관련 게시물

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

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

모두 읽어보기

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

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

모두 읽어보기

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

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

모두 읽어보기

매번 검색하기 귀찮아서 자주 보는 뉴스 키워드를 저장해봤습니다

안녕하세요 케이입니다. 앞에서는 텔레그램으로 오는 뉴스 메시지를 조금 더 보기 좋게 꾸며봤습니다. 제목은 굵게 만들고, 설명은 짧게 붙이고, 긴 링크도 기사 보기처럼...

모두 읽어보기

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

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

모두 읽어보기

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

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

모두 읽어보기