이런 걸 원해요
뉴스레터 설정은 너무 오랫동안 내 할일 목록에 있었습니다. 오늘은 내가 그것을 실현하는 날이다. 가입을 원하시면 여기에서 하실 수 있습니다.
나는 긴 카피 뉴스레터를 별로 좋아하지 않는다. 내가 좋아하는 것은 흥미로운 콘텐츠의 선별된 요약입니다. RubyWeekly가 생각납니다. Wistia의 블로그 다이제스트도 마찬가지입니다.
이러한 다이제스트를 수동으로 통합하는 데 너무 많은 시간이 걸립니다. 그러나 완전 자동으로 가는 것은 너무 비인간적입니다. 그래서 제가 원하는 것은 반자동 프로세스입니다. 가장 최근 블로그 게시물을 가져와서 개인화할 수 있는 HTML 이메일을 출력하는 스크립트가 필요합니다.
그럼 빌드를 해보자! 나를 행복하게 해줄 단 한 명의 사용자와 함께하는 재미있는 작은 프로젝트가 될 것입니다!
게임 계획
스크립트는 몇 가지 작업을 수행해야 합니다.
-
Honeybadger 블로그의 RSS 피드 가져오기 및 구문 분석
-
카테고리별로 적절한 기사 선택
-
ERB 템플릿을 통해 기사 컬렉션 렌더링
명령줄에서 실행되고 결과를 STDOUT에 인쇄합니다.
Ruby에서 피드 가져오기 및 구문 분석
Ruby의 표준 라이브러리에는 RSS 및 ATOM 피드를 생성하고 사용하기 위한 모듈이 포함되어 있다는 사실을 알고 계셨습니까? 우리의 사용 사례에서는 이보다 더 간단할 수 없습니다. 작동 방식은 다음과 같습니다.
require 'rss'
feed = RSS::Parser.parse('https://www.honeybadger.io/blog/feed/')
feed.items.each do |item|
puts item.title
end
모듈은 우리를 위해 피드를 가져오기도 합니다. 서비스에 대해 이야기하십시오!
카테고리 작업
구독자에게 관심이 없는 링크를 보내고 싶지 않으므로 카테고리별로 기사를 필터링하겠습니다. Ruby의 RSS 라이브러리에는 categories
가 있습니다. 메서드에서 XML 노드 개체의 배열을 반환합니다. 카테고리 이름이 필요하므로 RSS 항목을 Article
이라는 데코레이터 클래스로 래핑합니다. .
이제 "How To" 카테고리의 기사만 쉽게 선택할 수 있습니다.
require 'rss'
require 'delegate'
class Article < SimpleDelegator
def category_names
categories.map &:content
end
end
feed = RSS::Parser.parse('https://www.honeybadger.io/blog/feed/')
articles = feed.items.map { |o| Article.new(o) }.select { |a| a.category_names.include?("How To") }
템플릿 렌더링
이것은 매우 많은 마크업이 없는 이메일이 될 것이기 때문에 템플릿에 ERB를 사용할 것입니다. 아래에서 볼 수 있듯이 템플릿과 렌더링 코드를 DigestView라는 클래스에 함께 넣었습니다. 이러한 작은 단일 목적 템플릿의 경우 별도의 파일로 분할하는 것은 너무 무리한 것 같았습니다.
최종 출력은 STDOUT에 인쇄됩니다. 이렇게 하면 출력을 OSX pbcopy
로 파이프할 수 있습니다. 명령을 사용하여 출력을 클립보드에 복사하여 메일 시스템에 붙여넣을 수 있습니다.
require 'rss'
require 'delegate'
require 'erb'
class Article < SimpleDelegator
def category_names
categories.map &:content
end
end
class DigestView
attr_accessor :articles
def initialize(articles)
@articles = articles
end
def render
ERB.new(template, 0, '>').result(binding)
end
def template
%{<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="https://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head>
<body>
<h1>Headline: Replace me</h1>
<p>Intro paragraph: Replace me.</p>
<ul>
<% for article in @articles %>
<li>
<a href="<%= article.link %>">
</li>
<% end %>
</ul>
</body>
</html>}
end
end
feed = RSS::Parser.parse('https://www.honeybadger.io/blog/feed/')
articles = feed.items.map { |o| Article.new(o) }.select { |a| a.category_names.include?("How To") }
printf DigestView.new(articles).render
출력은 다음과 같습니다.
블로그 다이제스트 생성기의 출력
미래 작업
생산 준비가 되기 전에 조금 더 해야 합니다. 그러나 이것들은 대부분 Honeybadge와 관련된 사용자 정의이며 그렇지 않으면별로 유용하지 않습니다. 오늘의 남은 경고 목록은 다음과 같습니다.
-
템플릿을 예쁘게 만들고 이메일 제공업체를 통해 테스트하세요.
-
링크에 Google Analytics 추적 매개변수 추가
-
템플릿에 게시물 설명 추가