Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Xây dựng công cụ Digest RSS-to-Email bằng Ruby

Xây dựng công cụ Digest RSS-to-Email bằng Ruby Mình muốn cái dạng này.

Thiết lập newsletter đã nằm trong todo list quá lâu. Hôm nay sẽ làm cho xong. Nếu muốn đăng ký, có thể làm tại đây.

Tôi không thích newsletter dạng văn bản dài. Những thứ tôi thích là digest tuyển chọn nội dung thú vị. Ví dụ RubyWeekly, hay blog digest của Wistia.

Tổng hợp digest thủ công tốn quá nhiều thời gian. Nhưng full-auto lại thiếu sự cá nhân. Vì vậy tôi muốn quy trình bán tự động: script lấy bài viết mới nhất từ blog, xuất HTML email để cá nhân hóa.

Hãy xây dựng nó! Dự án nhỏ vui vẻ, chỉ có một người dùng cần làm hài lòng — chính tôi!

Kế hoạch

Script cần làm vài việc:

  1. Lấy và parse RSS feed của blog Honeybadger
  2. Lọc bài viết theo category phù hợp
  3. Render tập bài viết qua template ERB

Sẽ chạy từ dòng lệnh và in kết quả ra STDOUT.

Lấy và parse Feed trong Ruby

Bạn có biết thư viện chuẩn Ruby có module sản xuất và tiêu dùng RSS & ATOM? Cho trường hợp này không thể đơn giản hơn:

require 'rss'
feed = RSS::Parser.parse('https://www.honeybadger.io/blog/feed/')
feed.items.each do |item|
  puts item.title
end

Module thậm chí tự fetch feed. Service tuyệt vời!

Làm việc với Category

Không muốn gửi link không liên quan, nên lọc bài viết theo category. Thư viện RSS của Ruby có phương thức `categories` nhưng trả về mảng đối tượng XML node. Cần tên category, nên wrap item RSS trong class decorator `Article`.

Bây giờ dễ dàng chọn bài viết category "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") }

Render Template

Vì email không cần nhiều markup, dùng ERB cho templating. Template và code render gom trong class `DigestView`. Với template nhỏ, single-purpose, tách file riêng là overkill.

Kết quả in ra STDOUT, cho phép pipe vào lệnh `pbcopy` của macOS, copy vào clipboard để dán vào hệ thống mail.

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 %>"><%= article.title %></a>
</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

Đây là đầu ra:

Xây dựng công cụ Digest RSS-to-Email bằng Ruby Đầu ra của blog digest generator.

Công việc tương lai

Cần làm thêm trước khi production-ready. Nhưng phần lớn là tùy chỉnh cho Honeybadger, không mang tính chung. Danh sách việc còn lại:

  1. Làm đẹp template & test với email provider
  2. Thêm tham số Google Analytics tracking vào link
  3. Thêm mô tả bài viết vào template