मुझे कुछ ऐसा चाहिए
एक न्यूज़लेटर की स्थापना बहुत लंबे समय से मेरी टूडू सूची में रही है। आज वह दिन है जब मैं इसे पूरा करने जा रहा हूं। अगर आप साइन अप करना चाहते हैं तो आप यहां ऐसा कर सकते हैं।
मुझे वास्तव में लंबी-कॉपी वाले न्यूज़लेटर्स पसंद नहीं हैं। जो मुझे पसंद हैं वे दिलचस्प सामग्री के क्यूरेटेड डाइजेस्ट हैं। RubyWeekly दिमाग में आता है. तो क्या विस्टिया का ब्लॉग पचता है।
इन डाइजेस्ट को मैन्युअल रूप से एक साथ रखने में बहुत अधिक समय लगता है। लेकिन फुल-ऑटो जाना बहुत अवैयक्तिक है। तो मैं जो चाहता हूं वह अर्ध-स्वचालित प्रक्रिया है। मुझे एक स्क्रिप्ट चाहिए जो हमारे सबसे हाल के ब्लॉग पोस्ट लाएगी और एक HTML ईमेल आउटपुट करेगी जिसे मैं वैयक्तिकृत कर सकता हूं।
तो चलिए इसे बनाते हैं! यह एक मजेदार छोटा प्रोजेक्ट होगा जिसमें केवल एक उपयोगकर्ता को खुश करने के लिए - मुझे!
गेम प्लान
हमारी स्क्रिप्ट को कुछ चीज़ें करने की ज़रूरत है:
-
हनीबैगर ब्लॉग के लिए RSS फ़ीड प्राप्त करें और पार्स करें
-
श्रेणी के अनुसार उपयुक्त लेखों का चयन करें
-
ईआरबी टेम्पलेट के माध्यम से लेखों के संग्रह को प्रस्तुत करें
इसे कमांड लाइन से चलाया जाएगा और इसके परिणामों को STDOUT पर प्रिंट किया जाएगा।
रूबी में फ़ीड फ़ेच करना और पार्स करना
क्या आप जानते हैं कि रूबी का मानक पुस्तकालय RSS और ATOM फ़ीड के उत्पादन और उपभोग के लिए एक मॉड्यूल के साथ आता है? हमारे उपयोग के मामले में यह बहुत आसान नहीं हो सका। यहां बताया गया है कि यह कैसे काम करता है:
require 'rss'
feed = RSS::Parser.parse('https://www.honeybadger.io/blog/feed/')
feed.items.each do |item|
puts item.title
end
मॉड्यूल हमारे लिए फ़ीड भी लाता है। सेवा के बारे में बात करें!
श्रेणियों के साथ काम करना
मैं उन ग्राहकों के लिंक नहीं भेजना चाहता जिनमें उनकी रुचि नहीं है, इसलिए मैं श्रेणी के आधार पर लेखों को फ़िल्टर करने जा रहा हूं। जबकि रूबी की RSS लाइब्रेरी में categories
है विधि, यह एक्सएमएल नोड ऑब्जेक्ट्स की एक सरणी देता है। मुझे श्रेणी के नाम चाहिए, इसलिए मैं RSS आइटम्स को Article
. नामक डेकोरेटर क्लास में लपेटता हूं ।
अब मैं आसानी से केवल "कैसे करें" श्रेणी के लेखों का चयन कर सकता हूँ।
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") }
टेम्पलेट का प्रतिपादन
चूंकि यह बहुत अधिक मार्कअप के बिना एक ईमेल होने जा रहा है, मैं सिर्फ टेम्पलेटिंग के लिए ईआरबी का उपयोग करने जा रहा हूं। जैसा कि आप नीचे देख सकते हैं, मैंने टेम्प्लेट और रेंडरिंग कोड को DigestView नामक कक्षा में एक साथ रखा है। इतने छोटे, एकल-उद्देश्य वाले टेम्पलेट के लिए इसे एक अलग फ़ाइल में विभाजित करना अतिश्योक्तिपूर्ण लग रहा था।
अंतिम आउटपुट STDOUT को प्रिंट किया जाता है। यह मुझे आउटपुट को OSXs में पाइप करने देगा 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
आउटपुट इस तरह दिखता है:
हमारे ब्लॉग डाइजेस्ट जनरेटर का आउटपुट।
भविष्य का कार्य
इसके उत्पादन के लिए तैयार होने से पहले मुझे कुछ और करने की आवश्यकता होगी। लेकिन ये ज्यादातर हनीबैगर के लिए विशिष्ट अनुकूलन हैं, और जो अन्यथा बहुत उपयोगी नहीं होंगे। बाकी दिनों की मेरी स्ट्राइक लिस्ट ये है:
-
टेम्प्लेट को सुंदर बनाएं और हमारे ईमेल प्रदाता के साथ उसका परीक्षण करें
-
लिंक में Google Analytics ट्रैकिंग पैरामीटर जोड़ें
-
टेम्पलेट में पोस्ट विवरण जोड़ें