আমি এমন কিছু চাই
নিউজলেটার সেটআপ করা আমার টু-ডু লিস্টে অনেক দিন থেকে ছিল। আজ আমি এটি করব। আপনি যদি সাইন আপ করতে চান তবে এখানে করতে পারেন।
আমি লং-কপি নিউজলেটার পছন্দ করি না। আমার পছন্দেরগুলো হলো কিউরেটেড ডাইজেস্ট - যেন RubyWeekly বা Wistia-এর ব্লগ ডাইজেস্ট।
এই ডাইজেস্টগুলো ম্যানুয়ালি তৈরি করতে অনেক সময় লাগে। কিন্তু ফুল অটোমেটেড করলে তা বłę নির্দিষ্ট হয়ে যায়। তাই আমি চাই একটি সেমি-অটোমেটেড প্রসেস। আমাকে এমন একটি স্ক্রিপ্ট দরকার যা আমাদের সাম্প্রতিক ব্লগ পোস্টগুলো ফেচ করে এবং একটি HTML ইমেল আউটপুট দেয় যা আমি পারসোনালাইজ করতে পারব।
তো চলুন বানাই! এটি একটি ছোট মজার প্রজেক্ট যার শুধু একটি ইউজার থাকবে - আমি!
গেম প্ল্যান
আমাদের স্ক্রিপ্টকে কিছু কাজ করতে হবে:
Honeybadger ব্লগের 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 মডিউলটি ফিডটি ফেচ করতেও পারে। এটাকেই বলা যায় সার্ভিস!
ক্যাটাগরি সহ কাজ করা
আমি সাবস্ক্রাইবারদের অপ্রাসঙ্গিক লিংক পাঠাতে চাই না, তাই ক্যাটাগরি অনুযায়ী আর্টিকেল ফিল্টার করব। রুবির 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-এ প্রিন্ট হয়। এর মাধ্যমে আমি আউটপুট macOS-এর `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 ট্র্যাকিং প্যারামিটার যোগ করুন
টেমপ্লেটে পোস্ট ডেসক্রিপশন যোগ করুন