Forwarded from ابر ویراک
زیرساختی مطمئن برای کسب و کارهای آنلاین
📞 همین حالا با ما تماس بگیرید و این فرصت فوقالعاده رو از دست ندید!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
الگوی Strategy در مدیریت Command های ربات تلگرام 🧩
یکی از تمیزترین راهها برای مدیریت منطق پیچیده در ربات تلگرام، استفاده از Strategy Pattern است. مخصوصاً وقتی ربات شما چندین دستور مثل
با الگوی Strategy میتوانیم منطق هر Command را در یک کلاس جدا نگه داریم و یک Command Dispatcher تمیز داشته باشیم.
ایدهی اصلی Strategy:
- برای هر رفتار (مثلاً هر Command)، یک Strategy جدا تعریف میشود.
- یک کانتکست (اینجا: Message Handler) فقط تصمیم میگیرد کدام Strategy را صدا بزند.
- اضافه کردن Command جدید، بدون تغییر کدهای قبلی انجام میشود (Open/Closed Principle ✅).
نمونه با Python و کتابخانه python-telegram-bot:
در Handler اصلی فقط کافیه Dispatcher را صدا بزنید و بقیهی منطق از هم جدا و تمیز میماند ✨
مزایا برای ربات تلگرام:
- افزودن Command جدید فقط با ساختن یک کلاس جدید (بدون دستزدن به بقیه کدها).
- تستنویسی راحتتر؛ هر Strategy مستقل تست میشود.
- جداسازی واضح بین لایهی Routing و لایهی Business Logic.
نکتههای عملی 🛠
- نام کلاسها را بر اساس Command شفاف انتخاب کنید (مثل
- برای Commandهای پیچیده، آنها را به چند Service کوچکتر بشکنید تا Strategy هم بیش از حد چاق نشود.
- اگر تعداد Commandها زیاد شد، میتوانید Strategyها را در ماژولهای جدا (folders) سازماندهی کنید.
برای مطالعهی بیشتر دربارهی Strategy Pattern:
refactoring.guru/design-patterns/strategy
این الگو مخصوصاً در رباتهایی که بهمرور بزرگ میشوند کمک میکند ساختار کد تمیز، قابلگسترش و قابلنگهداری باقی بماند. از قدمهای کوچک شروع کنید و کمکم Commandهای فعلی را به Strategy تبدیل کنید 🚀
🔖 #TelegramBot #ربات #تلگرام #Strategy_Pattern #Clean_Code #Telegram_Bot #Python #Design_Patterns
👤 Developix
💎 Channel: @DevelopixRobot
یکی از تمیزترین راهها برای مدیریت منطق پیچیده در ربات تلگرام، استفاده از Strategy Pattern است. مخصوصاً وقتی ربات شما چندین دستور مثل
/start، /help، /settings و… دارد، اگر همهچیز را در یک فایل بزرگ بنویسید، بهسرعت تبدیل به Spaghetti Code میشود 🤯با الگوی Strategy میتوانیم منطق هر Command را در یک کلاس جدا نگه داریم و یک Command Dispatcher تمیز داشته باشیم.
ایدهی اصلی Strategy:
- برای هر رفتار (مثلاً هر Command)، یک Strategy جدا تعریف میشود.
- یک کانتکست (اینجا: Message Handler) فقط تصمیم میگیرد کدام Strategy را صدا بزند.
- اضافه کردن Command جدید، بدون تغییر کدهای قبلی انجام میشود (Open/Closed Principle ✅).
نمونه با Python و کتابخانه python-telegram-bot:
from abc import ABC, abstractmethod
# Strategy interface
class CommandStrategy(ABC):
@abstractmethod
def handle(self, update, context):
pass
# Concrete strategies
class StartCommand(CommandStrategy):
def handle(self, update, context):
update.message.reply_text("سلام 👋 خوش اومدی!")
class HelpCommand(CommandStrategy):
def handle(self, update, context):
update.message.reply_text("/start - شروع
/help - راهنما")
class UnknownCommand(CommandStrategy):
def handle(self, update, context):
update.message.reply_text("این دستور رو نمیشناسم 😅")
# Context / Dispatcher
class CommandDispatcher:
def __init__(self):
self._strategies = {
"start": StartCommand(),
"help": HelpCommand(),
}
self._fallback = UnknownCommand()
def dispatch(self, update, context):
cmd = update.message.text.split()[0].replace("/", "")
strategy = self._strategies.get(cmd, self._fallback)
strategy.handle(update, context)
در Handler اصلی فقط کافیه Dispatcher را صدا بزنید و بقیهی منطق از هم جدا و تمیز میماند ✨
مزایا برای ربات تلگرام:
- افزودن Command جدید فقط با ساختن یک کلاس جدید (بدون دستزدن به بقیه کدها).
- تستنویسی راحتتر؛ هر Strategy مستقل تست میشود.
- جداسازی واضح بین لایهی Routing و لایهی Business Logic.
نکتههای عملی 🛠
- نام کلاسها را بر اساس Command شفاف انتخاب کنید (مثل
BanUserCommand، BroadcastCommand).- برای Commandهای پیچیده، آنها را به چند Service کوچکتر بشکنید تا Strategy هم بیش از حد چاق نشود.
- اگر تعداد Commandها زیاد شد، میتوانید Strategyها را در ماژولهای جدا (folders) سازماندهی کنید.
برای مطالعهی بیشتر دربارهی Strategy Pattern:
refactoring.guru/design-patterns/strategy
این الگو مخصوصاً در رباتهایی که بهمرور بزرگ میشوند کمک میکند ساختار کد تمیز، قابلگسترش و قابلنگهداری باقی بماند. از قدمهای کوچک شروع کنید و کمکم Commandهای فعلی را به Strategy تبدیل کنید 🚀
🔖 #TelegramBot #ربات #تلگرام #Strategy_Pattern #Clean_Code #Telegram_Bot #Python #Design_Patterns
👤 Developix
💎 Channel: @DevelopixRobot
❤1
اگر با Python ربات تلگرام میسازی، python-telegram-bot از راحتترین و پرکاربردترین کتابخونههاست 🤖
این لایبرری تقریباً کل Telegram Bot API رو پوشش میده و هم برای رباتهای ساده (reply معمولی) و هم رباتهای پیچیده (callback query، inline keyboard، webhook و …) جواب میده.
چیزهایی که جذابش میکنه:
• ساخت handler برای هر نوع آپدیت (message, command, callback)
• پشتیبانی خوب از async
• مدیریت راحت inline keyboard و custom keyboard
• مستندات قوی و community فعال
نصب و یک نمونه خیلی مینیمال با polling:
برای پروژههای جدیتر میشه از webhook و ساختار چندماژوله استفاده کرد تا کد تمیز و قابل نگهداری بمونه.
مستندات و سورس:
docs.python-telegram-bot.org
github.com/python-telegram-bot/python-telegram-bot
امتحانش کن روی یک ربات کوچک و بعد کمکم ساختار رو حرفهایتر کن 🚀
🔖 #TelegramBot #ربات #تلگرام #Telegram_Bot #python_telegram_bot #Python #ربات_تلگرام #Webhook #Inline_Keyboard
👤 Developix
💎 Channel: @DevelopixRobot
این لایبرری تقریباً کل Telegram Bot API رو پوشش میده و هم برای رباتهای ساده (reply معمولی) و هم رباتهای پیچیده (callback query، inline keyboard، webhook و …) جواب میده.
چیزهایی که جذابش میکنه:
• ساخت handler برای هر نوع آپدیت (message, command, callback)
• پشتیبانی خوب از async
• مدیریت راحت inline keyboard و custom keyboard
• مستندات قوی و community فعال
نصب و یک نمونه خیلی مینیمال با polling:
pip install python-telegram-bot --upgrade
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes
TOKEN = "YOUR_BOT_TOKEN"
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text("سلام! 👋 ربات فعاله.")
app = ApplicationBuilder().token(TOKEN).build()
app.add_handler(CommandHandler("start", start))
app.run_polling()
برای پروژههای جدیتر میشه از webhook و ساختار چندماژوله استفاده کرد تا کد تمیز و قابل نگهداری بمونه.
مستندات و سورس:
docs.python-telegram-bot.org
github.com/python-telegram-bot/python-telegram-bot
امتحانش کن روی یک ربات کوچک و بعد کمکم ساختار رو حرفهایتر کن 🚀
🔖 #TelegramBot #ربات #تلگرام #Telegram_Bot #python_telegram_bot #Python #ربات_تلگرام #Webhook #Inline_Keyboard
👤 Developix
💎 Channel: @DevelopixRobot
👍4
🚀 ساخت ربات تلگرام با دکمههای شیشهای (Inline Keyboard) با Python
یه قابلیت خیلی کاربردی تو Telegram Bot اینه که کاربر لازم نیست چیزی تایپ کنه؛ فقط با زدن دکمه کار انجام میشه. دقیقاً همون inline keyboardهایی که زیر پیام ظاهر میشن ✅
توی این پست، با هم یه ربات ساده میسازیم که:
• با دستور
• زیرش دو تا دکمه شیشهای نشون میده
• روی هر دکمه کلیک بشه، جواب جداگانه برمیگردونه
این مثال بر اساس کتابخونهی رسمی و محبوب python-telegram-bot نسخه ۲۰ به بالاست و میتونی داک رسمیش رو اینجا ببینی:
docs.python-telegram-bot.org
اول کتابخونه رو نصب کن:
تو کد پایین فقط کافیه
چند نکته ریز ولی مهم 👇
• حتماً تو نسخههای جدید باید از
•
• به جای
این ساختار پایه بعداً راحت به Database، سیستم تیکت، فرم ثبت سفارش یا پنل ادمین در خود تلگرام وصل میشه 🙌
امتحانش کن، یه ربات بساز و به یه دوست برنامهنویس هم بفرست تا با هم توسعهش بدین 🤝
🔖 #TelegramBot #ربات #تلگرام #Telegram_Bot #Python #Inline_Keyboard #Long_Polling #python_telegram_bot
👤 Developix
💎 Channel: @DevelopixRobot
یه قابلیت خیلی کاربردی تو Telegram Bot اینه که کاربر لازم نیست چیزی تایپ کنه؛ فقط با زدن دکمه کار انجام میشه. دقیقاً همون inline keyboardهایی که زیر پیام ظاهر میشن ✅
توی این پست، با هم یه ربات ساده میسازیم که:
• با دستور
/start یه پیام میفرسته• زیرش دو تا دکمه شیشهای نشون میده
• روی هر دکمه کلیک بشه، جواب جداگانه برمیگردونه
این مثال بر اساس کتابخونهی رسمی و محبوب python-telegram-bot نسخه ۲۰ به بالاست و میتونی داک رسمیش رو اینجا ببینی:
docs.python-telegram-bot.org
اول کتابخونه رو نصب کن:
pip install python-telegram-bot --upgrade
تو کد پایین فقط کافیه
BOT_TOKEN خودت رو از @BotFather بذاری و اجرا کنی. ربات روی long polling کار میکنه و نیاز به سرور https یا webhook نداره، برای شروع فوقالعادهست 👇from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import (
ApplicationBuilder,
CommandHandler,
CallbackQueryHandler,
ContextTypes,
)
BOT_TOKEN = "YOUR_BOT_TOKEN_HERE"
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
keyboard = [
[
InlineKeyboardButton("📊 وضعیت سرور", callback_data="status"),
InlineKeyboardButton("ℹ️ درباره ربات", callback_data="about"),
]
]
reply_markup = InlineKeyboardMarkup(keyboard)
await update.message.reply_text(
"سلام 👋\nیکی از گزینههای زیر رو انتخاب کن:",
reply_markup=reply_markup,
)
async def button_handler(update: Update, context: ContextTypes.DEFAULT_TYPE):
query = update.callback_query
await query.answer()
if query.data == "status":
text = "سرور الان آنلاینه ✅\nCPU: 23% | RAM: 58%"
elif query.data == "about":
text = "این یه ربات نمونه با inline keyboard هست 🤖"
else:
text = "گزینه نامعتبر" # حالت پیشفرض
await query.edit_message_text(text)
if __name__ == "__main__":
app = ApplicationBuilder().token(BOT_TOKEN).build()
app.add_handler(CommandHandler("start", start))
app.add_handler(CallbackQueryHandler(button_handler))
app.run_polling()
چند نکته ریز ولی مهم 👇
• حتماً تو نسخههای جدید باید از
async/await استفاده کنی، مثل کد بالا.•
callback_data بهتره کوتاه، بدون space و قابل پارس کردن باشه (مثلاً user:123 یا cmd:stats).• به جای
reply_text میتونی بعداً از edit_message_text تو خود دستور /start هم استفاده کنی تا ربات شبیه منوهای چند مرحلهای بشه.این ساختار پایه بعداً راحت به Database، سیستم تیکت، فرم ثبت سفارش یا پنل ادمین در خود تلگرام وصل میشه 🙌
امتحانش کن، یه ربات بساز و به یه دوست برنامهنویس هم بفرست تا با هم توسعهش بدین 🤝
🔖 #TelegramBot #ربات #تلگرام #Telegram_Bot #Python #Inline_Keyboard #Long_Polling #python_telegram_bot
👤 Developix
💎 Channel: @DevelopixRobot
👍3
🎯 مدیریت آپدیتها با webhook بهجای long polling
وقتی ربات ترافیک بیشتری میگیرد، long polling میتواند هم کند شود هم مصرف منابع سرور را بالا ببرد. استفاده از webhook باعث میشود Telegram خودش آپدیتها را به آدرس سرور بفرستد؛ یعنی latency کمتر، مصرف CPU پایینتر و کنترل بهتر روی ترافیک 🚀
ایده ساده است: یک endpoint مثل
نمونه مینیمال با python-telegram-bot (نسخه 20+):
نکتههای مهم 🧩
• حتماً از HTTPS واقعی استفاده شود؛ Telegram روی http ساده به webhook وصل نمیشود.
• سایز پاسخها را کوچک نگه دار تا timeout نخوری.
• روی endpoint حتماً rate limit و لاگ مناسب داشته باش تا در برابر flood و خطاها مقاومت بهتری داشته باشی.
با همین تغییر ساده، ربات روی سرورهای سبک هم زیر فشار ترافیک پایدارتر میماند و هم پاسخها سریعتر به کاربر میرسد ⚡
مرجع رسمی Bot API:
https://core.telegram.org/bots/api#setwebhook
🔖 #TelegramBot #ربات #تلگرام #Telegram_Bot #webhook #python_telegram_bot #performance #api
👤 Developix
💎 Channel: @DevelopixRobot
وقتی ربات ترافیک بیشتری میگیرد، long polling میتواند هم کند شود هم مصرف منابع سرور را بالا ببرد. استفاده از webhook باعث میشود Telegram خودش آپدیتها را به آدرس سرور بفرستد؛ یعنی latency کمتر، مصرف CPU پایینتر و کنترل بهتر روی ترافیک 🚀
ایده ساده است: یک endpoint مثل
/webhook روی سرور (مثلاً با Flask) میسازی، بعد با setWebhook به Telegram میگویی هر آپدیت جدید را POST کند به این URL.نمونه مینیمال با python-telegram-bot (نسخه 20+):
from flask import Flask, request
from telegram import Update
from telegram.ext import (
Application,
CommandHandler,
)
TOKEN = "YOUR_BOT_TOKEN"
app = Flask(__name__)
application = Application.builder().token(TOKEN).build()
async def start(update: Update, context):
await update.message.reply_text("سلام 👋")
application.add_handler(CommandHandler("start", start))
@app.post("/webhook")
def webhook():
update = Update.de_json(request.get_json(force=True), application.bot)
application.update_queue.put_nowait(update)
return "ok"
if __name__ == "__main__":
# فقط یک بار اجرا کن (یا با curl) برای ست کردن webhook
import requests
url = "https://your-domain.com/webhook"
requests.get(
f"https://api.telegram.org/bot{TOKEN}/setWebhook",
params={"url": url},
)
app.run(port=8443)
نکتههای مهم 🧩
• حتماً از HTTPS واقعی استفاده شود؛ Telegram روی http ساده به webhook وصل نمیشود.
• سایز پاسخها را کوچک نگه دار تا timeout نخوری.
• روی endpoint حتماً rate limit و لاگ مناسب داشته باش تا در برابر flood و خطاها مقاومت بهتری داشته باشی.
با همین تغییر ساده، ربات روی سرورهای سبک هم زیر فشار ترافیک پایدارتر میماند و هم پاسخها سریعتر به کاربر میرسد ⚡
مرجع رسمی Bot API:
https://core.telegram.org/bots/api#setwebhook
🔖 #TelegramBot #ربات #تلگرام #Telegram_Bot #webhook #python_telegram_bot #performance #api
👤 Developix
💎 Channel: @DevelopixRobot
👍1
Forwarded from کانال رسمی تک نت | Taknet
سرور اختصاصی تکنت؛ تحویل فوری، بدون قطعی ✅
🔹 پورت اختصاصی واقعی
🔹 آپلود رایگان
🔹 آپتایم 99.99% تضمینی
🔹 ارائه IP مازاد
🔹 پشتیبانی 24/7 (تیکت + آنلاین)
🔹 نصب سریع
🔹 پرداخت ماهیانه
⏳ ظرفیت محدود — همین الان تماس بگیر و سرویس رو رزرو کن:
📞 02191555530
🔗 https://taknet.ir/services/dedicated-server
🔹 پورت اختصاصی واقعی
🔹 آپلود رایگان
🔹 آپتایم 99.99% تضمینی
🔹 ارائه IP مازاد
🔹 پشتیبانی 24/7 (تیکت + آنلاین)
🔹 نصب سریع
🔹 پرداخت ماهیانه
⏳ ظرفیت محدود — همین الان تماس بگیر و سرویس رو رزرو کن:
📞 02191555530
🔗 https://taknet.ir/services/dedicated-server
❤1
🧵 مدیریت آپدیتها با webhook بهجای long polling برای ربات شلوغ
وقتی ربات کاربران زیادی دارد، استفاده از getUpdates (همون long polling) میتونه هم کند بشه، هم منابع سرور رو الکی درگیر کنه. تو این شرایط، webhook انتخاب خیلی تمیزتر و پایدارتره. 🔧
ایده سادهست: بهجای اینکه ربات هر چند لحظه بره سراغ Telegram و بگه «آپدیت جدید داری؟»، خود Telegram هر آپدیت رو push میکنه به یک URL روی سرور شما.
✅ مزایا تو رباتهای تلگرام:
• مصرف کمتر CPU و پهنایباند روی سرور
• تاخیر کمتر در دریافت پیامها
• مدیریت راحتتر scale وقتی تعداد چتها زیاد میشه
یک نمونه خیلی مینیمال با python-telegram-bot (ورژن جدید async) و Flask:
نکات مهم امنیتی و عملی 🛡️
• حتما از HTTPS استفاده بشه (LetsEncrypt کافیه).
• URL وبهوک رو حدسزدنی انتخاب نشه (مثلاً یک path تصادفی طولانی).
• لاگ خطاها و timeoutهای وبهوک رو حتما چک بشه؛ اگر endpoint زیاد خطا بده، Telegram موقتاً ارسال آپدیتها رو کند میکنه.
برای جزییات کاملتر و پارامترهای
https://core.telegram.org/bots/api#setwebhook
امتحان این معماری روی رباتهای نسبتا شلوغ، تفاوت سرعت و مصرف منابع رو کاملا نشون میده 🚀
🔖 #TelegramBot #ربات #تلگرام #telegram_bot #webhook #python #performance #security
👤 Developix
💎 Channel: @DevelopixRobot
وقتی ربات کاربران زیادی دارد، استفاده از getUpdates (همون long polling) میتونه هم کند بشه، هم منابع سرور رو الکی درگیر کنه. تو این شرایط، webhook انتخاب خیلی تمیزتر و پایدارتره. 🔧
ایده سادهست: بهجای اینکه ربات هر چند لحظه بره سراغ Telegram و بگه «آپدیت جدید داری؟»، خود Telegram هر آپدیت رو push میکنه به یک URL روی سرور شما.
✅ مزایا تو رباتهای تلگرام:
• مصرف کمتر CPU و پهنایباند روی سرور
• تاخیر کمتر در دریافت پیامها
• مدیریت راحتتر scale وقتی تعداد چتها زیاد میشه
یک نمونه خیلی مینیمال با python-telegram-bot (ورژن جدید async) و Flask:
from flask import Flask, request
from telegram import Update
from telegram.ext import (
Application,
CommandHandler,
)
TOKEN = "YOUR_BOT_TOKEN"
WEBHOOK_URL = "https://example.com/telegram-webhook"
app = Flask(__name__)
application = Application.builder().token(TOKEN).build()
async def start(update: Update, context):
await update.message.reply_text("سلام 👋")
application.add_handler(CommandHandler("start", start))
@app.post("/telegram-webhook")
def webhook():
update = Update.de_json(request.get_json(force=True),
application.bot)
application.update_queue.put_nowait(update)
return "ok"
if __name__ == "__main__":
import asyncio
async def main():
await application.bot.set_webhook(WEBHOOK_URL)
app.run(host="0.0.0.0", port=8000)
asyncio.run(main())
نکات مهم امنیتی و عملی 🛡️
• حتما از HTTPS استفاده بشه (LetsEncrypt کافیه).
• URL وبهوک رو حدسزدنی انتخاب نشه (مثلاً یک path تصادفی طولانی).
• لاگ خطاها و timeoutهای وبهوک رو حتما چک بشه؛ اگر endpoint زیاد خطا بده، Telegram موقتاً ارسال آپدیتها رو کند میکنه.
برای جزییات کاملتر و پارامترهای
setWebhook، داک رسمی Bot API بهترین مرجعه:https://core.telegram.org/bots/api#setwebhook
امتحان این معماری روی رباتهای نسبتا شلوغ، تفاوت سرعت و مصرف منابع رو کاملا نشون میده 🚀
🔖 #TelegramBot #ربات #تلگرام #telegram_bot #webhook #python #performance #security
👤 Developix
💎 Channel: @DevelopixRobot
👍2
Anti-Corruption Layer در معماری ربات تلگرام 🧱
یکی از دردسرهای رباتهای جدی تلگرام این است که باید با سیستمهای قدیمی (Legacy) مثل CRM، ERP یا درگاههای قدیمی صحبت کنند. این سیستمها معمولاً API شلخته، نامگذاری بد یا ساختارهای عجیب دارند.
اینجاست که مفهوم واقعی و مهم Anti-Corruption Layer (ACL) از دنیای Domain-Driven Design وارد میشود. ACL یک لایه میانی است که اجازه نمیدهد شلختگی دنیای بیرون وارد مدل تمیز ربات شما شود. 🤝
به جای اینکه همه جای کد ربات پر از type و fieldهای سیستمهای بیرونی شود، فقط یک نقطه با آنها حرف میزند و آن نقطه مسئول تبدیل (Mapping) دادههاست.
ایدهٔ اصلی:
• ربات شما یک Domain Model تمیز دارد (User, Order, Subscription و ...)
• سیستم بیرونی ساختار خودش را دارد
• ACL دادهها را بین این دو دنیا تبدیل و ایزوله میکند
این کار:
• وابستگی به سیستمهای بیرونی را متمرکز میکند
• تغییر API بیرونی را کمهزینهتر میکند
• تستنویسی برای منطق ربات را سادهتر میکند ✅
مثال ساده با Python برای ربات تلگرام:
چند نکتهٔ عملی در رباتهای تلگرام:
• برای هر سیستم بیرونی (درگاه پرداخت، CRM، سرویس ارسال SMS) یک ACL جدا بسازید، نه اینکه همهچیز در Handlerها قاطی شود.
• mappingها را در یکجا نگه دارید؛ مثلاً تبدیل statusهای پرداخت خارجی به enumهای داخلی.
• هر وقت API بیرونی عوض شد، فقط ACL را دستکاری کنید، نه تمام منطق ربات را.
منبع برای مطالعه بیشتر:
Martin Fowler - Anti-Corruption Layer
این الگو کمک میکند حتی اگر دنیای بیرون نامرتب است، معماری ربات شما تمیز، قابلتست و قابلگسترش بماند. 🌱
🔖 #TelegramBot #ربات #تلگرام #Anti_Corruption_Layer #Architecture #Telegram_Bot #Python #DDD #Clean_Code
👤 Developix
💎 Channel: @DevelopixRobot
یکی از دردسرهای رباتهای جدی تلگرام این است که باید با سیستمهای قدیمی (Legacy) مثل CRM، ERP یا درگاههای قدیمی صحبت کنند. این سیستمها معمولاً API شلخته، نامگذاری بد یا ساختارهای عجیب دارند.
اینجاست که مفهوم واقعی و مهم Anti-Corruption Layer (ACL) از دنیای Domain-Driven Design وارد میشود. ACL یک لایه میانی است که اجازه نمیدهد شلختگی دنیای بیرون وارد مدل تمیز ربات شما شود. 🤝
به جای اینکه همه جای کد ربات پر از type و fieldهای سیستمهای بیرونی شود، فقط یک نقطه با آنها حرف میزند و آن نقطه مسئول تبدیل (Mapping) دادههاست.
ایدهٔ اصلی:
• ربات شما یک Domain Model تمیز دارد (User, Order, Subscription و ...)
• سیستم بیرونی ساختار خودش را دارد
• ACL دادهها را بین این دو دنیا تبدیل و ایزوله میکند
این کار:
• وابستگی به سیستمهای بیرونی را متمرکز میکند
• تغییر API بیرونی را کمهزینهتر میکند
• تستنویسی برای منطق ربات را سادهتر میکند ✅
مثال ساده با Python برای ربات تلگرام:
class DomainUser:
def __init__(self, id, full_name, is_vip):
self.id = id
self.full_name = full_name
self.is_vip = is_vip
# Gateway سیستم قدیمی (مثال REST خام)
class LegacyCrmClient:
def get_user(self, chat_id: int) -> dict:
# در عمل اینجا requests.get و ... دارید
return {
"contact_id": chat_id,
"fname": "Ali",
"lname": "Ahmadi",
"segment": "gold", # یا basic, silver
}
# Anti-Corruption Layer
class CrmAcl:
def __init__(self, client: LegacyCrmClient):
self._client = client
def get_domain_user(self, chat_id: int) -> DomainUser:
raw = self._client.get_user(chat_id)
full_name = f"{raw['fname']} {raw['lname']}"
is_vip = raw["segment"] in ["gold", "platinum"]
return DomainUser(
id=raw["contact_id"],
full_name=full_name,
is_vip=is_vip,
)
# استفاده در Handler ربات
crm_acl = CrmAcl(LegacyCrmClient())
def handle_start(update, context):
user = crm_acl.get_domain_user(update.effective_chat.id)
if user.is_vip:
context.bot.send_message(
chat_id=user.id,
text=f"خوش اومدی {user.full_name} 🌟"
)
else:
context.bot.send_message(
chat_id=user.id,
text=f"سلام {user.full_name}!"
)
چند نکتهٔ عملی در رباتهای تلگرام:
• برای هر سیستم بیرونی (درگاه پرداخت، CRM، سرویس ارسال SMS) یک ACL جدا بسازید، نه اینکه همهچیز در Handlerها قاطی شود.
• mappingها را در یکجا نگه دارید؛ مثلاً تبدیل statusهای پرداخت خارجی به enumهای داخلی.
• هر وقت API بیرونی عوض شد، فقط ACL را دستکاری کنید، نه تمام منطق ربات را.
منبع برای مطالعه بیشتر:
Martin Fowler - Anti-Corruption Layer
این الگو کمک میکند حتی اگر دنیای بیرون نامرتب است، معماری ربات شما تمیز، قابلتست و قابلگسترش بماند. 🌱
🔖 #TelegramBot #ربات #تلگرام #Anti_Corruption_Layer #Architecture #Telegram_Bot #Python #DDD #Clean_Code
👤 Developix
💎 Channel: @DevelopixRobot
کتابخونهٔ python-telegram-bot یکی از محبوبترین ابزارها برای ساخت ربات تلگرام با Python هست. اگر حوصلهٔ کار مستقیم با HTTP و API خام تلگرام رو نداری، این لایبرری خیلی از دردسرها رو جمع میکنه 🧩
چند تا مزیت مهم:
• پشتیبانی کامل از Bot API
• پشتیبانی هم از polling هم webhook
• ساخت راحت inline keyboard و reply keyboard
• سیستم handler ها برای مرتب نگه داشتن کد
نمونهٔ سادهٔ ربات
برای پروژههای جدی هم ساختن ساختار تمیز با handler ها و استفاده از webhook روی سرور خیلی راحت میشه. پیشنهاد میشه مستنداتش رو یک بار کامل اسکن کنی و با مثالهاش جلو بری 🚀
Docs | GitHub
🔖 #TelegramBot #ربات #تلگرام #python_telegram_bot #Python #Telegram_Bot #ربات_تلگرام #Webhook #Inline_Keyboard
👤 Developix
💎 Channel: @DevelopixRobot
چند تا مزیت مهم:
• پشتیبانی کامل از Bot API
• پشتیبانی هم از polling هم webhook
• ساخت راحت inline keyboard و reply keyboard
• سیستم handler ها برای مرتب نگه داشتن کد
نمونهٔ سادهٔ ربات
/start:pip install python-telegram-bot==21.6
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
await update.message.reply_text("سلام، ربات آنلاینه ✌️")
app = ApplicationBuilder().token("BOT_TOKEN").build()
app.add_handler(CommandHandler("start", start))
app.run_polling()
برای پروژههای جدی هم ساختن ساختار تمیز با handler ها و استفاده از webhook روی سرور خیلی راحت میشه. پیشنهاد میشه مستنداتش رو یک بار کامل اسکن کنی و با مثالهاش جلو بری 🚀
Docs | GitHub
🔖 #TelegramBot #ربات #تلگرام #python_telegram_bot #Python #Telegram_Bot #ربات_تلگرام #Webhook #Inline_Keyboard
👤 Developix
💎 Channel: @DevelopixRobot
👍1
Forwarded from | AmirHossein |
به دلیل قطع اینترنت توی این مدت، توسعه ورژن 4 فریمورک LaraGram عقب افتاد.
در حالت عادی قرار بود برای خرداد ریلیز بشه، و همونطور که قبلا گفته بودم این ورژن شامل پشتیبانی کامل از MTProto و پکیجهایی برای توسعه TMAها بود.
ولی توی این شرایط زمان ریلیز شدن نامشخص هست.
با این حال از فرصت استفاده کردم و Simula رو توسعه دادم.
یک پلتفرم توسعه ربات تلگرامی بدون وابستگی به سرور، SSL، تلگرام یا حتی اینترنت، که خیلی ها درگیرش میشن.
این پلتفرم به صورت کامل کلاینت و سرور تلگرام رو شبیهسازی میکنه.
یعنی مثل تلگرام داخل این کلاینت ربات میسازید، بهتون توکن میده، و میتونید از این توکن توی هر لایبرری به هر زبانی ربات خودتون توسعه بدید.
با این تفاوت که باید از کلاینت خودش به جای تلگرام استفاده کنید.
این پلتفرم تمام قابلیتهای تلگرام رو پشتیبانی میکنه، حتی قابلیتهایی که نیاز به داشتن اکانت پرمیوم دارن رو اینجا میتونید رایگان استفاده کنید، مگر قابلیتی رو فراموش کرده باشم اضافه کنم😁
تمام متدهای تلگرام پشتیبانی میشن، میتونید وبهوک ست کنید و و و هر کاری که توی تلگرام قابل انجام هست.
در حال حاضر کلاینت این پروژه تحت وب هست، ولی به زودی با استفاده از Tauri کلاینتهای دسکتاپی رو هم اضافه میکنم.
سادهترین روش اجرای این پروژه در حال حاضر:
1- دانلود فایل simula-web.zip از این لینک
2- اجرای یکی از کامندهای زیر به نسبت سیستمعامل در فولدر دانلود شده:
Linux/MacOS:
Windows:
همچنین با کلون کردن ریپوزیتوری میتونید از داکر هم برای بیلد و اجرای اون استفاده کنید.
برای این پروژه انرژی زیادی گذاشته شده و هنوز اول راهش هست، پس لطفا در توانتون به دوستانتون معرفی کنید، و با استار دادن به ریپوزیتوری ازش حمایت کنید❤️
https://github.com/laraXgram/Simula
همچنین حمایت از پروژه LaraGram هم باعث خوشحالی من هست😁
https://github.com/laraXgram/LaraGram
@AmirhDeveloper
.
در حالت عادی قرار بود برای خرداد ریلیز بشه، و همونطور که قبلا گفته بودم این ورژن شامل پشتیبانی کامل از MTProto و پکیجهایی برای توسعه TMAها بود.
ولی توی این شرایط زمان ریلیز شدن نامشخص هست.
با این حال از فرصت استفاده کردم و Simula رو توسعه دادم.
یک پلتفرم توسعه ربات تلگرامی بدون وابستگی به سرور، SSL، تلگرام یا حتی اینترنت، که خیلی ها درگیرش میشن.
این پلتفرم به صورت کامل کلاینت و سرور تلگرام رو شبیهسازی میکنه.
یعنی مثل تلگرام داخل این کلاینت ربات میسازید، بهتون توکن میده، و میتونید از این توکن توی هر لایبرری به هر زبانی ربات خودتون توسعه بدید.
با این تفاوت که باید از کلاینت خودش به جای تلگرام استفاده کنید.
این پلتفرم تمام قابلیتهای تلگرام رو پشتیبانی میکنه، حتی قابلیتهایی که نیاز به داشتن اکانت پرمیوم دارن رو اینجا میتونید رایگان استفاده کنید، مگر قابلیتی رو فراموش کرده باشم اضافه کنم😁
تمام متدهای تلگرام پشتیبانی میشن، میتونید وبهوک ست کنید و و و هر کاری که توی تلگرام قابل انجام هست.
در حال حاضر کلاینت این پروژه تحت وب هست، ولی به زودی با استفاده از Tauri کلاینتهای دسکتاپی رو هم اضافه میکنم.
سادهترین روش اجرای این پروژه در حال حاضر:
1- دانلود فایل simula-web.zip از این لینک
2- اجرای یکی از کامندهای زیر به نسبت سیستمعامل در فولدر دانلود شده:
Linux/MacOS:
./run-web.sh
Windows:
run-web.bat
همچنین با کلون کردن ریپوزیتوری میتونید از داکر هم برای بیلد و اجرای اون استفاده کنید.
برای این پروژه انرژی زیادی گذاشته شده و هنوز اول راهش هست، پس لطفا در توانتون به دوستانتون معرفی کنید، و با استار دادن به ریپوزیتوری ازش حمایت کنید❤️
https://github.com/laraXgram/Simula
همچنین حمایت از پروژه LaraGram هم باعث خوشحالی من هست😁
https://github.com/laraXgram/LaraGram
@AmirhDeveloper
.
👍8❤1
Circuit Breaker در رباتهای تلگرام ⚡️🛡
خیلی وقتها ربات تلگرام ما به یک سرویس خارجی (مثلاً پرداخت، هوش مصنوعی، یا API داخلی شرکت) وابسته است. وقتی آن سرویس کند یا داون میشود، ربات هم کند میشود، Timeout میدهد و تجربه کاربر نابود میشود.
یکی از الگوهای معماری که اینجا واقعاً نجاتدهنده است، Circuit Breaker Pattern است.
ایدهٔ اصلی:
مثل فیوز برق عمل میکند؛ اگر درخواستهای پشتسرهم به سرویس خراب شوند، «مدار» را قطع میکند و موقتاً دیگر درخواست به آن سرویس نمیفرستد. بهجایش:
• سریع جواب fallback میدهد ⚙️
• از شلوغتر شدن سرویس خراب جلوگیری میکند 🚫
• ربات شما Responsive باقی میماند ✅
سه حالت اصلی:
• Closed: همهچیز اوکی است، درخواستها مستقیم میروند.
• Open: خطای زیاد؛ مدار قطع میشود، دیگر درخواست مستقیم نمیرود.
• Half-Open: هر چند ثانیه چند درخواست تستی میفرستد؛ اگر موفق شد، برمیگردد به Closed.
نمونه ساده در Python برای ربات تلگرام:
استفاده در هندلر پیام:
نکات کاربردی برای رباتهای تلگرام:
• برای هر سرویس حساس (پرداخت، AI، CRM) یک Circuit Breaker جدا نگهدارید.
• لاگ بگیرید تا بدانید کی مدار Open شده است.
• همراه Circuit Breaker، از Retry با Backoff هم استفاده کنید.
بهکمک Circuit Breaker رباتتان حتی وقتی سرویسهای بیرونی مشکل دارند، همچنان پایدار و قابلاعتماد میماند 💪
🔖 #TelegramBot #ربات #تلگرام #Circuit_Breaker #Resilience #Telegram_Bot #Python #Architecture #Pattern
👤 Developix
💎 Channel: @DevelopixRobot
خیلی وقتها ربات تلگرام ما به یک سرویس خارجی (مثلاً پرداخت، هوش مصنوعی، یا API داخلی شرکت) وابسته است. وقتی آن سرویس کند یا داون میشود، ربات هم کند میشود، Timeout میدهد و تجربه کاربر نابود میشود.
یکی از الگوهای معماری که اینجا واقعاً نجاتدهنده است، Circuit Breaker Pattern است.
ایدهٔ اصلی:
مثل فیوز برق عمل میکند؛ اگر درخواستهای پشتسرهم به سرویس خراب شوند، «مدار» را قطع میکند و موقتاً دیگر درخواست به آن سرویس نمیفرستد. بهجایش:
• سریع جواب fallback میدهد ⚙️
• از شلوغتر شدن سرویس خراب جلوگیری میکند 🚫
• ربات شما Responsive باقی میماند ✅
سه حالت اصلی:
• Closed: همهچیز اوکی است، درخواستها مستقیم میروند.
• Open: خطای زیاد؛ مدار قطع میشود، دیگر درخواست مستقیم نمیرود.
• Half-Open: هر چند ثانیه چند درخواست تستی میفرستد؛ اگر موفق شد، برمیگردد به Closed.
نمونه ساده در Python برای ربات تلگرام:
import time
import requests
class CircuitBreaker:
def __init__(self, failure_threshold=3, reset_timeout=10):
self.failure_threshold = failure_threshold
self.reset_timeout = reset_timeout
self.failures = 0
self.state = 'CLOSED'
self.last_failure_time = 0
def call(self, func, fallback, *args, **kwargs):
if self.state == 'OPEN':
if time.time() - self.last_failure_time > self.reset_timeout:
self.state = 'HALF_OPEN'
else:
return fallback()
try:
result = func(*args, **kwargs)
self.failures = 0
self.state = 'CLOSED'
return result
except Exception:
self.failures += 1
self.last_failure_time = time.time()
if self.failures >= self.failure_threshold:
self.state = 'OPEN'
return fallback()
cb = CircuitBreaker()
استفاده در هندلر پیام:
def call_ai_service(text):
return requests.post('https://api.example.com/ai', json={'q': text}).json()
def ai_fallback():
return {'answer': 'سرویس هوش مصنوعی موقتاً در دسترس نیست 😔'}
# داخل هندلر ربات
response = cb.call(call_ai_service, ai_fallback, message.text)
bot.send_message(chat_id, response['answer'])
نکات کاربردی برای رباتهای تلگرام:
• برای هر سرویس حساس (پرداخت، AI، CRM) یک Circuit Breaker جدا نگهدارید.
• لاگ بگیرید تا بدانید کی مدار Open شده است.
• همراه Circuit Breaker، از Retry با Backoff هم استفاده کنید.
بهکمک Circuit Breaker رباتتان حتی وقتی سرویسهای بیرونی مشکل دارند، همچنان پایدار و قابلاعتماد میماند 💪
🔖 #TelegramBot #ربات #تلگرام #Circuit_Breaker #Resilience #Telegram_Bot #Python #Architecture #Pattern
👤 Developix
💎 Channel: @DevelopixRobot
👍5
🤖 ساخت ربات آزمون چهارگزینهای در تلگرام با Python
تو خیلی از کانالها و گروهها، رباتهایی میبینی که آزمون چهارگزینهای (Quiz) برگزار میکنن، امتیاز میدن و حتی جواب درست رو هم نشون میدن. امروز با هم یک نسخه ساده و عملی از همین ایده رو با Python و کتابخونهٔ pyTelegramBotAPI میسازیم 😎
ایده اینه:
• کاربر /quiz رو میفرسته.
• ربات یک سوال چهارگزینهای با دکمههای Inline میفرسته.
• با کلیک روی گزینه، ربات میگه درست بود یا غلط.
این مدل ربات برای کوییزهای آموزشی، آزمون زبان، تمرین الگوریتم و حتی سرگرمی توی گروهها عالیه.
این کد رو براساس داکیومنت رسمی Bot API و کتابخونهٔ pyTelegramBotAPI نوشتیم و روی BotFather معمولی کاملاً جواب میده ✅
اول با pip نصب کن:
سپس یک فایل مثل
چند نکتهٔ ریز ولی مهم 👇
• حتماً توکن واقعی ربات رو جایگزین
• اگر روی سرور با محدودیت Network هستی، ممکنه نیاز بشه بجای
• میتونی لیست
امتحانش کن، روی چندتا دوستت تست بگیر و بعد کمکم امکاناتی مثل نمرهدهی، رتبهبندی و زمانبندی آزمون رو بهش اضافه کن 🚀
🔖 #TelegramBot #ربات #تلگرام #Telegram_Bot #Python #pyTelegramBotAPI #Quiz_Bot #InlineKeyboard
👤 Developix
💎 Channel: @DevelopixRobot
تو خیلی از کانالها و گروهها، رباتهایی میبینی که آزمون چهارگزینهای (Quiz) برگزار میکنن، امتیاز میدن و حتی جواب درست رو هم نشون میدن. امروز با هم یک نسخه ساده و عملی از همین ایده رو با Python و کتابخونهٔ pyTelegramBotAPI میسازیم 😎
ایده اینه:
• کاربر /quiz رو میفرسته.
• ربات یک سوال چهارگزینهای با دکمههای Inline میفرسته.
• با کلیک روی گزینه، ربات میگه درست بود یا غلط.
این مدل ربات برای کوییزهای آموزشی، آزمون زبان، تمرین الگوریتم و حتی سرگرمی توی گروهها عالیه.
این کد رو براساس داکیومنت رسمی Bot API و کتابخونهٔ pyTelegramBotAPI نوشتیم و روی BotFather معمولی کاملاً جواب میده ✅
اول با pip نصب کن:
pip install pyTelegramBotAPI
سپس یک فایل مثل
quiz_bot.py بساز و این کد رو داخلش بذار (توکن رو از BotFather بردار و جایگزین کن):import telebot
from telebot import types
API_TOKEN = "YOUR_BOT_TOKEN_HERE"
bot = telebot.TeleBot(API_TOKEN)
# یک سوال نمونه
QUESTION = "کدام زبان برای توسعه ربات تلگرام در این مثال استفاده شده است؟"
OPTIONS = ["Java", "Python", "PHP", "Go"]
CORRECT_INDEX = 1 # Python
@bot.message_handler(commands=["start"])
def send_welcome(message):
bot.reply_to(message, "سلام! برای شروع آزمون دستور /quiz رو بفرست ✅")
@bot.message_handler(commands=["quiz"])
def send_quiz(message):
keyboard = types.InlineKeyboardMarkup()
for i, option in enumerate(OPTIONS):
btn = types.InlineKeyboardButton(
text=option,
callback_data=f"quiz_{i}"
)
keyboard.add(btn)
bot.send_message(
message.chat.id,
QUESTION,
reply_markup=keyboard
)
@bot.callback_query_handler(func=lambda call: call.data.startswith("quiz_"))
def handle_quiz_answer(call):
index = int(call.data.split("_")[1])
if index == CORRECT_INDEX:
text = "آفرین 🎉 جواب درست بود (Python)."
else:
correct_option = OPTIONS[CORRECT_INDEX]
text = f"❌ نه! جواب درست: {correct_option}"
# پاسخ به همون پیام
bot.answer_callback_query(call.id, text, show_alert=True)
if __name__ == "__main__":
print("Quiz bot is running...")
bot.infinity_polling()
چند نکتهٔ ریز ولی مهم 👇
• حتماً توکن واقعی ربات رو جایگزین
YOUR_BOT_TOKEN_HERE کن.• اگر روی سرور با محدودیت Network هستی، ممکنه نیاز بشه بجای
infinity_polling() از webhook استفاده کنی (طبق داک رسمی: setWebhook).• میتونی لیست
OPTIONS و متن QUESTION رو از یک فایل JSON یا دیتابیس بخونی تا رباتت چندین سوال پشتسرهم بپرسه.امتحانش کن، روی چندتا دوستت تست بگیر و بعد کمکم امکاناتی مثل نمرهدهی، رتبهبندی و زمانبندی آزمون رو بهش اضافه کن 🚀
🔖 #TelegramBot #ربات #تلگرام #Telegram_Bot #Python #pyTelegramBotAPI #Quiz_Bot #InlineKeyboard
👤 Developix
💎 Channel: @DevelopixRobot
👍3👎1
Idempotency در Webhook ربات تلگرام چیه؟ 🔁
یکی از مشکلهای رایج تو رباتهای تلگرام اینه که یه آپدیت چند بار پردازش میشه؛ مخصوصاً وقتی:
• سرور delay داره ⏳
• ngrok / proxy قطع و وصل میشه
• خودت retry برای requestهات گذاشتی
اینجاست که مفهوم Idempotency نجاتت میده؛ یعنی اجرای چندبارهٔ یه عملیات، اثر اضافهای نسبت به بار اول نداشته باشه. ✅
در ربات تلگرام، بهترین candidate برای Idempotency همون update_id هر پیام یا callback هست.
ایدهٔ اصلی:
1️⃣ هر
2️⃣ اگر دوباره همون
یه پیادهسازی ساده با Python + Redis 🐍
نکات مهم در عمل 🚀
• TTL مناسب بذار؛ معمولاً چند دقیقه برای
• تو عملیات حساس مثل پرداخت، حتماً Idempotency رو تا لایهٔ دیتابیس ادامه بده (مثلاً با unique index روی
• اگر از getUpdates هم استفاده میکنی، باز همین منطق برای safety بیشتر مفیده.
• تو jobهای async یا queueهات (مثل Celery, RQ) هم
پیادهسازی درست Idempotency تو Webhook جلوی کلی باگ عجیبی مثل برداشت دوباره، ثبت تکراری سفارش و ارسال چندبارهٔ پیام رو میگیره و رباتت رو حسابی قابلاعتمادتر میکنه ✨
از همین امروز تو لایهٔ Webhook رباتت این الگو رو اضافه کن و ذهنت رو از ترس retryها خلاص کن. 😄
🔖 #TelegramBot #ربات #تلگرام #Idempotency #Telegram_Bot #Webhook #Python #Redis #Clean_Code #Robustness
👤 Developix
💎 Channel: @DevelopixRobot
یکی از مشکلهای رایج تو رباتهای تلگرام اینه که یه آپدیت چند بار پردازش میشه؛ مخصوصاً وقتی:
• سرور delay داره ⏳
• ngrok / proxy قطع و وصل میشه
• خودت retry برای requestهات گذاشتی
اینجاست که مفهوم Idempotency نجاتت میده؛ یعنی اجرای چندبارهٔ یه عملیات، اثر اضافهای نسبت به بار اول نداشته باشه. ✅
در ربات تلگرام، بهترین candidate برای Idempotency همون update_id هر پیام یا callback هست.
ایدهٔ اصلی:
1️⃣ هر
update_id رو فقط یه بار قبول کن.2️⃣ اگر دوباره همون
update_id رسید، بهجای دوباره انجام دادن کار (مثلاً برداشت از کیف پول کاربر)، فقط نتیجهٔ قبلی رو برگردون یا بیصدا ignore کن.یه پیادهسازی ساده با Python + Redis 🐍
import time
import redis
from flask import Flask, request
r = redis.Redis(host="localhost", port=6379, db=0)
app = Flask(__name__)
IDEMPOTENCY_TTL = 60 * 5 # 5 دقیقه
@app.post("/webhook")
def telegram_webhook():
update = request.get_json(force=True)
update_id = update.get("update_id")
if update_id is None:
return "ok" # ورودی نامعتبر، بیصدا رد میکنیم
cache_key = f"tg:update:{update_id}"
# اگر قبلاً پردازش شده، دوباره انجام نده
if r.exists(cache_key):
return "ok" # idempotent پاسخ
# قفل سبک برای این update
with r.lock(f"lock:{cache_key}", timeout=5):
if r.exists(cache_key):
return "ok"
handle_update(update)
# علامتگذاری بهعنوان پردازششده
r.setex(cache_key, IDEMPOTENCY_TTL, int(time.time()))
return "ok"
def handle_update(update: dict) -> None:
message = update.get("message", {})
text = message.get("text", "")
chat_id = message.get("chat", {}).get("id")
if text == "/start":
send_welcome(chat_id)
def send_welcome(chat_id: int) -> None:
# اینجا فراخوانی sendMessage به Bot API رو انجام بده
...
نکات مهم در عمل 🚀
• TTL مناسب بذار؛ معمولاً چند دقیقه برای
update_id ها کافیه.• تو عملیات حساس مثل پرداخت، حتماً Idempotency رو تا لایهٔ دیتابیس ادامه بده (مثلاً با unique index روی
update_id یا invoice_id).• اگر از getUpdates هم استفاده میکنی، باز همین منطق برای safety بیشتر مفیده.
• تو jobهای async یا queueهات (مثل Celery, RQ) هم
update_id یا یه idempotency key اختصاصی حمل کن.پیادهسازی درست Idempotency تو Webhook جلوی کلی باگ عجیبی مثل برداشت دوباره، ثبت تکراری سفارش و ارسال چندبارهٔ پیام رو میگیره و رباتت رو حسابی قابلاعتمادتر میکنه ✨
از همین امروز تو لایهٔ Webhook رباتت این الگو رو اضافه کن و ذهنت رو از ترس retryها خلاص کن. 😄
🔖 #TelegramBot #ربات #تلگرام #Idempotency #Telegram_Bot #Webhook #Python #Redis #Clean_Code #Robustness
👤 Developix
💎 Channel: @DevelopixRobot
👍3
🎯 ریپلای تمیز توی ربات: همیشه از
وقتی ربات توی گروهها شلوغ میشود، مهم است جواب هر کاربر دقیقاً زیر پیام خودش بیاید؛ مخصوصاً وقتی چند نفر همزمان از ربات استفاده میکنند. بهجای اینکه فقط به chat تکیه شود، بهتر است همیشه از فیلد
نمونه با Python و
این کار توی گروهها و سوپرگروهها:
• 📌 جریان گفتگو را واضح نگه میدارد.
• 🚫 احتمال اشتباه یا سوتفاهم را کم میکند.
• 💬 مخصوصاً برای رباتهای پشتیبانی، Quiz یا Ticket خیلی حیاتی است.
موقع ارسال پیام با
🔗 مستند رسمی: Telegram Bot API – sendMessage
🔖 #TelegramBot #ربات #تلگرام #Telegram_Bot #reply_to_message_id #python_telegram_bot #group_bots #conversation
👤 Developix
💎 Channel: @DevelopixRobot
reply_to_message_id استفاده کنوقتی ربات توی گروهها شلوغ میشود، مهم است جواب هر کاربر دقیقاً زیر پیام خودش بیاید؛ مخصوصاً وقتی چند نفر همزمان از ربات استفاده میکنند. بهجای اینکه فقط به chat تکیه شود، بهتر است همیشه از فیلد
reply_to_message_id استفاده شود تا رشتهٔ گفتگو مرتب بماند. 😉نمونه با Python و
python-telegram-bot (v20+):from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes
async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
msg = update.effective_message
await msg.reply_text(
"سلام 👋\nدر چه کاری کمک میکنم؟",
reply_to_message_id=msg.message_id
)
app = ApplicationBuilder().token("YOUR_TOKEN").build()
app.add_handler(CommandHandler("start", start))
app.run_polling()
این کار توی گروهها و سوپرگروهها:
• 📌 جریان گفتگو را واضح نگه میدارد.
• 🚫 احتمال اشتباه یا سوتفاهم را کم میکند.
• 💬 مخصوصاً برای رباتهای پشتیبانی، Quiz یا Ticket خیلی حیاتی است.
موقع ارسال پیام با
sendMessage در Bot API خام هم کافی است همیشه reply_to_message_id را با message_id پیام کاربر ست کنی.🔗 مستند رسمی: Telegram Bot API – sendMessage
🔖 #TelegramBot #ربات #تلگرام #Telegram_Bot #reply_to_message_id #python_telegram_bot #group_bots #conversation
👤 Developix
💎 Channel: @DevelopixRobot
👍1👎1
📌 ساخت منوی اینلاین حرفهای در ربات تلگرام با Telegraf (Node.js)
اگر تا حالا رباتی دیدی که زیر هر پیام چند تا دکمه شیک اینلاین داره (مثلاً «خرید»، «اطلاعات بیشتر»، «بازگشت»)، دقیقاً همون چیزی رو میخوایم بسازیم 😎
تو این پست میریم سراغ ساخت یک ربات Node.js با Telegraf که:
• یک دستور
• زیر پیام، Inline Keyboard نشون میده ✅
• روی هر دکمه کلیک بشه، بدون ارسال پیام جدید، فقط متن همون پیام رو آپدیت میکنه ✅
منبع اصلی این ایده از داکیومنت رسمی Telegraf هست:
telegraf.js.org - Inline Keyboards
برای شروع، فقط لازمه Node.js نصب باشه و یک Bot Token هم از @BotFather گرفته باشی.
۱️⃣ نصب Telegraf
داخل پوشه پروژه:
۲️⃣ یک ربات ساده با Inline Keyboard
فایل مثلاً
حالا فقط کافیه:
رو اجرا کنی و تو تلگرام به رباتت
نکات ریز ولی مهم 👇
• از
• برای دکمههایی که باید به لینک بیرونی برن، از
• برای ساخت منوهای چندسطحی، میتونی داخل هر
امتحانش کن، منوی اینلاین تقریباً تو هر ربات جدیای لازمه و وقتی دستت بیفته، نصف راه UX خوب رو رفتی 🚀
🔖 #TelegramBot #ربات #تلگرام #Telegram_Bot #Node_js #Telegraf #Inline_Keyboard #Programming_Tutorial #Realtime_Bots
👤 Developix
💎 Channel: @DevelopixRobot
اگر تا حالا رباتی دیدی که زیر هر پیام چند تا دکمه شیک اینلاین داره (مثلاً «خرید»، «اطلاعات بیشتر»، «بازگشت»)، دقیقاً همون چیزی رو میخوایم بسازیم 😎
تو این پست میریم سراغ ساخت یک ربات Node.js با Telegraf که:
• یک دستور
/start داره ✅• زیر پیام، Inline Keyboard نشون میده ✅
• روی هر دکمه کلیک بشه، بدون ارسال پیام جدید، فقط متن همون پیام رو آپدیت میکنه ✅
منبع اصلی این ایده از داکیومنت رسمی Telegraf هست:
telegraf.js.org - Inline Keyboards
برای شروع، فقط لازمه Node.js نصب باشه و یک Bot Token هم از @BotFather گرفته باشی.
۱️⃣ نصب Telegraf
داخل پوشه پروژه:
npm init -y
npm install telegraf
۲️⃣ یک ربات ساده با Inline Keyboard
فایل مثلاً
bot.js:const { Telegraf, Markup } = require('telegraf');
// BotFather توکن رباتت رو اینجا بذار
const bot = new Telegraf('YOUR_BOT_TOKEN_HERE');
// /start - نمایش منوی اینلاین
bot.start((ctx) => {
return ctx.reply(
'سلام 👋\nیک گزینه انتخاب کن:',
Markup.inlineKeyboard([
[
Markup.button.callback('📊 وضعیت ربات', 'status'),
Markup.button.callback('ℹ️ درباره', 'about'),
],
[
Markup.button.url('🌐 وبسایت رسمی', 'https://core.telegram.org/bots'),
],
])
);
});
// هندل کردن callbackهای اینلاین
bot.action('status', async (ctx) => {
await ctx.answerCbQuery(); // بستن لودینگ کوچک تلگرام
await ctx.editMessageText('✅ ربات آنلاین است و مشکلی ندارد.');
});
bot.action('about', async (ctx) => {
await ctx.answerCbQuery();
await ctx.editMessageText(
'این یک نمونه ربات ساده با Inline Keyboard است.\n' +
'با Telegraf میتوانی رباتهای خیلی حرفهایتر بسازی 😉'
);
});
// اجرای ربات با Long Polling
bot.launch().then(() => {
console.log('Bot started...');
});
// برای shutdown تمیز (مخصوص سرورهای واقعی)
process.once('SIGINT', () => bot.stop('SIGINT'));
process.once('SIGTERM', () => bot.stop('SIGTERM'));حالا فقط کافیه:
node bot.js
رو اجرا کنی و تو تلگرام به رباتت
/start بفرستی. میبینی که دکمهها زیر پیام ظاهر میشن و با کلیک روی هرکدوم، متن همون پیام آپدیت میشه؛ بدون اینکه چت شلوغ بشه ✨نکات ریز ولی مهم 👇
• از
ctx.answerCbQuery() استفاده کن تا اون لودینگ ریز روی دکمه گیر نکنه.• برای دکمههایی که باید به لینک بیرونی برن، از
button.url استفاده کن.• برای ساخت منوهای چندسطحی، میتونی داخل هر
bot.action دوباره یک Inline Keyboard جدید بفرستی یا پیام رو با editMessageText و کیبورد جدید آپدیت کنی.امتحانش کن، منوی اینلاین تقریباً تو هر ربات جدیای لازمه و وقتی دستت بیفته، نصف راه UX خوب رو رفتی 🚀
🔖 #TelegramBot #ربات #تلگرام #Telegram_Bot #Node_js #Telegraf #Inline_Keyboard #Programming_Tutorial #Realtime_Bots
👤 Developix
💎 Channel: @DevelopixRobot
👍3
Command Pattern در معماری ربات تلگرام 🚀
یکی از الگوهای خیلی کاربردی برای تمیز نگه داشتن کد ربات، مخصوصاً وقتی تعداد دستورات زیاد میشود، Command Pattern است.
بهجای اینکه داخل یک فایل بزرگ با کلی
✅ کد را خواناتر و قابل نگهداریتر میکند
✅ اضافه کردن دستور جدید را ساده و بدون دستکاری منطق قبلی میکند
✅ تستنویسی برای هر دستور را راحتتر میکند
ایدهٔ اصلی Command Pattern 🧠
هر دستور (مثلاً
یک «Command Bus» یا «Dispatcher» فقط تشخیص میدهد کاربر چه دستوری داده و Command مناسب را صدا میزند؛ خودش منطق دستور را بلد نیست.
نمونهٔ ساده در ربات تلگرام (python-telegram-bot) 🐍
چند نکتهٔ عملی برای رباتهای واقعی 🛠
• برای هر Command میتوان وابستگیها را تزریق کرد (Repository، Service، Logger) تا کلاسها تمیز و تستپذیر بمانند.
• وقتی تعداد Command ها زیاد شد، میتوان ثبت آنها را بهصورت داینامیک (مثلاً با اسکن ماژولها) انجام داد تا دیگر یک دیکشنری بزرگ دستی نگه نداریم.
• در کنار Command Pattern، استفاده از Single Responsibility Principle کمک میکند منطق ربات از منطق زیرساخت (HTTP, DB, Cache) جدا بماند.
برای مطالعهٔ بیشتر دربارهٔ این الگو:
refactoring.guru/design-patterns/command
قدمبهقدم که رباتتان بزرگتر میشود، استفاده از Command Pattern کمک میکند معماری کد تمیز بماند و با خیال راحت فیچرهای جدید اضافه کنید ✨
🔖 #TelegramBot #ربات #تلگرام #Command_Pattern #Telegram_Bot #Clean_Code #Python #Design_Patterns #Software_Architecture
👤 Developix
💎 Channel: @DevelopixRobot
یکی از الگوهای خیلی کاربردی برای تمیز نگه داشتن کد ربات، مخصوصاً وقتی تعداد دستورات زیاد میشود، Command Pattern است.
بهجای اینکه داخل یک فایل بزرگ با کلی
if/elif همهٔ دستورها را هندل کنیم، هر دستور را بهصورت یک «Command» جداگانه پیادهسازی میکنیم. این کار:✅ کد را خواناتر و قابل نگهداریتر میکند
✅ اضافه کردن دستور جدید را ساده و بدون دستکاری منطق قبلی میکند
✅ تستنویسی برای هر دستور را راحتتر میکند
ایدهٔ اصلی Command Pattern 🧠
هر دستور (مثلاً
/start، /help، /stats) تبدیل میشود به یک کلاس با یک متد ثابت، مثلاً execute().یک «Command Bus» یا «Dispatcher» فقط تشخیص میدهد کاربر چه دستوری داده و Command مناسب را صدا میزند؛ خودش منطق دستور را بلد نیست.
نمونهٔ ساده در ربات تلگرام (python-telegram-bot) 🐍
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes
class BaseCommand:
async def execute(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
raise NotImplementedError
class StartCommand(BaseCommand):
async def execute(self, update, context):
await update.message.reply_text("سلام 👋 خوش اومدی!")
class HelpCommand(BaseCommand):
async def execute(self, update, context):
await update.message.reply_text("لیست دستورات: /start, /help")
class CommandDispatcher:
def __init__(self):
self._commands = {
"start": StartCommand(),
"help": HelpCommand(),
}
async def handle(self, update, context):
name = update.message.text.lstrip("/").split()[0]
cmd = self._commands.get(name)
if cmd:
await cmd.execute(update, context)
dispatcher = CommandDispatcher()
async def entrypoint(update: Update, context: ContextTypes.DEFAULT_TYPE):
await dispatcher.handle(update, context)
app = ApplicationBuilder().token("TOKEN").build()
app.add_handler(CommandHandler(["start", "help"], entrypoint))
app.run_polling()
چند نکتهٔ عملی برای رباتهای واقعی 🛠
• برای هر Command میتوان وابستگیها را تزریق کرد (Repository، Service، Logger) تا کلاسها تمیز و تستپذیر بمانند.
• وقتی تعداد Command ها زیاد شد، میتوان ثبت آنها را بهصورت داینامیک (مثلاً با اسکن ماژولها) انجام داد تا دیگر یک دیکشنری بزرگ دستی نگه نداریم.
• در کنار Command Pattern، استفاده از Single Responsibility Principle کمک میکند منطق ربات از منطق زیرساخت (HTTP, DB, Cache) جدا بماند.
برای مطالعهٔ بیشتر دربارهٔ این الگو:
refactoring.guru/design-patterns/command
قدمبهقدم که رباتتان بزرگتر میشود، استفاده از Command Pattern کمک میکند معماری کد تمیز بماند و با خیال راحت فیچرهای جدید اضافه کنید ✨
🔖 #TelegramBot #ربات #تلگرام #Command_Pattern #Telegram_Bot #Clean_Code #Python #Design_Patterns #Software_Architecture
👤 Developix
💎 Channel: @DevelopixRobot
❤5👎1
💠 نسخه جدید رابط توسعه ربات تلگرام (Telegram Bot API) منتشر شده است
🔸 ارتقا از نسخه 10.1 به 10.2
🔹 لیست تغییرات این نسخه:
- پشتیبانی از «پیامهای غنی» با قالببندی پیشرفته متن
- امکان استریم و ویرایش زنده پیامهای غنی
- قابلیت «درخواست عضویت» با متدها و فیلدهای جدید
- افزودن لینک و مدیای پیشرفته به نظرسنجیها
- بهبودهای عمومی در ساختار پیامها، جداول، لیستها و …
- تغییرات جزئی دیگر در انواع و متدهای Bot API
🔖 #telegram_bot_api, #bot, #release
💎 @DevelopixRobot
🔸 ارتقا از نسخه 10.1 به 10.2
🔹 لیست تغییرات این نسخه:
- پشتیبانی از «پیامهای غنی» با قالببندی پیشرفته متن
- امکان استریم و ویرایش زنده پیامهای غنی
- قابلیت «درخواست عضویت» با متدها و فیلدهای جدید
- افزودن لینک و مدیای پیشرفته به نظرسنجیها
- بهبودهای عمومی در ساختار پیامها، جداول، لیستها و …
- تغییرات جزئی دیگر در انواع و متدهای Bot API
🔖 #telegram_bot_api, #bot, #release
💎 @DevelopixRobot
👍3
🧩 ورژن 4 فریمورک LaraGram منتشر شد.
یکی از مهمترین قابلیتهای LaraGram 4، معرفی پکیج MTProto است؛ پکیجی که با هدف سادهسازی توسعه پروژههای مبتنی بر Telegram MTProto API طراحی شده است.
توسعه با MTProto معمولاً با چالشهایی مانند مدیریت Session، احراز هویت، نگهداری اتصال، دریافت Updateها، مدیریت Flood Wait و پیکربندیهای پیچیده همراه است. در LaraGram تلاش شده تمام این پیچیدگیها از مسیر توسعهدهنده حذف شود تا تجربهای مشابه توسعه یک ربات معمولی، اما با قدرت کامل MTProto داشته باشید.
⚡️ شروع کار بدون دردسر با LaraGram Installer
برای اینکه حتی مرحله راهاندازی هم ساده باشد، LaraGram Installer تمام مراحل اولیه را برای شما انجام میدهد.
با استفاده از Installer، فرآیندهایی مانند:
- نصب LaraGram
- نصب و آمادهسازی پکیج MTProto
- انجام کانفیگهای اولیه
- آمادهسازی ساختار پروژه
به صورت خودکار انجام میشود.
بعد از نصب، کافی است Handlerهای موردنظر خود را تعریف کنید و منطق برنامه را بنویسید؛ بخش زیادی از کارهای مربوط به زیرساخت، اتصال و مدیریت سرویس توسط خود LaraGram انجام خواهد شد.
⚡️ قدرت گرفته از Surge و Swoole/OpenSwoole
MTProto در LaraGram بر پایه Surge و Swoole/OpenSwoole توسعه داده شده است؛ یعنی به جای اجرای سنتی PHP، از یک Runtime دائمی و Event-Driven استفاده میکند.
این معماری باعث میشود MTProto بتواند برای ارتباطهای دائمی و پروژههای Real-Time عملکرد بسیار بهتری داشته باشد:
🚀 پردازش سریعتر Updateها
🔄 مدیریت همزمان اتصالها
💾 مصرف بهینهتر منابع
⚡️ حذف سربار اجرای مجدد برنامه
📈 آمادگی برای پروژههای بزرگ و پرترافیک
🧠 تمام امکانات MTProto، آماده استفاده
در MTProto LaraGram بسیاری از قابلیتهایی که معمولاً نیاز به پیادهسازی دستی دارند، به صورت داخلی فراهم شدهاند، به عنوان مثال شبیه سازی رفتار انسان، یا اعمال لیمیتهای خودکار به صورت هوشمند.
در نتیجه، توسعهدهنده به جای درگیر شدن با جزئیات سطح پایین، روی ساخت قابلیتهای اصلی پروژه تمرکز میکند.
🌐 MTProto + Web Routing؛ ساخت Telegram Client تحت وب
یکی از جذابترین بخشهای LaraGram 4، ترکیب MTProto با Web Framework جدید LaraGram است.
ترکیب این قابلیتها با MTProto به شما اجازه میدهد یک Telegram Web Client اختصاصی توسعه دهید؛ جایی که رابط کاربری از طریق سیستم وب LaraGram ساخته میشود و ارتباط مستقیم با تلگرام از طریق MTProto انجام میشود.
یعنی با یک اکوسیستم واحد میتوانید:
Backend وب را مدیریت کنید
با Telegram API ارتباط داشته باشید
حسابهای کاربری را مدیریت کنید
کلاینتها و سرویسهای اختصاصی تلگرامی بسازید
این تنها یکی از قابلیت های LaraGram است، پکیج Luna، یکی دیگر از آپدیتهای بزرگ LaraGram برای توسعه مینیاپ ها با React/Vue/Svelte بدون درگیری با API نویسی، SPAs، یا InitData تلگرام است.
همچنین پکیجهایی برای توسعه با AI، ماینتورینگ ربات و... در حال توسعه هستند.
نسخه 4 آغاز مسیر جدید LaraGram است؛ مسیری که این پروژه را از یک فریمورک ربات، به بستری کامل برای توسعه سرویسها، کلاینتها و اپلیکیشنهای مبتنی بر تلگرام تبدیل میکند.
📚 مستندات کامل: https://laraxgram.github.io
⭐️ اگر LaraGram برای شما مفید است، خوشحال میشویم با معرفی پروژه و دادن Star در GitHub از توسعه آن حمایت کنید:
🔹 گیتهاب LaraGram
🔹 گیتهاب MTProto
🔹 گیتهاب Luna
یکی از مهمترین قابلیتهای LaraGram 4، معرفی پکیج MTProto است؛ پکیجی که با هدف سادهسازی توسعه پروژههای مبتنی بر Telegram MTProto API طراحی شده است.
توسعه با MTProto معمولاً با چالشهایی مانند مدیریت Session، احراز هویت، نگهداری اتصال، دریافت Updateها، مدیریت Flood Wait و پیکربندیهای پیچیده همراه است. در LaraGram تلاش شده تمام این پیچیدگیها از مسیر توسعهدهنده حذف شود تا تجربهای مشابه توسعه یک ربات معمولی، اما با قدرت کامل MTProto داشته باشید.
⚡️ شروع کار بدون دردسر با LaraGram Installer
برای اینکه حتی مرحله راهاندازی هم ساده باشد، LaraGram Installer تمام مراحل اولیه را برای شما انجام میدهد.
با استفاده از Installer، فرآیندهایی مانند:
- نصب LaraGram
- نصب و آمادهسازی پکیج MTProto
- انجام کانفیگهای اولیه
- آمادهسازی ساختار پروژه
به صورت خودکار انجام میشود.
بعد از نصب، کافی است Handlerهای موردنظر خود را تعریف کنید و منطق برنامه را بنویسید؛ بخش زیادی از کارهای مربوط به زیرساخت، اتصال و مدیریت سرویس توسط خود LaraGram انجام خواهد شد.
⚡️ قدرت گرفته از Surge و Swoole/OpenSwoole
MTProto در LaraGram بر پایه Surge و Swoole/OpenSwoole توسعه داده شده است؛ یعنی به جای اجرای سنتی PHP، از یک Runtime دائمی و Event-Driven استفاده میکند.
این معماری باعث میشود MTProto بتواند برای ارتباطهای دائمی و پروژههای Real-Time عملکرد بسیار بهتری داشته باشد:
🚀 پردازش سریعتر Updateها
🔄 مدیریت همزمان اتصالها
💾 مصرف بهینهتر منابع
⚡️ حذف سربار اجرای مجدد برنامه
📈 آمادگی برای پروژههای بزرگ و پرترافیک
🧠 تمام امکانات MTProto، آماده استفاده
در MTProto LaraGram بسیاری از قابلیتهایی که معمولاً نیاز به پیادهسازی دستی دارند، به صورت داخلی فراهم شدهاند، به عنوان مثال شبیه سازی رفتار انسان، یا اعمال لیمیتهای خودکار به صورت هوشمند.
در نتیجه، توسعهدهنده به جای درگیر شدن با جزئیات سطح پایین، روی ساخت قابلیتهای اصلی پروژه تمرکز میکند.
نکته: به دلیل استفاده از Swoole/OpenSwoole، پکیج MTProto روی هاستهای اشتراکی قابل اجرا نیست و برای استفاده از آن به یک VPS نیاز خواهید داشت.
🌐 MTProto + Web Routing؛ ساخت Telegram Client تحت وب
یکی از جذابترین بخشهای LaraGram 4، ترکیب MTProto با Web Framework جدید LaraGram است.
ترکیب این قابلیتها با MTProto به شما اجازه میدهد یک Telegram Web Client اختصاصی توسعه دهید؛ جایی که رابط کاربری از طریق سیستم وب LaraGram ساخته میشود و ارتباط مستقیم با تلگرام از طریق MTProto انجام میشود.
یعنی با یک اکوسیستم واحد میتوانید:
Backend وب را مدیریت کنید
با Telegram API ارتباط داشته باشید
حسابهای کاربری را مدیریت کنید
کلاینتها و سرویسهای اختصاصی تلگرامی بسازید
این تنها یکی از قابلیت های LaraGram است، پکیج Luna، یکی دیگر از آپدیتهای بزرگ LaraGram برای توسعه مینیاپ ها با React/Vue/Svelte بدون درگیری با API نویسی، SPAs، یا InitData تلگرام است.
همچنین پکیجهایی برای توسعه با AI، ماینتورینگ ربات و... در حال توسعه هستند.
نسخه 4 آغاز مسیر جدید LaraGram است؛ مسیری که این پروژه را از یک فریمورک ربات، به بستری کامل برای توسعه سرویسها، کلاینتها و اپلیکیشنهای مبتنی بر تلگرام تبدیل میکند.
📚 مستندات کامل: https://laraxgram.github.io
⭐️ اگر LaraGram برای شما مفید است، خوشحال میشویم با معرفی پروژه و دادن Star در GitHub از توسعه آن حمایت کنید:
🔹 گیتهاب LaraGram
🔹 گیتهاب MTProto
🔹 گیتهاب Luna
👍1
💠 نسخه جدید کتابخانه GrammY منتشر شده است
🔸 ارتقا از نسخه 1.44.0 به 1.45.1
🔖 #grammy, #js, #bot, #release
💎 @DevelopixRobot
🔸 ارتقا از نسخه 1.44.0 به 1.45.1
🔖 #grammy, #js, #bot, #release
💎 @DevelopixRobot
👍1