Computer >> Máy Tính >  >> Lập trình >> Ruby

Cho phép xây dựng một RSS để gửi kịch bản thông báo qua email với Ruby

Cho phép xây dựng một RSS để gửi kịch bản thông báo qua email với Ruby 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:

  1. Tìm nạp và phân tích cú pháp nguồn cấp RSS cho blog Honeybadger

  2. Chọn các bài viết thích hợp theo danh mục

  3. 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:

Cho phép xây dựng một RSS để gửi kịch bản thông báo qua email với Ruby Đầ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:

  1. Làm cho mẫu đẹp và kiểm tra nó với nhà cung cấp email của chúng tôi

  2. Thêm thông số theo dõi Google Analytics vào các liên kết

  3. Thêm mô tả bài đăng vào mẫu