Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

มาสร้างสคริปต์สรุป RSS สำหรับอีเมลด้วย Ruby

มาสร้างสคริปต์สรุป RSS สำหรับอีเมลด้วย Ruby ฉันต้องการสิ่งนี้

การตั้งค่าจดหมายข่าวอยู่ในรายการสิ่งที่ต้องทำของฉันนานเกินไป วันนี้เป็นวันที่ฉันจะทำมัน หากคุณต้องการลงทะเบียน สามารถทำได้ที่นี่

ฉันไม่ชอบจดหมายข่าวฉบับยาว สิ่งที่ฉันชอบคือการย่อยเนื้อหาที่น่าสนใจ RubyWeekly คิดถึง บล็อกของ Wistia ก็เช่นกัน

การรวบรวมไดเจสต์เหล่านี้ด้วยตนเองใช้เวลานานเกินไป แต่การใช้ระบบอัตโนมัติเต็มรูปแบบนั้นไม่มีตัวตนเกินไป สิ่งที่ฉันต้องการคือกระบวนการกึ่งอัตโนมัติ ฉันต้องการสคริปต์ที่จะดึงโพสต์บล็อกล่าสุดของเราและส่งออกอีเมล HTML ที่ฉันสามารถปรับแต่งได้

มาสร้างกัน! มันจะเป็นโปรเจ็กต์เล็กๆ แสนสนุกที่มีผู้ใช้เพียงคนเดียวที่จะสร้างความสุข - ฉัน!

แผนเกม

สคริปต์ของเราต้องทำบางสิ่ง:

  1. ดึงและแยกวิเคราะห์ฟีด RSS สำหรับบล็อก Honeybadger

  2. เลือกบทความที่เหมาะสมตามหมวดหมู่

  3. แสดงผลการรวบรวมบทความผ่านเทมเพลต 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

นี่คือผลลัพธ์ที่ออกมา:

มาสร้างสคริปต์สรุป RSS สำหรับอีเมลด้วย Ruby ผลลัพธ์ของตัวสร้างไดเจสต์บล็อกของเรา

งานในอนาคต

ฉันต้องทำอะไรมากกว่านี้ก่อนจะพร้อมสำหรับการผลิต แต่สิ่งเหล่านี้ส่วนใหญ่เป็นการปรับแต่งเฉพาะสำหรับ Honeybadger และจะไม่มีประโยชน์มากนัก นี่คือรายการนัดหยุดงานของฉันในช่วงที่เหลือของวัน:

  1. สร้างเทมเพลตให้สวยงามและทดสอบกับผู้ให้บริการอีเมลของเรา

  2. เพิ่มพารามิเตอร์การติดตามของ Google Analytics ลงในลิงก์

  3. เพิ่มคำอธิบายโพสต์ลงในเทมเพลต