ساخت و پیکربندی سرویس bayand برای لینوکس (1)
سلام .
در پست قبلی در مورد کارکرد این سرویس توضیح دادم و تو این پست بی مقدمه میریم سراغ کار .
ما میخوایم یه اسکریپت پایتونی بنویسیم . این اسکرپیت به طور کلی این روند رو اجرا میکنه :
۱ - یه فایل شامل لیست وبلاگ هایی که دنبال میکنیم رو میگیره ( تو هر خط آدرس یه وبلاگ نوشته میشه)
۲ - طی دوره های زمانی مشخص (مثلا ۲ دقیقه یک بار) محتویات صفحه https://blog.ir/changes رو دریافت میکنه .
۳ - به ازای هرکدوم از وبلاگ هایی که در مرحله ۱ دریافت کرده ، محتویات صفحه وبلاگ های بروزشده رو میگرده ببینه اون وبلاگ مورد نظر داخلش هست یا نه . به عبارتی اون شخصی که دنبالش میکنیم پست جدید گذاشته یا نه .
۴ - اگر پست جدیدی تشخیص داده شد ، داخل یه فایلی با مسیر دلخواه یه خط با فرمت زیر اضافه میکنه :
weblog.blog.ir : title of post
قبلا من یه کتابخونه پایتونی برای وبسایت بیان نوشته بودم که با استفاده از این کتابخونه میتونید اطلاعات وبلاگ های بیان رو دریافت و باهاش کار کنید . اسم این کتابخونه bayan هستش و داخل مخزن pypi هم وجود داره . یعنی با ابزار pip میتونید نصبش کنید.
این کتابخونه یه تابعی رو دراختیار ما میذاره به اسم getChanges . این تابع دقیقا کاری که ما در مرحله ۲ میخواستیم انجام بدیم رو برامون انجام میده . کار این تابع اینه که بره اطلاعات صفحه وبلاگ های بروزشده رو دریافت کنه و در غالب یک لیست پایتونی نتیجه رو به شما تحویل بده .
نتیجه فراخونی getChanges یک list هستش که هر عضو اون یک دیکشنری هست که اطلاعات یکی از پستای جدید داخلش نوشته شده .
تکه کد زیر و نتیجش کاملا کارکرد تابع getChanges رو روشن میکنه :
همونطور که در تصویر میبینید در دستور آخر برای مثال عضو اول لیست خروجی تابع getChanges رو نشون دادیم . یه دیکشنریه که دو عضو داره . همونطور که میدونید دیکشنری ها اعضای جفتی key/value میتونن داشته باشن توی پایتون . اینجا هم همینطوره . دیکشنری ما یه کلید به نام TITLE داره که عنوان پست جدید داخلشه و یه عضو دیگه به نام LINK که لینک پست جدیده .
قبل از بررسی اسکریپت اصلی ، یه فایلی به مسیر زیر درست میکنیم که لیست وبلاگ هایی که دنبالشون میکنیم رو داخلش مینویسیم :
/etc/bayand/follow_list.txt
از اونجایی که در لینوکس ها معمولا فایل های پیکربندی سرویس ها در مسیر etc/ ذخیره میشه بنابراین ماهم اینجا همین دایرکتوری رو برای ذخیره فایلای سرویسمون استفاده میکنیم .
همچنین کتابخونه ی bayan رو هم میتونیم با دستور pip نصبش کنیم :
pip3 install bayan
مرحله ی بعد نوشتن اسکریپت اصلی سرویس هستش :
#!/usr/bin/python3
from bayan import getChanges from os.path import exists import sys from time import sleep
if not exists("/etc/bayand/follow_list.txt"): print ("[-] I couldn't open /etc/bayand/follow_list.txt :( exiting ...") sys.exit(-1)
follow_list = open("/etc/bayand/follow_list.txt").readlines()
for i in range (len(follow_list)): follow_list[i] = follow_list[i].strip("\n")
outputfile = open("/tmp/newPosts" , 'w') # reporting new posts to this file
DELAY = 60 # in seconds
checked = [] # list of checked new posts
while True : try: changes = getChanges() except: print ("[-] Error in getChanges()") for c in changes : if c in checked : continue # ignore if we have already checked this post link = c["LINK"]
# Extracting weblog address in form of <name.blog.ir> from post link : start_index = link.find("://") + 3 address = link[start_index:] address = address[:address.find("/")] # #############
if address in follow_list : # writing the report to the output file : print ("NEW POST BY {} : {}".format(address , c["TITLE"])) outputfile.write("⭐ {} : {}\n".format(address , c["TITLE"])) outputfile.flush() checked.append(c) # adding this post to checked list
sleep(DELAY)
داخل سورسمون ابتدا کتابخونه های مورد نیاز رو import کردیم . سپس چک کردیم فایل follow_list.txt وجود داشته باشه . اگر نبود ارور بده و خارج شه . اگر فایل بود بازش کنه و محتویاتشو خط به خط بخونه و داخل لیست follow_list ذخیره کنه . بعد داخل یه حلقه for اومدیم کاراکتر n\ آخر هرکدوم از اعضای follow_list رو حذف کردیم .
در مرحله بعد فایل خروجی رو باز کردیم . فایلی که قراره پستای جدید رو داخلش گزارش بدیم که برای من در مسیر tmp/ فایلی به نام newPosts هستش . یه متغییر داریم به اسم DELAY که تاخیر بین هر دور چک کردن برای پست جدید هستش که من گذاشتمش روی ۱ دقیقه . همچنین یه لیستی داریم به اسم checked . لیستی از پستای جدیدی که داخل فایل خروجی نوشتیم رو داخل اینم مینویسیم که از نوشتن پستای جدید تکراری توی فایل خروجی جلوگیری کنیم . فرض کنید یه وبلاگی که دنبالش کردیم یه پست جدید میذاره . این پستش ممکنه چند ساعت توی صفحه وبلاگ های بروز شده باشه بنابراین اسکریپت ما ۱ دقیقه یک بار که صفحه وبلاگ های بروزشده رو چک میکنه به اون پسته بر میخوره و هی اضافش میکنه به خروجی و تکراری میشه .
نهایتا بعد کدمون میفته توی حلقه while که دائم هر ۱ دقیقه یک بار چک میکنه پستای جدید رو . ابتدا با استفاده از تابع getChanges لیست وبلاگ های بروز شده رو گرفتیم . بعد به ازای هر کدوم از این بروزرسانی ها اومدیم از طریق لینک اون پست اسم وبلاگ رو در فرم weblog.blog.ir استخراج کردیم و چک کردیم آیا این اسم توی لیست دنبال شده ها هست یا نه . اگر بود اون پست جدید رو به فایل خروجی و لیست checked اضافه میکنیم . دقت کنید هر بار قبل از اینکه میخواستیم پست جدیدی رو بررسی کنیم چک کردیم اون پسته توی لیست checked نباشه و تکراری نباشه اگر بود ولش میکنیم میریم پست بعدی .
میتونیم این اسکریپت رو دستی خودمون اجرا کنیم و تا زمانی که در حال اجراست گزارش دهی میکنه برامون . ولی میخوایم به صورت یک سرویس توی لینوکسمون پیکربندیش کنیم که هر بار که سیستممون روشن میشه خودش خودکار اجرا بشه و کارشو انجام بده همیشه .
تو این پست فقط اسکریپتمون رو نوشتیم . در پست بعدی در مورد مدیریت سرویس ها و systemd در لینوکس صحبت میکنیم و اینکه چجوری این اسکریپتمون رو به صورت یک سرویس پیکربندیش کنیم .
حاجی احسنت داری :))