मुझे ऐसा कुछ चाहिए
न्यूज़लेटर सेट करना बहुत लंबे समय से मेरी टू-डू सूची में है। आज वह दिन है जब मैं इसे पूरा करने जा रहा हूँ। यदि आप साइन अप करना चाहते हैं तो आप यहाँ कर सकते हैं।
मुझे वास्तव में लंबे-कॉपी न्यूज़लेटर पसंद नहीं हैं। जो मुझे पसंद हैं वे दिलचस्प कंटेंट के क्यूरेटेड डाइजेस्ट हैं। RubyWeekly दिमाग में आता है। Wistia का ब्लॉग डाइजेस्ट भी।
इन डाइजेस्ट को मैन्युअल रूप से एक साथ रखने में बहुत समय लगता है। लेकिन पूरी तरह से ऑटो करना बहुत अवैयक्तिक है। तो मुझे जो चाहिए वह एक सेमी-ऑटोमेटेड प्रक्रिया है। मुझे एक स्क्रिप्ट की आवश्यकता है जो हमारे नवीनतम ब्लॉग पोस्ट लाए और एक HTML ईमेल आउटपुट करे जिसे मैं पर्सनलाइज़ कर सकूं।
तो आइए इसे बनाएं! यह केवल एक खुश करने वाले उपयोगकर्ता - मुझे - के साथ एक मजेदार छोटा प्रोजेक्ट होगा!
गेम प्लान
हमारी स्क्रिप्ट को कुछ चीजें करने की आवश्यकता है:
Honeybadger ब्लॉग के लिए RSS फीड लाएं और पार्स करें
कैटेगरी द्वारा उपयुक्त आर्टिकल चुनें
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
मॉड्यूल हमारे लिए फीड भी लाता है। सेवा के बारे में बात करें!
कैटेगरी के साथ काम करना
मैं सब्सक्राइबर्स को उन लिंक्स को नहीं भेजना चाहता जिनमें उनकी रुचि नहीं है, इसलिए मैं आर्टिकल्स को कैटेगरी द्वारा फ़िल्टर करने जा रहा हूँ। जबकि Ruby के RSS लाइब्रेरी में `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 ट्रैकिंग पैरामीटर जोड़ें
टेम्पलेट में पोस्ट विवरण जोड़ें