TGViewer
| کانال ربات تلگرام | | کانال ربات تلگرام | @developixrobot · 1.24K subscribers
Post #35 880
‏Idempotency در Webhook ربات تلگرام چیه؟ 🔁

یکی از مشکل‌های رایج تو ربات‌های تلگرام اینه که یه آپدیت چند بار پردازش می‌شه؛ مخصوصاً وقتی:

• سرور 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
More from @developixrobot
  1. Sep 18, 2026🔥 پروژه: پچ‌رایت؛ Playwright کم‌تر قابل‌ردیابی پچ‌رایت یک فورک از کتابخانهٔ Playwright بر…
  2. Sep 16, 2026🚀 ‏LaraGram Brain منتشر شد! از این به بعد برای ساخت ربات‌های تلگرام با فریم‌ورک LaraG…
  3. Sep 1, 2026خیلی وقت‌ها ربات لینک می‌فرستد، اما پیش‌نمایش بزرگ صفحه کل کل چت را شلوغ می‌کند 😅 مخصوصاً…
  4. Aug 27, 2026💠 نسخه جدید کتابخانه GrammY منتشر شده است 🔸 ارتقا از نسخه 1.45.1 به 1.46.0 🔖 #grammy, #…
  5. Aug 26, 2026💠 نسخه جدید کتابخانه آیوگرام (Aiogram) منتشر شده است 🔸 ارتقا از نسخه 3.30.0 به 3.31.0 🔖…
  6. Aug 24, 2026🔥 پروژه: ‏TikTok Live Connector برای ربات‌ها کتابخانه Node.js ‏TikTok Live Connec…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →