ฉันต้องการสิ่งนี้
การตั้งค่าจดหมายข่าวอยู่ในรายการสิ่งที่ต้องทำของฉันนานเกินไป วันนี้เป็นวันที่ฉันจะทำมัน หากคุณต้องการลงทะเบียน สามารถทำได้ที่นี่
ฉันไม่ชอบจดหมายข่าวฉบับยาว สิ่งที่ฉันชอบคือการย่อยเนื้อหาที่น่าสนใจ RubyWeekly คิดถึง บล็อกของ Wistia ก็เช่นกัน
การรวบรวมไดเจสต์เหล่านี้ด้วยตนเองใช้เวลานานเกินไป แต่การใช้ระบบอัตโนมัติเต็มรูปแบบนั้นไม่มีตัวตนเกินไป สิ่งที่ฉันต้องการคือกระบวนการกึ่งอัตโนมัติ ฉันต้องการสคริปต์ที่จะดึงโพสต์บล็อกล่าสุดของเราและส่งออกอีเมล HTML ที่ฉันสามารถปรับแต่งได้
มาสร้างกัน! มันจะเป็นโปรเจ็กต์เล็กๆ แสนสนุกที่มีผู้ใช้เพียงคนเดียวที่จะสร้างความสุข - ฉัน!
แผนเกม
สคริปต์ของเราต้องทำบางสิ่ง:
-
ดึงและแยกวิเคราะห์ฟีด RSS สำหรับบล็อก Honeybadger
-
เลือกบทความที่เหมาะสมตามหมวดหมู่
-
แสดงผลการรวบรวมบทความผ่านเทมเพลต 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
โมดูลยังดึงฟีดให้เราด้วย คุยเรื่องบริการ!
การทำงานกับหมวดหมู่
ฉันไม่ต้องการส่งลิงก์สมาชิกที่พวกเขาไม่สนใจ ดังนั้นฉันจะกรองบทความตามหมวดหมู่ ในขณะที่ไลบรารี RSS ของ Ruby มี 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
นี่คือผลลัพธ์ที่ออกมา:
ผลลัพธ์ของตัวสร้างไดเจสต์บล็อกของเรา
งานในอนาคต
ฉันต้องทำอะไรมากกว่านี้ก่อนจะพร้อมสำหรับการผลิต แต่สิ่งเหล่านี้ส่วนใหญ่เป็นการปรับแต่งเฉพาะสำหรับ Honeybadger และจะไม่มีประโยชน์มากนัก นี่คือรายการนัดหยุดงานของฉันในช่วงที่เหลือของวัน:
-
สร้างเทมเพลตให้สวยงามและทดสอบกับผู้ให้บริการอีเมลของเรา
-
เพิ่มพารามิเตอร์การติดตามของ Google Analytics ลงในลิงก์
-
เพิ่มคำอธิบายโพสต์ลงในเทมเพลต