discord icon
سرور دیسکورد گاردایران

پست های پیشنهاد شده

با سلام

شما برای اینکه رباتتون همیشه در حال اجرا باشه باید اونو تو یه سیستم همیشه روشن قرار بدید وگرنه ربات که خود به خود اجرا نمیمونه . تو این آموزش ما میخوایم ربات هایی که با کتابخونه pyTelegramBotAPI نوشته شدن (telebot) رو روی سرور اجرا کنیم و همیشه روشن بمونه . البته توجه داشته باشید کد های مربوط به وب سرویس cherrypy نیز در کتابخونه های دیگه ای مثل ptb یا telepot یا ... کار خواهد کرد. (ما اینجا فرض کردیم که شما اطلاع دارید که متد set_webhook چی هست و .. - اگر از کتابخونه های دیگه استفاده میکنید این آموزش هم برای اونا صدق میکنه)

ربات هارو روی سرور مجازی VPS راه اندازی کنید . و بهتره از لینوکس استفاده کنید . پیشنهاد من اوبونتو هست.

مطمین شوید تمام ماژول های موجود در بات رو نصب کنید به وسیله ابزار pip :

این ابزار به راحتی با استفاده از دستور زیر در سرور های لینوکسی قابل نصب است : دومی برای پایتون نسخه دو هست. که نباید هر دو دستور وارد شود . بسته به نسخه پایتون یکی از دستورات رو وارد کنید.

sudo apt-get update && apt-get install python3-pip (python 3.x.x)
sudo apt-get update && apt-get install python-pip (python 2.x.x)

ترمینال را باز کنید یا CMD و از دستور زیر برای نصب ماژول ها استفاده کنید:

pip install <package-name>

میدونید که باید بعد از کلمه Install‌نام کتابخونرو بنویسید توضیحات اضافی نمیدیم چون اینارو بلدید.

البته چیزایی که الان میخوایم بگیم تو خود سایت هم موجود هست.

وب هوک webhook : وب سرویس هایی که روی سرور راه اندازی میشن و در مواقعی که به اونها درخواست ارسال بشه پاسخ میدن و به نوعی ربات میخوابه و زمانی که ما بهش نیاز داشتیم ازش استفاده میکنیم . باعث میشه کمتر از پهنای باد استفاده بشه و ارور های مربوط به time out نیز رفع بشه همچنین رم هم کمتر مصرف بشه. یکی از بهترین وب سرویس های پایتون cherrypy هست که خیلی قویه و کار باهاش بسیار راحت.

دو روش برای اجرای ربات وجود داره:

1) بدون استفاده از وب هوک ها

polling()
infinity_polling()

دومین متد به تازگی به کتابخونه ارسال شده و تو این متد ربات تو یه حلقه با شرط همیشه درست قرار میگیره تا عمل polling همیشه انجام بشه اما ایرادات زیادی داره : استفاده خیلی زیاد از پهنای باند -دریافت ارور های time out به دلیل قطعی ناگهانی - استفاده بیش از حد از رم سرور. این متد ها برای تست و بررسی ربات معمولا تو سیستم های خودمون استفاده میشه تا قبل از اینکه ربات رو روی سرور بذاریم اون رو امتحان کرده باشیم تا ایرادی نداشته باشه. پس به شدت توصیه میشه حتما از وب هوک استفاده کنید.

2)اسفاده از وب هوک ها :

اول باید دو فایل ایجاد کنید برای تاییده درخواست های ارسالی به سرور و تنظیم ssl :

دستورات زیر رو به ترتیب وارد کنید:

openssl genrsa -out webhook_pkey.pem 2048
openssl req -new -x509 -days 3650 -key webhook_pkey.pem -out webhook_cert.pem

و بعد اطلاعات مورد نظر رو وارد کنید کد کشور و نام سازمان و ... با گذاشتن یک نقطه میتونید سوال رو رد کنید.

نکته مهم : تو دومین دستور اگر عبارت زیر را دیدید باید آی پی سرور رو قرار بدید:

Common Name (e.g. server FQDN or YOUR name): آی پی سرور

حالا باید در سرور یه پورت باز کنید (حتما باید یکی از اینها باشد 443, 80, 88  8443 😞

sudo iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 8443 -j ACCEPT

من 8443 رو انتخاب کردم.

نکته : به جای کلمه guardiran توکن ربات خود را به صورت کامل که از Botfather دریافت کردید بنویسید. ضمنا تمام کد هارا به همین شکل بنویسید .

API_TOKEN = 'guardiran'

WEBHOOK_HOST = '<ip/host where the bot is running>'
WEBHOOK_PORT = 8443
WEBHOOK_LISTEN = '<ip/host where the bot is running>'

WEBHOOK_SSL_CERT = './webhook_cert.pem' مسیر فایل هایی که درست کردید
WEBHOOK_SSL_PRIV = './webhook_pkey.pem' مسیر فایل هایی که درست کردید
WEBHOOK_URL_BASE = "https://%s:%s" % (WEBHOOK_HOST, WEBHOOK_PORT)
WEBHOOK_URL_PATH = "/%s/" % (API_TOKEN)
logger = telebot.logger
telebot.logger.setLevel(logging.INFO)
class WebhookServer(object):
    @cherrypy.expose
    def index(self):
        if 'content-length' in cherrypy.request.headers and \
           'content-type' in cherrypy.request.headers and \
           cherrypy.request.headers['content-type'] == 'application/json':
            length = int(cherrypy.request.headers['content-length'])
            json_string = cherrypy.request.body.read(length).decode("utf-8")
            update = telebot.types.Update.de_json(json_string)
            bot.process_new_updates([update])
            return ''
        else:
			raise cherrypy.HTTPError(403)
            
تو اینجا کد های ربات رو قرار بدید که نوشتید

bot.remove_webhook()
time.sleep(0.1)
bot.set_webhook(url=WEBHOOK_URL_BASE+WEBHOOK_URL_PATH,
                certificate=open(WEBHOOK_SSL_CERT, 'r'))

access_log = cherrypy.log.access_log
for handler in tuple(access_log.handlers):
    access_log.removeHandler(handler)

cherrypy.config.update({
    'server.socket_host': WEBHOOK_LISTEN,
    'server.socket_port': WEBHOOK_PORT,
    'server.ssl_module': 'builtin',
    'server.ssl_certificate': WEBHOOK_SSL_CERT,
    'server.ssl_private_key': WEBHOOK_SSL_PRIV
})

cherrypy.quickstart(WebhookServer(), WEBHOOK_URL_PATH, {'/': {}})

همه چی مشخصه فقط بدونید به جای WEBHOOK_HOST و WEBHOOK_LISTEN حتما آی پی سرور مجازیتون رو بدید و مسیر فایلایی هم که درست کردیم رو حتما درست بدید.

حالا برای اجرای ربات یه ترمینال باز کنید دستور زیر رو تایپ کنید:

python3 script.py
python script.py

اگه با نسخه 3 رباتو نوشتید اولین دستور در غیر اینصورت دومین دستور رو وارد کنید.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای ارسال دیدگاه یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید دیدگاهی ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در سایت ما ثبت نام کنید. عضویت خیلی ساده است !

ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید

ورود به حساب کاربری