আমি এরকম কিছু চাই
একটি নিউজলেটার সেট আপ করা আমার করণীয় তালিকায় অনেক দিন ধরে রয়েছে। আজ আমি এটা ঘটতে যাচ্ছি দিন. আপনি যদি সাইন আপ করতে চান তাহলে আপনি এখানে তা করতে পারেন৷
৷আমি সত্যিই লং-কপি নিউজলেটার পছন্দ করি না। আমি যেগুলো পছন্দ করি সেগুলো হল আকর্ষণীয় বিষয়বস্তুর কিউরেটেড ডাইজেস্ট। রুবিসাপ্তাহিক মনে মনে আসে। তাই উইসটিয়ার ব্লগ হজম করে।
এই ডাইজেস্টগুলিকে ম্যানুয়ালি একসাথে রাখতে অনেক বেশি সময় লাগে। কিন্তু সম্পূর্ণ স্বয়ংক্রিয় যাওয়া খুব নৈর্ব্যক্তিক। তাই আমি যা চাই তা হল একটি আধা স্বয়ংক্রিয় প্রক্রিয়া। আমার এমন একটি স্ক্রিপ্ট দরকার যা আমাদের সাম্প্রতিকতম ব্লগ পোস্টগুলি আনবে এবং একটি HTML ইমেল আউটপুট করবে যা আমি ব্যক্তিগতকৃত করতে পারি৷
তাই এর নির্মাণ করা যাক! এটি শুধুমাত্র একজন ব্যবহারকারীকে খুশি করার জন্য একটি মজার ছোট প্রকল্প হবে - আমি!
দ্য গেম প্ল্যান
আমাদের স্ক্রিপ্ট কিছু জিনিস করতে হবে:
-
হানিব্যাজার ব্লগের জন্য RSS ফিড আনুন এবং পার্স করুন
-
বিভাগ অনুসারে উপযুক্ত নিবন্ধ নির্বাচন করুন
-
একটি ERB টেমপ্লেটের মাধ্যমে নিবন্ধের সংগ্রহ রেন্ডার করুন
এটি কমান্ড লাইন থেকে চালানো হবে এবং এর ফলাফল STDOUT এ প্রিন্ট করবে।
রুবিতে ফিড আনা এবং পার্স করা
আপনি কি জানেন যে রুবির স্ট্যান্ডার্ড লাইব্রেরি RSS এবং ATOM ফিড তৈরি এবং ব্যবহার করার জন্য একটি মডিউল সহ জাহাজে করে? আমাদের ব্যবহারের ক্ষেত্রে এটি অনেক সহজ হতে পারে না। এটি কীভাবে কাজ করে তা এখানে:
require 'rss'
feed = RSS::Parser.parse('https://www.honeybadger.io/blog/feed/')
feed.items.each do |item|
puts item.title
end
এমনকি মডিউল আমাদের জন্য ফিড নিয়ে আসে। পরিষেবা সম্পর্কে কথা বলুন!
বিভাগের সাথে কাজ করা
আমি গ্রাহকদের লিঙ্ক পাঠাতে চাই না তারা আগ্রহী নয়, তাই আমি বিভাগ অনুসারে নিবন্ধগুলি ফিল্টার করতে যাচ্ছি। রুবির আরএসএস লাইব্রেরিতে একটি categories
আছে পদ্ধতি, এটি XML নোড অবজেক্টের একটি অ্যারে প্রদান করে। আমার বিভাগের নাম দরকার, তাই আমি আরএসএস আইটেমগুলিকে 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") }
টেমপ্লেট রেন্ডার করা
যেহেতু এটি খুব বেশি মার্কআপ ছাড়াই একটি ইমেল হতে যাচ্ছে, আমি শুধু টেমপ্লেটিং এর জন্য ERB ব্যবহার করতে যাচ্ছি। আপনি নীচে দেখতে পাচ্ছেন, আমি টেমপ্লেট এবং রেন্ডারিং কোডটি ডাইজেস্টভিউ নামে একটি ক্লাসে একসাথে রেখেছি। এইরকম একটি ছোট, একক-উদ্দেশ্য টেমপ্লেটের জন্য এটিকে একটি পৃথক ফাইলে বিভক্ত করা খুব বেশি কাজ বলে মনে হচ্ছে।
চূড়ান্ত আউটপুট 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 ট্র্যাকিং প্যারামিটার যোগ করুন
-
টেমপ্লেটে পোস্টের বিবরণ যোগ করুন