ساخت و پیکربندی سرویس 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 در لینوکس صحبت میکنیم و اینکه چجوری این اسکریپتمون رو به صورت یک سرویس پیکربندیش کنیم . 

موافقین ۵ مخالفین ۰

حاجی احسنت داری :))

لطف داری :)
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">