- 0
- 235 단어
안녕하세요 케이입니다.
지금까지 제가 만든 뉴스봇은 주로 네이버 검색 API를 이용했습니다.
검색어를 입력하면 관련 뉴스를 찾아서 텔레그램으로 보내주는 방식이었습니다.
그런데 뉴스 자동수집 방법을 찾아보다 보니 계속 등장하는 단어가 하나 있었습니다.
RSS였습니다.
처음에는 이것도 API처럼 개발자가 쓰는 어려운 기능이라고 생각했습니다.
그래서 한동안은 그냥 넘겼습니다.
그런데 찾아보니 RSS는 생각보다 오래전부터 사용된 방식이었고, 뉴스나 블로그의 새 글을 자동으로 받아보는 데 꽤 유용했습니다.
그래서 이번에는 기존 네이버 뉴스 API 방식과는 별도로 RSS를 이용해서 같은 뉴스봇을 한번 만들어봤습니다.
RSS를 제가 이해한 방식
처음 RSS라는 말을 들었을 때는 뭔가 별도의 프로그램인 줄 알았습니다.
그런데 제가 이해한 방식은 생각보다 단순했습니다.
사이트에서 새로 올라온 글 목록을 일정한 형식으로 정리해서 보여주는 주소
정도로 생각하면 편했습니다.
일반 웹페이지는 사람이 보기 좋게 만들어져 있습니다.
반면 RSS는 프로그램이 읽기 쉽게
글 제목
링크
발행 시간
간단한 설명
같은 정보를 정리해놓은 형태였습니다.
즉 사람이 직접 사이트를 열어보지 않아도 프로그램이 RSS 주소를 읽어서 새 글을 가져올 수 있는 것입니다.
RSS 주소가 먼저 필요했습니다
네이버 검색 API에서는 검색어를 API 주소에 넣어 뉴스를 찾았습니다.
RSS는 조금 달랐습니다.
먼저 제가 보고 싶은 사이트가 RSS를 제공하는지 확인해야 했습니다.
사이트에 따라
전체 글 RSS
특정 카테고리 RSS
뉴스 RSS
처럼 여러 종류가 있는 경우도 있었습니다.
반대로 아예 RSS를 제공하지 않는 곳도 있었습니다.
그래서 이번에는 RSS 주소를 찾는 게 첫 번째 작업이었습니다.
RSS 주소를 브라우저에서 열어봤습니다
RSS 주소를 찾은 뒤 처음에는 그냥 웹브라우저에서 열어봤습니다.
그랬더니 평소 보는 홈페이지와는 전혀 다른 화면이 나왔습니다.
글자와 태그가 잔뜩 보였습니다.
처음에는 주소를 잘못 들어간 줄 알았습니다.
그런데 이게 정상적인 RSS 내용이었습니다.
예를 들어 안에는 이런 정보들이 들어 있었습니다.
title
link
description
pubDate
제목
링크
간단한 설명
발행 날짜
정도였습니다.
제가 뉴스봇에서 이미 사용하고 있던 정보와 꽤 비슷했습니다.
Google Apps Script에서 RSS 주소를 불러와봤습니다
RSS 주소를 찾았으니 이제 Google Apps Script에서 가져와봤습니다.
기본적인 형태는 이런 식이었습니다.
var response = UrlFetchApp.fetch(rssUrl);
var xml = response.getContentText();
처음 줄은 RSS 주소에 접속해서 내용을 가져오는 부분입니다.
두 번째 줄은 가져온 내용을 글자로 받아오는 부분입니다.
앞에서 뉴스 API를 사용할 때도 UrlFetchApp.fetch()를 사용한 적이 있어서 이번에는 완전히 낯설지는 않았습니다.
RSS는 XML이라는 형식이었습니다
그런데 가져온 내용을 바로 사용하기는 어려웠습니다.
RSS는 보통 XML이라는 형식으로 되어 있었습니다.
저는 XML을 처음 봤을 때 HTML하고 뭐가 다른지도 몰랐습니다.
지금도 자세한 차이를 설명할 수준은 아니지만 이번 작업에서는 굳이 깊게 알 필요는 없었습니다.
저는 그냥
RSS 데이터를 정리해서 담아놓는 형식
정도로 생각했습니다.
Google Apps Script에는 이 XML을 읽는 기능이 있었습니다.
var document = XmlService.parse(xml);
이걸 사용하면 가져온 RSS 내용을 코드에서 하나씩 꺼내볼 수 있었습니다.
RSS 안에서 뉴스 목록을 찾아봤습니다
RSS 구조는 사이트마다 조금 다를 수 있었습니다.
제가 테스트한 일반적인 RSS에서는 대략
channel
안에 여러 개의
item
이 들어 있는 형태였습니다.
쉽게 생각하면
channel = 뉴스 목록 전체
item = 뉴스 한 개
정도로 이해했습니다.
예를 들어 이런 식으로 가져올 수 있었습니다.
var root = document.getRootElement();
var channel = root.getChild("channel");
var items = channel.getChildren("item");
처음 보면 상당히 복잡해 보입니다.
저도 코드를 직접 처음부터 작성한 것은 아니고 하나씩 보면서 이해했습니다.
결국 제가 필요한 건 items 안에 여러 뉴스가 들어 있다는 것 정도였습니다.
뉴스 제목과 링크를 꺼내봤습니다
이제 각 뉴스에서 제목과 링크를 가져왔습니다.
for (var i = 0; i < items.length; i++) {
var item = items[i];
var title =
item.getChildText("title");
var link =
item.getChildText("link");
}
앞에서 네이버 API를 사용할 때는
item.title
item.link
같이 가져왔습니다.
RSS에서는 XML 안에서 title과 link를 찾아서 가져오는 방식이 조금 달랐습니다.
하지만 결국 결과는 똑같았습니다.
뉴스 제목 하나
뉴스 주소 하나
를 얻는 것입니다.
텔레그램으로 보내는 부분은 기존 코드를 이용했습니다
RSS에서 제목과 링크만 가져오면 그다음은 기존에 만들어놓은 방식과 거의 같았습니다.
sendMessage(
chatId,
title + "\n\n" + link
);
이렇게 하면 RSS에 올라온 글 제목과 링크가 텔레그램으로 들어왔습니다.
처음 정상적으로 메시지가 왔을 때는 조금 신기했습니다.
네이버 검색 API를 전혀 사용하지 않았는데도 뉴스가 들어왔기 때문입니다.
간단한 설명도 같이 가져와봤습니다
앞에서 뉴스 제목만 받아보다가 설명도 같이 붙였던 것처럼 RSS에서도 description을 가져와봤습니다.
var description =
item.getChildText("description");
그리고 메시지를 이런 식으로 만들어봤습니다.
var message =
title + "\n\n" +
description + "\n\n" +
link;
이렇게 하면 RSS에서 제공하는 간단한 글 설명까지 같이 볼 수 있었습니다.
다만 사이트에 따라 description에 실제 요약문이 들어 있기도 하고, HTML 태그가 섞여 있기도 했습니다.
그래서 기존 뉴스봇에서 사용했던 HTML 제거 코드도 다시 활용할 수 있었습니다.
RSS를 사용해보니 API와 느낌이 달랐습니다
여기까지 만들어보고 가장 먼저 느낀 차이가 있었습니다.
네이버 검색 API에서는 제가
인공지능
이라고 검색하면 여러 언론사의 인공지능 관련 뉴스가 나옵니다.
RSS는 기본적으로 특정 사이트에 새로 올라온 글을 가져오는 방식이었습니다.
즉 제가 느끼기에는
API는 검색
이고
RSS는 구독
에 가까웠습니다.
이 차이를 이해하고 나니까 둘의 용도가 조금 명확해졌습니다.
특정 사이트만 보고 싶다면 RSS가 꽤 편했습니다
앞에서는 특정 언론사의 뉴스만 받고 싶어서 링크 주소를 확인한 뒤 필터를 만들었습니다.
RSS를 사용하면 애초에 해당 언론사나 사이트의 RSS만 가져올 수 있기 때문에 이런 필터가 필요 없는 경우도 있었습니다.
예를 들어 제가 특정 IT 사이트의 새 글만 계속 받아보고 싶다면 그 사이트의 RSS 주소 하나만 등록해두면 됩니다.
새 글이 올라오면 RSS 목록에 들어오고, 제 봇은 그걸 가져와서 텔레그램으로 보내면 됩니다.
이 용도로는 상당히 단순했습니다.
반대로 자유롭게 검색하는 건 불편했습니다
하지만 RSS에도 바로 한계가 보였습니다.
네이버 뉴스 API에서는 오늘은
인공지능
내일은
환율
그다음에는
전기차
처럼 마음대로 검색어를 바꿀 수 있었습니다.
RSS에서는 이런 자유로운 검색이 어려웠습니다.
RSS 자체에 올라온 글 중에서 제가 다시 키워드를 걸러낼 수는 있지만, 애초에 다른 사이트의 뉴스까지 한꺼번에 검색해오는 방식은 아니었습니다.
그래서 제가 기존에 만들었던 /news 기능을 RSS로 완전히 바꾸는 건 조금 애매했습니다.
사이트마다 RSS 구조가 달랐습니다
이 부분도 직접 하면서 불편했던 점입니다.
어떤 RSS는 제가 앞에서 사용한
channel
item
구조로 잘 읽혔습니다.
그런데 사이트에 따라 구조가 조금 다른 경우도 있었습니다.
description이 없는 경우도 있었고
발행 날짜 이름이 다르거나
RSS가 아니라 Atom이라는 비슷한 형식을 사용하는 곳도 있었습니다.
그래서 한 사이트에서 잘 작동한 코드를 다른 RSS 주소에 그대로 넣으면 오류가 날 수도 있었습니다.
처음에는
“RSS는 다 같은 형식 아니었나?”
라고 생각했는데 실제로는 조금씩 차이가 있었습니다.
RSS 새 글을 전부 보내면 또 너무 많았습니다
RSS를 연결했다고 끝은 아니었습니다.
글이 많이 올라오는 사이트라면 텔레그램 메시지도 많이 왔습니다.
그래서 앞에서 만들었던 뉴스 개수 제한 기능을 다시 사용했습니다.
for (var i = 0; i < items.length && i < 5; i++) {
이렇게 하면 가장 최근 글 몇 개만 가져올 수 있었습니다.
또 이미 보낸 링크를 저장하는 중복 제거 기능도 RSS에서 그대로 사용할 수 있었습니다.
오히려 지금까지 만들어둔 기능들이 여기에서 다시 재활용됐습니다.
이미 보낸 RSS 글은 다시 보내지 않도록 했습니다
RSS 자동수집에서는 이 기능이 특히 중요했습니다.
예를 들어 1시간마다 RSS를 확인한다고 해보겠습니다.
중복 체크가 없다면 매번 최근 글 5개가 똑같이 올 수 있습니다.
그래서 기사 링크를 저장해놓고 이미 보낸 글이면 건너뛰도록 했습니다.
구조는 앞에서 만들었던 방식과 같았습니다.
var alreadySent =
properties.getProperty(link);
if (alreadySent) {
continue;
}
처음 보는 링크라면 보내고
properties.setProperty(
link,
new Date().getTime().toString()
);
처럼 기록을 남겼습니다.
이렇게 해놓으니 RSS가 훨씬 자동수집답게 움직였습니다.
RSS도 트리거와 같이 사용해봤습니다
RSS를 직접 /rss 같은 명령어로 불러올 수도 있지만 제가 원했던 건 자동수집이었습니다.
그래서 앞에서 사용했던 Google Apps Script 트리거를 다시 활용했습니다.
예를 들어 일정 시간마다 RSS를 확인하고
새 글이 있으면 텔레그램으로 보내고
새 글이 없으면 아무것도 보내지 않는 방식입니다.
이렇게 하니까 제가 사이트를 직접 열어보지 않아도 새로운 글만 받아볼 수 있었습니다.
RSS는 무료라는 점도 마음에 들었습니다
RSS 자체는 사이트에서 공개하고 있다면 별도의 API 키가 필요 없는 경우가 많았습니다.
네이버 검색 API처럼 Client ID와 Client Secret을 관리할 필요도 없었습니다.
그래서 간단하게 특정 사이트의 새 글을 확인하는 정도라면 RSS도 꽤 매력적이었습니다.
다만 모든 사이트가 RSS를 제공하는 것은 아니기 때문에 RSS만으로 제가 원하는 모든 뉴스를 가져올 수는 없었습니다.
저는 결국 API와 RSS를 같이 쓰는 쪽이 마음에 들었습니다
직접 만들어보니 둘 중 하나를 꼭 선택할 필요는 없었습니다.
예를 들어 전체 뉴스 검색은 네이버 API를 사용합니다.
제가 매일 챙겨보는 특정 사이트는 RSS로 가져옵니다.
이렇게 역할을 나누는 방식이 더 편했습니다.
API는 넓게 찾고
RSS는 정해진 곳을 계속 지켜보는 느낌이었습니다.
직접 써보니 RSS가 왜 아직 사용되는지 조금 알 것 같았습니다
처음에는 RSS가 굉장히 오래된 방식이라고 해서 지금은 거의 안 쓰는 기능인 줄 알았습니다.
그런데 새 글 자동수집이라는 목적만 놓고 보면 오히려 상당히 단순했습니다.
특정 사이트에서 새 글이 올라왔는지만 확인하는 데 굳이 복잡한 검색 API가 필요하지 않았습니다.
RSS 주소 하나만 제대로 가져올 수 있다면 꽤 편하게 사용할 수 있었습니다.
저처럼 자동화를 처음 해보는 사람이라면 RSS와 API 중 무엇이 더 좋다고 단정하기보다는 둘의 역할이 다르다고 생각하는 게 이해하기 쉬운 것 같습니다.
다음에는 제가 네이버 검색 API와 RSS를 실제로 둘 다 사용해본 입장에서
초보자에게는 어떤 방식이 더 쉬웠고, 각각 어떤 상황에 더 잘 맞았는지
한번 비교해서 정리해보겠습니다.