Tôi muốn một thứ như thế này
Thiết lập một bản tin đã nằm trong danh sách việc cần làm của tôi quá lâu. Hôm nay là ngày tôi sẽ biến nó thành hiện thực. Nếu bạn muốn đăng ký, bạn có thể làm như vậy tại đây.
Tôi không thực sự thích những bản tin dài lê thê. Những thứ tôi thích là những thông báo có nội dung thú vị được tuyển chọn. RubyWeekly có tâm. Thông báo trên blog của Wistia cũng vậy.
Việc ghép các tiêu chí này lại với nhau theo cách thủ công mất quá nhiều thời gian. Nhưng đi hoàn toàn tự động là quá cá nhân. Vì vậy, những gì tôi muốn là một quy trình bán tự động. Tôi cần một tập lệnh sẽ tìm nạp các bài đăng trên blog gần đây nhất của chúng tôi và xuất ra một email HTML mà tôi có thể cá nhân hóa.
Vì vậy, chúng ta hãy xây dựng nó! Đó sẽ là một dự án nhỏ thú vị với chỉ một người dùng để tạo niềm vui - tôi!
Kế hoạch trò chơi
Tập lệnh của chúng tôi cần thực hiện một số điều sau:
-
Tìm nạp và phân tích cú pháp nguồn cấp RSS cho blog Honeybadger
-
Chọn các bài viết thích hợp theo danh mục
-
Hiển thị bộ sưu tập các bài báo qua mẫu ERB
Nó sẽ được chạy từ dòng lệnh và in kết quả của nó ra STDOUT.
Tìm nạp và phân tích cú pháp Nguồn cấp dữ liệu trong Ruby
Bạn có biết rằng thư viện tiêu chuẩn của Ruby đi kèm với một mô-đun để sản xuất và sử dụng nguồn cấp RSS &ATOM không? Đối với trường hợp sử dụng của chúng tôi, nó không thể đơn giản hơn nhiều. Đây là cách nó hoạt động:
require 'rss'
feed = RSS::Parser.parse('https://www.honeybadger.io/blog/feed/')
feed.items.each do |item|
puts item.title
end
Mô-đun thậm chí còn tìm nạp nguồn cấp dữ liệu cho chúng tôi. Nói về Dịch vụ!
Làm việc với Danh mục
Tôi không muốn gửi các liên kết đến người đăng ký mà họ không quan tâm, vì vậy tôi sẽ lọc các bài viết theo danh mục. Trong khi thư viện RSS của Ruby có categories
, nó trả về một mảng các đối tượng nút XML. Tôi cần tên danh mục, vì vậy tôi bọc các mục RSS trong một lớp trang trí có tên là Article
.
Bây giờ tôi chỉ có thể dễ dàng chọn các bài viết trong danh mục "Cách thực hiện".
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") }
Hiển thị Mẫu
Vì đây sẽ là một email không có nhiều đánh dấu, tôi sẽ chỉ sử dụng ERB để tạo mẫu. Như bạn có thể thấy bên dưới, tôi đặt mẫu và mã kết xuất cùng nhau trong một lớp có tên là DigestView. Đối với một mẫu nhỏ, có mục đích duy nhất như vậy, dường như quá mức cần thiết để chia nó thành một tệp riêng biệt.
Kết quả cuối cùng được in thành STDOUT. Điều này sẽ cho phép tôi chuyển đầu ra vào OSXs pbcopy
, sao chép đầu ra vào khay nhớ tạm để tôi có thể dán nó vào hệ thống thư của chúng tôi.
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
Đây là kết quả đầu ra trông như thế nào:
Đầu ra của trình tạo thông báo blog của chúng tôi.
Công việc trong tương lai
Tôi sẽ cần phải làm thêm một chút trước khi sản phẩm này sẵn sàng cho quá trình sản xuất. Nhưng đây chủ yếu là các tùy chỉnh dành riêng cho Honeybadger và nếu không sẽ rất hữu ích. Đây là danh sách cảnh cáo của tôi trong thời gian còn lại trong ngày:
-
Làm cho mẫu đẹp và kiểm tra nó với nhà cung cấp email của chúng tôi
-
Thêm thông số theo dõi Google Analytics vào các liên kết
-
Thêm mô tả bài đăng vào mẫu