مستندات Bot API چاپار
با Bot API چاپار میتوانید ربات بسازید که در گفتگوهای خصوصی و گروهها پیام بفرستد، به کلیک کاربران واکنش نشان دهد و پیامهایش را ویرایش یا حذف کند.
📌 معرفی
هر ربات یک حساب کاربری معمولی در چاپار است (با نشان «ربات») که از طریق یک توکن API کنترل میشود. کاربران میتوانند به ربات پیام خصوصی بدهند یا آن را به گروهها اضافه کنند؛ سرورِ شما با توکن، پیامها را دریافت و پاسخ میدهد.
برای ساخت ربات، از داخل چاپار گفتگوی خصوصی با
@botfather را باز کنید و دستور /newbot را بفرستید.
سایر دستورهای مفید: /mybots ، /token ، /revoke ، /deletebot.
🚀 شروع سریع
آدرس پایه
https://web.chaapar.ir/bot<token>/<method>
کافی است توکن ربات خود را جای <token> و نام متد را جای
<method> بگذارید؛ مثال:
…/bot12345:ABC…/sendMessage
ارسال درخواست
- همهٔ متدها با GET یا POST فراخوانی میشوند.
- پارامترها بهصورت
form-data، query string یا بدنهٔ JSON قابل ارسالاند. - بهجای قرار دادن توکن در مسیر، میتوانید آن را در هدر بفرستید:
Authorization: Bearer <token>
قالب پاسخ
// موفق
{"ok": true, "result": ...}
// خطا (+ کد HTTP مناسب)
{"ok": false, "error_code": 401, "description": "Invalid bot token"}
getMe
اطلاعات خودِ ربات را برمیگرداند. برای تست صحت توکن مناسب است.
GET /bot<token>/getMe{"ok":true,"result":{"id":3657999999999999,"username":"myshop_bot","name":"ربات فروشگاه"}}
sendMessage
ارسال پیام متنی. یکی از user_id یا chat_id الزامی است.
| پارامتر | نوع | الزام | توضیح |
|---|---|---|---|
text | String | بله | متن پیام — حداکثر ۴۰۰۰ نویسه |
chat_id | Integer | یکی | شناسهٔ گروه/کانالی که ربات عضو آن است |
user_id | Integer | یکی | شناسهٔ کاربر برای گفتگوی خصوصی؛ اگر گفتگو وجود نداشته باشد ساخته میشود |
reply_to | Integer | خیر | شناسهٔ پیام مورد پاسخ |
reply_markup | JSON String | خیر | دکمههای شیشهای — بخش مربوطه |
POST /bot<token>/sendMessage
chat_id=123&text=سفارش ثبت شد
{"ok":true,"result":{"message_id":3658000000000000,"chat_id":123}}
editMessage
ویرایش متن پیامهایی که خودِ ربات فرستاده است.
POST /bot<token>/editMessage| پارامتر | نوع | الزام | توضیح |
|---|---|---|---|
chat_id | Integer | بله | شناسهٔ گفتگوی پیام |
message_id | Integer | بله | شناسهٔ پیام مورد ویرایش |
text | String | بله | متن جدید — حداکثر ۴۰۰۰ نویسه |
reply_markup | JSON String | خیر | در صورت ارسال، دکمههای شیشهای پیام هم جایگزین میشوند |
{"ok":true,"result":{"message_id":3658000000000000,"chat_id":123,"edited_at":"2026-08-24 12:00:00"}}
reply_markup جدید بفرستید.
deleteMessage
حذف پیام. ربات همیشه میتواند پیامهای خودش را حذف کند؛ حذف پیام دیگران فقط وقتی ممکن است که ربات در آن گروه مدیر یا ناظم باشد.
POST /bot<token>/deleteMessage| پارامتر | نوع | الزام | توضیح |
|---|---|---|---|
chat_id | Integer | بله | شناسهٔ گفتگوی پیام |
message_id | Integer | بله | شناسهٔ پیام مورد حذف |
{"ok":true,"result":{"message_id":3658000000000000,"chat_id":123,"deleted":true}}
getUpdates
دریافت پیامها و کلیک دکمهها با الگوی Long Polling. خروجی دو نوع update دارد:
message— پیام خصوصی کاربران یا پیام گروههایی که ربات عضوشدهcallback_query— کلیک روی دکمهٔ شیشهای (شاملfrom،message،data)
| پارامتر | پیشفرض | توضیح |
|---|---|---|
offset | ۰ | آخرین update_id پردازششده (برای هر دو نوع update) |
limit | ۵۰ | حداکثر تعداد آیتم (۱ تا ۱۰۰) |
timeout | ۰ | Long Polling — تا این تعداد ثانیه منتظر رویداد جدید میماند (حداکثر ۲۵) |
{"ok":true,"result":[
{"update_id": 3658000000000001,
"message": {"message_id": 3658000000000001,
"from": {"id": 5, "username": "aydin", "name": "Aydin"},
"chat": {"id": 3658000000000000, "type": "private", "title": "@aydin"},
"date": 1771000000, "text": "سلام",
"photo": null, "document": null, "document_name": null,
"location": null, "reply_to": 0}},
{"update_id": 3658000000000002,
"callback_query": {"id": "3658000000000002",
"from": {"id": 5, "username": "aydin", "name": "Aydin"},
"message": {"message_id": 3657999999999999,
"chat": {"id": 3658000000000000, "type": "private"}},
"data": "ok_12"}}
]}
- الگوی مصرف:
offset = update_id آخرین آیتم پردازششده + 1— پیام و callback یک شمارندهٔ مشترک دارند. - با
timeout=25نیازی به حلقهٔ فشرده نیست؛ callbackهای تأییدشده خودکار پاک میشوند.
⌨️ دکمههای شیشهای (Inline Keyboard)
با پارامتر reply_markup در sendMessage و editMessage میتوانید زیر پیام
دکمه اضافه کنید. هر دکمه یا لینک دارد (url) یا داده (callback_data)
که کلیک آن از طریق getUpdates به ربات میرسد:
{"inline_keyboard": [
[{"text": "تأیید سفارش", "callback_data": "ok_12"},
{"text": "وبسایت ما", "url": "https://example.com"}],
[{"text": "رد سفارش", "callback_data": "no_12"}]
]}
- حداکثر ۸ ردیف، هر ردیف ۸ دکمه.
- متن هر دکمه تا ۶۴ نویسه؛
callback_dataتا ۶۴ بایت. - هر دکمه باید دقیقاً یکی از
urlیاcallback_dataرا داشته باشد. - روی هر دکمه هر کاربر چند بار قابل کلیک است؛ تپ تکراری همان کاربر روی همان دکمه صف اضافی نمیسازد.
⚠️ کدهای خطا
| کد | معنا |
|---|---|
| 400 | پارامتر نامعتبر یا کمبود پارامتر الزامی |
| 401 | توکن نامعتبر است یا ربات غیرفعال/مسدود شده |
| 403 | ربات مجوز عملیات را ندارد (عدم عضویت در گفتگو، نبود نقش مدیر و…) |
| 404 | کاربر، گفتگو یا پیام مورد نظر پیدا نشد |
| 503 | سرویس رباتها موقتاً غیرفعال است |
🐍 نمونهٔ کامل ربات (Python)
import time, requests
TOKEN = "3658...:abcd1234..."
API = f"https://web.chaapar.ir/bot{TOKEN}"
offset = 0
while True:
updates = requests.post(f"{API}/getUpdates",
data={"offset": offset, "timeout": 25}, timeout=30).json()
for upd in updates.get("result", []):
offset = upd["update_id"] + 1 # مهم: جلو بردن اشارهگر
if "message" in upd:
msg = upd["message"]
if msg["text"].startswith("/start"):
requests.post(f"{API}/sendMessage", data={
"chat_id": msg["chat"]["id"],
"text": "به ربات فروشگاه خوش آمدید!",
"reply_markup": '{"inline_keyboard":[[{"text":"محصولات","url":"https://example.com"},{"text":"پشتیبانی","callback_data":"support"}]]}',
})
elif "callback_query" in upd:
cb = upd["callback_query"]
if cb["data"] == "support":
requests.post(f"{API}/sendMessage", data={
"chat_id": cb["message"]["chat"]["id"],
"text": "تیم پشتیبانی خبرتان میکند.",
})
if not updates.get("result"):
time.sleep(0.5)
🔐 نکات امنیتی
- توکن معادل گذرواژهٔ ربات است؛ هر کس آن را داشته باشد میتواند بهجای ربات پیام بفرستد.
- اگر توکن لو رفت، فوراً از باتفادر با
/revokeتوکن جدید بگیرید. - در سمت سرور، توکن را در متغیر محیطی نگه دارید — نه داخل کد یا مخزن.
- پیامهای چاپار رمزنگاری چندلایه دارند؛ رمزگشایی فقط روی سرور انجام میشود و کلاینت شما متن رمزگشاییشده را دریافت میکند.