English | فارسی
موارد لازم requirements.txt
:
- python-telegram-bot
- python-dotenv
- peewee
- نیازمندیها را نصب کنید:
pip install -r requirements.txt
- یک فایل
.env
(در کنارmain.py
) بسازید که محتوی آن به شکل زیر باشد:
TOKEN="..." WEBHOOK="..."
TOKEN
را برابر با توکن ربات خود قرار دهید. میتوانید توکن را از @botfather
دریافت کنید.
اگر میخواهید از وبهوک استفاده کنید، مقدار WEBHOOK
را برابر با آدرس مورد نظر قرار دهید. وگرنه، خالی بذارید (WEBHOOK=""
)
- و بلاخره...
python3 main.py
tmux
برای اجرای ربات استفاده کنید؛ مثلا هنگام استفاده از سرور.
sqlite3
برای ذخیره دادههای پیستها، چتها و کاربران استفاده میکند. اگر میخواهید از مواردی مانند MySQL
یا PostgreSQL
استفاده کنید، باید در src/model/__init__.py
. تغییراتی ایجاد کنید. مستندات peewee را ببینید.
با اینکه بخشهای مختلفی در اینجا وجود دارد، با این حال، شما بیشتر روی دو بخش باید تمرکز کنید:
-
src/handler
این پوشه، Handlerهای لازم را داراست. هر Hanlder یک پوشه ویژه خود به شکل
src/handler/<NAME>
داراست. Handler مورد نظر درsrc/handler/<NAME>/__init__.py
تعریف خواهد شد. در این فایل، شما باید تابعی به شکلcreator(model)
تعریف کنید. پارامترmodel
، در واقع ایمپورت شدهsrc/model
میباشد. این تابع، با دریافت این پارامتر، دقیقا یک شی Handler برمیگرداند. شما میتوانید هر تعداد پوشه حاوی Handlerهای مختلف بسازید.برای نمونه، فرض میکنیم که یک Handler برای دریافت
/start
میخواهید بنویسید. در این صورت، باید یک پوشه و یک فایل__init__.py
درون آن بسازید؛ مانندsrc/handler/my_start_handler/__init__.py
بسازید، سپس محتوی آن، برای مثال، میتواند به شکل زیر باشد
from telegram.ext import CommandHandler, CallbackContext from telegram import Update def your_function(update: Update, context: CallbackContext): update.message.reply_text("hello!") def creator(model): return CommandHandler("start", your_function)
src/model
مانند HELLO_TEXT
استفاده کنید. پیشنهاد میکنیم که یک تابع برای پاس دادن مدل استفاده کنید. این تابع از قبل درون src/handler/functions.py
نوشته شده است. پس، میتوانید به این شکل از آن استفاده کنید:
from telegram.ext import CommandHandler, CallbackContext from telegram import Update from ..function import pass_model_to def your_function(update: Update, context: CallbackContext, model): update.message.reply_text(model.HELLO_TEXT) def creator(model): return CommandHandler("start", pass_model_to(your_function, model))
src/handler/functions.py
بگذارید؛ سپس import کنید.
creator
آن را در src/handler/__init__.py
import کنید و به تاپل CREATORS
اضافه کنید. بعنوان مثال، اگر میخواهید که Handler مورد بحث، یعنی my_start_handler
را اضافه کنید؛ باید این خط را به src/handler/__init__.py
اضافه کنید:
from my_start_handler import creator as my_start_handler_creator
همانطور که میبینید، وقتی که Handlerای به نام <NAME>
را میخواهیم اضافه کنیم، بهتر است creator
آن، به شکل <NAME>_creator
استفاده شود (from <NAME> import creator as <NAME>_creator
). سپس، آنرا به تاپل CREATORS
اضافه میکنیم.
برای نمونه، سه Handler زیر را تصور کنید:
handler1
(src/handler/handler1
)handler2
(src/handler/handler2
)handler3
(src/handler/handler3
)
حال، در این مثال، اگر بخواهیم همه را بکار ببریم، باید src/handler/__init__.py
را به شکل زیر بنویسیم:
from handler1 import creator as handler1_creator from handler2 import creator as handler2_creator from handler3 import creator as handler3_creator # from your_new_handler import creaotr as your_new_hanlder_creator CREATORS = ( handler1_creator, handler2_creator, handler3_creator, # your_new_hanlder_creator, ) # don't change it, don't remove it, don't see it, and don't think about it at all! def get_handlers(model): for creator in CREATORES: yield creator(model)
dispatcher
اضافه نخواهد شد. اگر دیدید که Handler شما کار نمیکند (با فرض اطمینان از نحوه کارکرد Handler خود و واکنشِ بدون ایرادِ ربات به سایر Handlerها)، احتمالا بخاطر این است که آن را اضافه نکردید!
src/model
این بخش، هر دادهای در رابطه با زبانها (فارسی، انگلیسی، ...)، database و ... را در بر میگیرد. در حال حاضر، همین دو مورد گفته شده در آن قرار دارد. این بخش، import شده و به creatorهای handlerها داده میشود (پارامتر model
در creator(model)
، یادته دیگه؟!). برای مثال، اگر EXAMPLE = 123
را در src/model/__init__.py
تعریف کنید؛ میتوانید از طریق پارامتر model
، به شکل model.EXAMPLE
از آن استفاده کنید.