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 از آن استفاده کنید.