تطوير البوتات
مرجع Bot API
جمعنا هنا كل الطرق التي تقبلها واجهة HTTP Bot API في Pabal، والكائنات التي تتبادلها، والأخطاء، دون استثناء. وهي متوافقة مع Bot API الخاصة بـ Telegram.
تستخدم واجهة HTTP Bot API في Pabal صيغة العناوين والطلبات والاستجابات والأخطاء نفسها المستخدمة في Telegram Bot API. ولا يذكر هذا المستند إلا ما يقبله Pabal فعلاً، والطرق غير المذكورة هنا تعيد 404 Not Found: method not found. وإن كانت هذه أول مرة لك، فابدأ بـدرس إنشاء بوت.
إرسال الطلبات
https://pabal.me/bot<token>/<method>
- فعل HTTP: يعمل
GETوPOSTكلاهما. - المعاملات تُرسل بإحدى أربع طرق — سلسلة الاستعلام (
?chat_id=1&text=hi)، وapplication/x-www-form-urlencoded، وapplication/json، وmultipart/form-dataعند رفع الملفات. ويمكنك المزج بينها. - المعاملات التي هي كائنات (
reply_markup،commands،allowed_updates) تُمرَّر كما هي كائناتٍ ومصفوفاتٍ في جسم JSON، وكسلسلة JSON في النموذج أو سلسلة الاستعلام. - أسماء الطرق لا تميّز بين الأحرف الكبيرة والصغيرة (
sendMessage=sendmessage). - حجم الجسم حتى 12MB (وإذا تجاوزه فالنتيجة
413). - تنزيل الملفات له عنوان منفصل:
https://pabal.me/file/bot<token>/<file_path>(getFile).
الاستجابات والأخطاء
الاستجابة دائماً بصيغة JSON. عند النجاح تصل HTTP 200 مع result، وعند الفشل تصل حالة HTTP المعنية مع error_code مطابق لها، وdescription يقرؤه البشر.
{"ok": true, "result": { … }}{"ok": false, "error_code": 400, "description": "Bad Request: chat not found"}| error_code | متى | أمثلة على description |
|---|---|---|
400 | المعاملات خاطئة | Bad Request: chat not found، Bad Request: message text is empty، Bad Request: message is not modified: …، Bad Request: message to edit not found، Bad Request: wrong file identifier/HTTP URL specified، Bad Request: query is too old and response timeout expired or query ID is invalid |
401 | الرمز المميّز خاطئ | Unauthorized |
403 | لا صلاحية للإرسال | Forbidden: bot can't initiate conversation with a user، Forbidden: bot is not a member of the group chat |
404 | طريقة أو ملف غير موجود | Not Found: method not found |
409 | استدعاء getUpdates مع وجود webhook | Conflict: can't use getUpdates method while webhook is active; use deleteWebhook to delete the webhook first |
413 | الجسم يتجاوز 12MB | Request Entity Too Large |
500 | خطأ داخلي في الخادم | Internal Server Error |
لا يفرض Pabal حالياً حداً لمعدل الطلبات كلها، لكن لطرق الصوت حدوداً في الساعة، فقد يصلك 429 Too Many Requests: retry after N (المكالمات الصوتية). اكتب شيفرتك بحيث إذا استلمت 429 انتظرت parameters.retry_after ثانية ثم أعادت الإرسال.
استلام التحديثات
استخدم إحدى الطريقتين، إذ لا يمكن استخدامهما معاً.
getUpdates
POST/bot<token>/getUpdates
تجلب التحديثات المنتظرة (الاستطلاع الطويل). وإذا كان webhook مضبوطاً فالنتيجة 409.
| المعامل | النوع | إلزامي | الوصف |
|---|---|---|---|
offset | Integer | اختياري | التحديثات التي رقمها يساوي هذا الرقم أو يزيد عليه فقط. وما هو أصغر منه يُحذف باعتباره «مُستلَماً». مرّر update_id + 1 لآخر تحديث عالجته. |
limit | Integer | اختياري | من 1 إلى 100، والافتراضي 100 |
timeout | Integer | اختياري | عدد ثواني الانتظار، من 0 إلى 50، والافتراضي 0. ننصح بقيمة بين 25 و30. |
allowed_updates | Array of String | اختياري | الأنواع المراد استلامها (Update). إذا تُركت فارغة فكل الأنواع الافتراضية (message، edited_message، callback_query). أما أنواع الصوت فـلا تصل إلا إذا كتبت أسماءها. وتُحفظ القائمة التي تمرّرها إعداداً للبوت وتُستخدم في الاستدعاءات التالية وفي webhook أيضاً (وإذا لم تمرّرها تبقى القيمة السابقة كما هي) |
القيمة المعادة: Array of Update
setWebhook
POST/bot<token>/setWebhook
لاستلام التحديثات على عنوان HTTPS. والشرح المفصّل في مستند Webhook.
| المعامل | النوع | إلزامي | الوصف |
|---|---|---|---|
url | String | نعم | عنوان https:// عام. والسلسلة الفارغة تحذف webhook |
secret_token | String | اختياري | من 1 إلى 256 حرفاً، A-Z a-z 0-9 _ -. يُرسل في ترويسة الطلب X-Telegram-Bot-Api-Secret-Token |
allowed_updates | Array of String | اختياري | من بين message، edited_message، callback_query. إذا تُركت فارغة فهذه الثلاثة كلها. أما أنواع الصوت (voice_call، voice_call_tool_query، voice_call_transcript) فلا تصل إلا إذا كتبت أسماءها. وإذا لم تمرّرها تبقى القيمة السابقة كما هي |
drop_pending_updates | Boolean | اختياري | إهمال التحديثات المنتظرة |
max_connections | Integer | اختياري | من 1 إلى 100، والافتراضي 40. تُحفظ فقط، والتسليم تحديث واحد في كل مرة لكل بوت |
certificate | InputFile | غير مدعوم | 400 — استخدم شهادة عامة |
ip_address | String | يُتجاهل |
القيمة المعادة: True
deleteWebhook
POST/bot<token>/deleteWebhook
تحذف webhook وتعود إلى getUpdates. وتنجح حتى لو لم يكن هناك webhook.
| المعامل | النوع | إلزامي | الوصف |
|---|---|---|---|
drop_pending_updates | Boolean | اختياري | إهمال التحديثات المنتظرة |
القيمة المعادة: True
getWebhookInfo
GET/bot<token>/getWebhookInfo
حالة webhook. بلا معاملات. وإذا لم يكن هناك webhook فإن url سلسلة فارغة.
القيمة المعادة: WebhookInfo
الطرق
chat_id
في المحادثة الفردية معرّف الشخص (عدد موجب)، وفي المجموعة العادية معرّف المجموعة (عدد سالب)، أو اسم مستخدم الشخص ("@hana_lee"). ويمكن معرفة كل ذلك من chat.id في التحديث. أما معرّفات القنوات والمجموعات الخارقة (-100…) فغير موجودة بعد (400 chat not found).
getMe
GET/bot<token>/getMe
تُستخدم للتحقق من صحة الرمز المميّز. بلا معاملات.
القيمة المعادة: User — ويُضاف للبوت can_join_groups (true)، وcan_read_all_group_messages (true)، وsupports_inline_queries (false)، وcan_connect_to_business (false)، وhas_main_web_app (false).
sendMessage
POST/bot<token>/sendMessage
| المعامل | النوع | إلزامي | الوصف |
|---|---|---|---|
chat_id | Integer أو String | نعم | المحادثة المرسل إليها (انظر المربع أعلاه) |
text | String | نعم | من 1 إلى 4,096 حرفاً. يُرسل النص كما هو |
reply_markup | InlineKeyboardMarkup · ReplyKeyboardMarkup · ReplyKeyboardRemove · ForceReply | اختياري | الأزرار |
disable_notification | Boolean | اختياري | الإرسال دون صوت |
parse_mode، entities، reply_parameters، link_preview_options … | يُتجاهل | تُقبل لكنها لا تُستخدم. ولا يُطبّق أي تنسيق |
القيمة المعادة: الرسالة المرسلة Message
للإرسال إلى شخص يجب أن يكون هو من بدأ المحادثة مع البوت (403 Forbidden: bot can't initiate conversation with a user). وللإرسال إلى مجموعة يجب أن يكون البوت عضواً فيها.
sendPhoto
POST/bot<token>/sendPhoto
| المعامل | النوع | إلزامي | الوصف |
|---|---|---|---|
chat_id | Integer أو String | نعم | المحادثة المرسل إليها |
photo | InputFile أو String | نعم | ملف مرفوع بصيغة multipart/form-data (حتى 10MB، بصيغ JPEG وPNG وGIF)، أو file_id لصورة استلمتها من قبل. عناوين URL غير مدعومة بعد |
caption | String | اختياري | من 0 إلى 1,024 حرفاً |
reply_markup | مثل sendMessage | اختياري | |
disable_notification | Boolean | اختياري |
القيمة المعادة: الرسالة المرسلة Message (مع file_id جديد في photo)
sendDocument
POST/bot<token>/sendDocument
| المعامل | النوع | إلزامي | الوصف |
|---|---|---|---|
chat_id | Integer أو String | نعم | المحادثة المرسل إليها |
document | InputFile أو String | نعم | ملف مرفوع بصيغة multipart/form-data (بلا قيد على الصيغة، وحتى 20MB)، أو file_id لملف استلمته من قبل. عناوين URL غير مدعومة بعد |
filename | String | اختياري | الاسم الذي يظهر للجهة المستلِمة. وإن لم تحدّده استُخدم اسم الملف المرفوع |
caption | String | اختياري | من 0 إلى 1,024 حرفاً |
reply_markup | مثل sendMessage | اختياري | |
disable_notification | Boolean | اختياري | |
thumbnail، disable_content_type_detection | يُتجاهل | تُقبل لكنها لا تُستخدم |
القيمة المعادة: الرسالة المرسلة Message (مع file_id جديد في document)
يُستنتج النوع (mime_type) من امتداد اسم الملف. والملفات المرسلة من جهة التطبيق تصل إلى 2GB، أما ما يرفعه البوت أو ينزّله عبر HTTP فحدّه 20MB كما في Telegram.
sendLocation
POST/bot<token>/sendLocation
| المعامل | النوع | إلزامي | الوصف |
|---|---|---|---|
chat_id | Integer أو String | نعم | المحادثة المرسل إليها |
latitude، longitude | Float | نعم | خط العرض (من −90 إلى 90) وخط الطول (من −180 إلى 180). وما يخرج عن النطاق يعطي 400 Bad Request: GEO_POINT_INVALID |
horizontal_accuracy | Float | اختياري | نصف قطر عدم الدقة بالأمتار، من 0 إلى 1,500. يُقرَّب إلى عدد صحيح عند الحفظ |
live_period | Integer | اختياري | يجعله موقعاً مباشراً: من 60 إلى 86,400 ثانية، أو 2147483647 (0x7FFFFFFF) حتى الإيقاف. وأي قيمة أخرى تعطي 400 Bad Request: wrong live_period |
heading | Integer | اختياري | اتجاه حركة الموقع المباشر، من 1 إلى 360 درجة |
proximity_alert_radius | Integer | اختياري | نصف قطر تنبيه الاقتراب للموقع المباشر، بالأمتار. يُحفظ ويُعرض، لكن لا يُرسَل أي تنبيه بعد |
reply_markup | مثل sendMessage | اختياري | |
disable_notification | Boolean | اختياري |
القيمة المعادة: الرسالة المرسلة Message (مع Location في location)
sendVenue
POST/bot<token>/sendVenue
| المعامل | النوع | إلزامي | الوصف |
|---|---|---|---|
chat_id | Integer أو String | نعم | المحادثة المرسل إليها |
latitude، longitude | Float | نعم | موضع المكان (كما في sendLocation) |
title | String | نعم | اسم المكان |
address | String | نعم | العنوان |
foursquare_id، foursquare_type | String | اختياري | معرّف المكان ونوعه في Foursquare، يُمرَّران كما وصلا |
google_place_id، google_place_type | String | اختياري | معرّف المكان ونوعه في Google. لا يُستخدمان إلا إذا لم يوجد foursquare_id |
reply_markup | مثل sendMessage | اختياري | |
disable_notification | Boolean | اختياري |
القيمة المعادة: الرسالة المرسلة Message (مع Venue في venue، والنقطة نفسها في location)
بدون title أو address تكون النتيجة 400 Bad Request: title and address are required.
sendContact
POST/bot<token>/sendContact
| المعامل | النوع | إلزامي | الوصف |
|---|---|---|---|
chat_id | Integer أو String | نعم | المحادثة المرسل إليها |
phone_number | String | نعم | رقم الهاتف، يُمرَّر كما كُتب |
first_name | String | نعم | الاسم الأول |
last_name | String | اختياري | اسم العائلة |
vcard | String | اختياري | بيانات إضافية بصيغة vCard، حتى 64KB |
reply_markup | مثل sendMessage | اختياري | |
disable_notification | Boolean | اختياري |
القيمة المعادة: الرسالة المرسلة Message (مع Contact في contact)
بطاقة جهة الاتصال التي يرسلها بوت لا تحمل user_id أبداً، حتى لو كان الرقم لحساب في Pabal — فالبوت ليست له جهات اتصال، ولو مُلئ هذا الحقل لاستطاع البوت أن يعرف صاحب أي رقم بإرسال بطاقة لكل رقم. وبدون phone_number أو first_name تكون النتيجة 400 Bad Request: phone_number and first_name are required.
editMessageLiveLocation
POST/bot<token>/editMessageLiveLocation
| المعامل | النوع | إلزامي | الوصف |
|---|---|---|---|
chat_id | Integer أو String | نعم | المحادثة التي فيها الرسالة |
message_id | Integer | نعم | الموقع المباشر المراد تحديثه (مما أرسله البوت) |
latitude، longitude | Float | نعم | الموضع الجديد |
horizontal_accuracy | Float | اختياري | نصف قطر عدم الدقة بالأمتار، من 0 إلى 1,500 |
heading | Integer | اختياري | اتجاه الحركة، من 1 إلى 360 درجة |
proximity_alert_radius | Integer | اختياري | نصف قطر تنبيه الاقتراب بالأمتار. والقيمة 0 تُطفئه |
live_period | Integer | اختياري | مدة المشاركة الجديدة، بالثواني محسوبةً من وقت إرسال الرسالة. لا يمكن تمديدها بأكثر من يوم فوق المدة الحالية، و2147483647 تعني حتى الإيقاف |
reply_markup | InlineKeyboardMarkup | اختياري | الأزرار الجديدة |
inline_message_id | String | غير مدعوم | 400 لعدم وجود الوضع المضمّن (inline) |
القيمة المعادة: الرسالة المعدّلة Message
الموقع المباشر الذي انتهى بالفعل — بإيقافه أو بانقضاء مدته — لا يمكن تحديث موضعه ولا إحياؤه بتمديد مدته (400 Bad Request: message can't be edited). والأمر نفسه للرسالة التي ليست موقعاً مباشراً.
الحركة التي تأتي بعد أقل من 10 ثوانٍ من آخر حركة طُبِّقت، أو التي تقل عن 10 أمتار، يتجاوزها الخادم دون حفظها. أما الإيقاف وتغيير المدة أو نصف قطر التنبيه فتُطبَّق دائماً. وعند تجاوز حركة ما، تُظهر الرسالة Message المعادة آخر موضع طُبِّق، لذا لا بأس بإرسال حركة كل بضع ثوانٍ.
stopMessageLiveLocation
POST/bot<token>/stopMessageLiveLocation
المعاملات: chat_id، وmessage_id، وreply_markup (اختياري). يوقف الموقع المباشر عند آخر موضع له. تُختصر مدة المشاركة إلى الوقت الذي مضى فعلاً، فتعرضه كل التطبيقات موقعاً منتهياً. وإذا كان قد أُوقف أو انتهى من قبل فالنتيجة 400 Bad Request: message is not modified: …. القيمة المعادة: الرسالة المعدّلة Message.
editMessageText
POST/bot<token>/editMessageText
| المعامل | النوع | إلزامي | الوصف |
|---|---|---|---|
chat_id | Integer أو String | نعم | المحادثة التي فيها الرسالة |
message_id | Integer | نعم | الرسالة المراد تعديلها (مما أرسله البوت) |
text | String | نعم | النص الجديد، من 1 إلى 4,096 حرفاً |
reply_markup | InlineKeyboardMarkup | اختياري | الأزرار الجديدة. إذا حذفته تختفي الأزرار (كما في Telegram) |
inline_message_id | String | غير مدعوم | 400 لعدم وجود الوضع المضمّن (inline) |
القيمة المعادة: الرسالة المعدّلة Message. ينعكس التعديل فوراً في التطبيق، والرسائل التي يعدّلها الأشخاص تصل إلى البوت على شكل edited_message.
إذا كان النص والأزرار مطابقين لما سبق فالنتيجة 400 Bad Request: message is not modified: …، وإذا حاولت تعديل رسالة غيرك فالنتيجة 400 Bad Request: message can't be edited.
editMessageCaption
POST/bot<token>/editMessageCaption
المعاملات: chat_id، وmessage_id، وcaption (من 0 إلى 1,024 حرفاً، وحذفه يمسح الوصف)، وreply_markup. القيمة المعادة: الرسالة المعدّلة Message.
editMessageReplyMarkup
POST/bot<token>/editMessageReplyMarkup
تُبقي النص كما هو وتغيّر الأزرار فقط. المعاملات: chat_id، وmessage_id، وreply_markup (حذفه يمسح الأزرار). القيمة المعادة: الرسالة المعدّلة Message.
deleteMessage
POST/bot<token>/deleteMessage
المعاملات: chat_id، وmessage_id. تحذف الرسالة من طرفي المحادثة. وإذا لم تكن الرسالة موجودة فالنتيجة 400 Bad Request: message to delete not found. القيمة المعادة: True.
answerCallbackQuery
POST/bot<token>/answerCallbackQuery
ترد على زر ضغطه شخص (CallbackQuery). ويمكنك الرد خلال 10 ثوانٍ ومرة واحدة فقط.
| المعامل | النوع | إلزامي | الوصف |
|---|---|---|---|
callback_query_id | String | نعم | قيمة callback_query.id من التحديث |
text | String | اختياري | نص يظهر لحظات أعلى الشاشة |
show_alert | Boolean | اختياري | إذا كانت true يظهر النص في نافذة فيها زر تأكيد |
url | String | اختياري | عنوان يفتحه التطبيق |
cache_time | Integer | اختياري | عدد الثواني التي يتذكر فيها التطبيق هذا الرد |
القيمة المعادة: True. وإذا تأخرت كثيراً أو كنت قد رددت من قبل فالنتيجة 400 Bad Request: query is too old and response timeout expired or query ID is invalid.
sendChatAction
POST/bot<token>/sendChatAction
تُقبل للتوافق وتعيد True، لكنها لا تُظهر بعدُ «يكتب الآن…» في التطبيق.
getChat
GET/bot<token>/getChat?chat_id=…
المعامل: chat_id (رقم). إذا كان شخصاً فذلك الشخص، وإذا كانت مجموعة فلا يشمل إلا المجموعات التي البوت عضو فيها. القيمة المعادة: Chat. وإذا لم تكن موجودة أو لم يكن مسموحاً برؤيتها فالنتيجة 400 Bad Request: chat not found.
getFile
GET/bot<token>/getFile?file_id=…
تحصل بواسطة file_id لصورة مستلمة على مسار تنزيلها. القيمة المعادة: File. ثم تنزّلها من هذا العنوان.
https://pabal.me/file/bot<token>/<file_path>
وfile_id هو أيضاً إذن بالحصول على تلك الصورة. وإذا كانت القيمة خاطئة فالنتيجة 400 Bad Request: wrong file identifier/HTTP URL specified.
setMyCommands
POST/bot<token>/setMyCommands
| المعامل | النوع | إلزامي | الوصف |
|---|---|---|---|
commands | Array of BotCommand | نعم | 100 أمر كحد أقصى |
language_code | String | اختياري | تُحفظ كقائمة خاصة بتلك اللغة. والتطبيق لا يعرض حالياً إلا القائمة الافتراضية التي لا رمز لغة لها |
scope | BotCommandScope | يُتجاهل |
القيمة المعادة: True. وإذا خالفت القائمة القواعد فلا يُحفظ شيء: 400 Bad Request: BOT_COMMAND_INVALID (أمر)، BOT_COMMAND_DESCRIPTION_INVALID (وصف فارغ أو يتجاوز 256 حرفاً)، BOT_COMMANDS_TOO_MUCH (أكثر من 100).
getMyCommands
GET/bot<token>/getMyCommands
المعامل: language_code (اختياري). القيمة المعادة: Array of BotCommand.
deleteMyCommands
POST/bot<token>/deleteMyCommands
المعامل: language_code (اختياري). تُفرغ تلك القائمة. القيمة المعادة: True.
logOut · close
في Telegram تُستخدم هاتان الطريقتان عند الانتقال إلى خادم Bot API محلي. وبما أنه لا يوجد في Pabal مكان يُنتقل إليه، فهما تُقبلان فقط وتعيدان True. ولإبطال الرمز المميّز استخدم الأمر /revoke لدى BotFather.
الكائنات
تعني اختياري بجانب الحقل أنه قد لا يكون موجوداً. أما حقول Telegram الأخرى غير المذكورة هنا فلا يرسلها Pabal.
Update
تحديث جديد واحد. يحتوي على update_id وواحد من الحقول أدناه.
| الحقل | النوع | الوصف |
|---|---|---|
update_id | Integer | رقم يزيد بمقدار 1. يُستخدم في offset الخاص بـ getUpdates |
message اختياري | Message | رسالة جديدة إلى البوت (محادثة فردية، أو كل الرسائل في مجموعة البوت عضو فيها) |
edited_message اختياري | Message | رسالة عُدّلت |
callback_query اختياري | CallbackQuery | ضغط زر مضمّن |
voice_call اختياري | VoiceCall | بداية مكالمة إلى بوت صوتي أو مكالمة أجراها ونهايتها (لا يصل إلا إذا طُلب بالاسم) |
voice_call_tool_query اختياري | VoiceCallToolQuery | أداة من أدوات البوت استدعاها النموذج أثناء المكالمة (لا يصل إلا إذا طُلب بالاسم) |
voice_call_transcript اختياري | VoiceCallTranscript | دور واحد من نص المحادثة أثناء المكالمة (لا يصل إلا إذا طُلب بالاسم) |
User
| الحقل | النوع | الوصف |
|---|---|---|
id | Integer | معرّف المستخدم (لا معنى له إلا داخل هذا الخادم) |
is_bot | Boolean | true إذا كان بوتاً |
first_name | String | الاسم. وللحسابات المحذوفة Deleted Account |
last_name اختياري | String | اسم العائلة |
username اختياري | String | اسم المستخدم (دون @) |
Chat
| الحقل | النوع | الوصف |
|---|---|---|
id | Integer | للشخص معرّفه (عدد موجب)، وللمجموعة العادية عدد سالب |
type | String | private أو group |
title اختياري | String | اسم المجموعة (group) |
first_name، last_name، username اختياري | String | اسم الطرف الآخر واسم المستخدم الخاص به (private) |
Message
| الحقل | النوع | الوصف |
|---|---|---|
message_id | Integer | رقم الرسالة داخل هذه المحادثة |
from اختياري | User | المرسل |
chat | Chat | المحادثة التي فيها الرسالة |
date | Integer | وقت الإرسال (بتوقيت يونكس بالثواني) |
edit_date اختياري | Integer | وقت آخر تعديل |
text اختياري | String | النص (موجود دائماً ما لم تكن رسالة صورة أو ملف أو موقع أو مكان أو جهة اتصال) |
entities اختياري | Array of MessageEntity | الأوامر والإشارات وعناوين URL والوسوم داخل النص |
photo اختياري | Array of PhotoSize | الصورة (في Pabal عنصر واحد هو الأصل) |
document اختياري | Document | الملف |
location اختياري | Location | موقع أو موقع مباشر. ورسالة المكان تحمل موقعها هنا أيضاً |
venue اختياري | Venue | المكان |
contact اختياري | Contact | بطاقة جهة الاتصال |
caption اختياري | String | وصف الصورة |
caption_entities اختياري | Array of MessageEntity | الأوامر والإشارات وعناوين URL والوسوم داخل الوصف |
reply_markup اختياري | InlineKeyboardMarkup | الأزرار المضمّنة المرفقة بالرسالة |
MessageEntity
| الحقل | النوع | الوصف |
|---|---|---|
type | String | bot_command، mention، url، hashtag |
offset | Integer | موضع البداية (بوحدات ترميز UTF-16) |
length | Integer | الطول (بوحدات ترميز UTF-16) |
يستخرجها الخادم من النص تلقائياً ويضيفها. أما كيانات التنسيق مثل الغامق والمائل فغير موجودة بعد.
PhotoSize
| الحقل | النوع | الوصف |
|---|---|---|
file_id | String | المعرّف المستخدم للتنزيل (getFile) ولإعادة الإرسال (sendPhoto) |
file_unique_id | String | القيمة نفسها للصورة نفسها حتى لو اختلف البوت. ولا يصلح للتنزيل |
width، height | Integer | الأبعاد بالبكسل |
file_size | Integer | بالبايت |
Document
| الحقل | النوع | الوصف |
|---|---|---|
file_id | String | المعرّف المستخدم للتنزيل (getFile) ولإعادة الإرسال (sendDocument) |
file_unique_id | String | القيمة نفسها للملف نفسه حتى لو اختلف البوت. ولا يصلح للتنزيل |
file_name | String | الاسم الذي أعطته الجهة المرسِلة |
mime_type | String | النوع الذي ذكرته الجهة المرسِلة |
file_size | Integer | بالبايت |
Location
| الحقل | النوع | الوصف |
|---|---|---|
latitude، longitude | Float | خط العرض وخط الطول |
horizontal_accuracy اختياري | Float | نصف قطر عدم الدقة بالأمتار |
live_period اختياري | Integer | مدة مشاركة الموقع المباشر، بالثواني محسوبةً من وقت إرسال الرسالة. وعند الإيقاف تُختصر إلى الوقت الذي مضى فعلاً |
heading اختياري | Integer | اتجاه الحركة، من 1 إلى 360 درجة |
proximity_alert_radius اختياري | Integer | نصف قطر تنبيه الاقتراب بالأمتار |
الموقع المباشر الذي يشاركه شخص ما يصل من جديد على شكل edited_message في كل مرة يطبّق فيها الخادم حركة.
Venue
| الحقل | النوع | الوصف |
|---|---|---|
location | Location | موضع المكان |
title | String | اسم المكان |
address | String | العنوان |
foursquare_id، foursquare_type اختياري | String | معرّف المكان ونوعه في Foursquare |
google_place_id، google_place_type اختياري | String | معرّف المكان ونوعه في Google |
Contact
| الحقل | النوع | الوصف |
|---|---|---|
phone_number | String | الرقم كما كتبه المرسل |
first_name | String | الاسم الأول |
last_name اختياري | String | اسم العائلة |
user_id اختياري | Integer | حساب Pabal صاحب هذا الرقم. لا يظهر إلا إذا كان المرسل قد حفظ ذلك الشخص في جهات اتصاله، أو كان هو نفسه ذلك الشخص |
vcard اختياري | String | بيانات إضافية بصيغة vCard |
File
| الحقل | النوع | الوصف |
|---|---|---|
file_id، file_unique_id | String | مثل PhotoSize |
file_size | Integer | بالبايت |
file_path | String | بالشكل photos/<file_id>.jpg أو documents/<file_id>. أضِفه بعد /file/bot<token>/ لتنزيل الملف |
CallbackQuery
| الحقل | النوع | الوصف |
|---|---|---|
id | String | المعرّف الذي تمرّره إلى answerCallbackQuery |
from | User | الشخص الذي ضغط الزر |
message اختياري | Message | الرسالة المرفق بها الزر |
chat_instance | String | قيمة تمثّل تلك المحادثة |
data اختياري | String | قيمة callback_data الخاصة بالزر |
InlineKeyboardMarkup
inline_keyboard: Array of Array of InlineKeyboardButton — المصفوفة الخارجية هي الصفوف، والداخلية هي أزرار الصف الواحد. والحد الأقصى 100 صف و100 زر في الرسالة الواحدة.
InlineKeyboardButton
| الحقل | النوع | الوصف |
|---|---|---|
text | String | نص الزر |
callback_data أحدهما | String | القيمة التي تذهب إلى البوت عند الضغط، من 1 إلى 64 بايت |
url أحدهما | String | العنوان الذي يُفتح عند الضغط |
الأنواع الأخرى مثل switch_inline_query وweb_app وlogin_url وpay غير متاحة بعد (400).
ReplyKeyboardMarkup
| الحقل | النوع | الوصف |
|---|---|---|
keyboard | Array of Array of KeyboardButton | لوحة الأزرار أسفل حقل الإدخال |
resize_keyboard، one_time_keyboard، is_persistent، selective اختياري | Boolean | ملاءمة الحجم · الإخفاء بعد استخدام واحد · الظهور الدائم · لأشخاص محددين فقط |
input_field_placeholder اختياري | String | النص الإرشادي في حقل الإدخال |
KeyboardButton
سلسلة نصية واحدة، أو كائن فيه text والحقلان الاختياريان request_contact (إرسال جهة اتصالي) وrequest_location (إرسال موقعي، Boolean).
ReplyKeyboardRemove
{"remove_keyboard": true} — يُخفي لوحة الأزرار. وselective اختياري.
ForceReply
{"force_reply": true} — يفتح التطبيق حقل الإدخال في وضع الرد على هذه الرسالة. وselective وinput_field_placeholder اختياريان.
BotCommand
| الحقل | النوع | الوصف |
|---|---|---|
command | String | من 1 إلى 32 حرفاً من الأحرف اللاتينية الصغيرة والأرقام والشرطة السفلية (دون /) |
description | String | من 1 إلى 256 حرفاً |
WebhookInfo
| الحقل | النوع | الوصف |
|---|---|---|
url | String | عنوان webhook، أو سلسلة فارغة إن لم يوجد |
has_custom_certificate | Boolean | دائماً false |
pending_update_count | Integer | عدد التحديثات التي تنتظر التسليم |
ip_address اختياري | String | عنوان IP الذي أُرسل إليه آخر مرة |
last_error_date اختياري | Integer | وقت آخر فشل (بتوقيت يونكس بالثواني) |
last_error_message اختياري | String | سبب آخر فشل (القائمة) |
max_connections اختياري | Integer | القيمة التي مرّرتها إلى setWebhook |
allowed_updates اختياري | Array of String | القيمة التي مرّرتها إلى setWebhook |
المكالمات الصوتية
هذه طرق خاصة بـ Pabal وحده. البوت الصوتي بوت يرد فيه نموذج صوتي بالذكاء الاصطناعي عندما يتصل به شخص من التطبيق، وبهذه الطرق تضبط إعدادات ذلك النموذج وتتعامل مع المكالمات. وما يجب تفعيله وطريقة التفعيل والأمثلة في دليل البوتات الصوتية. والطرق موجودة حتى على الخوادم التي عُطّل فيها الصوت، فيمكنك قراءة الإعدادات، لكن إذا كان الصوت معطّلاً أو لم يسمح المشغّل للبوت بعد فلا يمكن تغيير أي إعداد سوى التعطيل والحذف (403 VOICE_NOT_AVAILABLE).
setVoiceCallSettings
POST/bot<token>/setVoiceCallSettings
تغيّر إعدادات الصوت للبوت. لا يتغيّر إلا ما أرسلته، ويُفحص الكل ثم يُكتب مرة واحدة أو يُرفض كله. ولكل بوت 30 مرة في الساعة (محسوبة مع @BotFather).
| المعامل | النوع | إلزامي | الوصف |
|---|---|---|---|
enabled | Boolean | اختياري | لا يمكن التفعيل إلا بعد الموافقة على قواعد البوتات الصوتية لدى @BotFather (403 VOICE_RULES_NOT_ACCEPTED). والتعطيل ممكن دائماً |
instructions | String | اختياري | تعليمات النموذج، حتى 8,192 بايت. و"" تعني الحذف (غير مسموح لبوت مفعّل في الوضع المُدار) |
greeting | String | اختياري | التحية الأولى، حتى 512 بايت. وإذا كانت "" يحيّي النموذج من تلقاء نفسه |
voice | String | اختياري | معرّف الصوت، الافتراضي kore (القائمة) |
language | String | اختياري | ko-KR (الافتراضي) · en-US · ja-JP · cmn-CN · fr-FR · es-US · id-ID · vi-VN · ar-EG (القائمة). ولا فرق بين الأحرف الكبيرة والصغيرة، ويُحفظ zh-CN على أنه cmn-CN. والبوت الذي ليست لغته الكورية أو الإنجليزية لا يستقبل المكالمات إلا بعد أن يقرأ المشغّل التعليمات والتحية ويسمح له |
max_call_duration | Integer | اختياري | بالثواني، من 60 إلى limits.max_call_duration |
max_concurrent_calls | Integer | اختياري | من 1 إلى limits.max_concurrent_calls |
tools | Array of VoiceCallTool | اختياري | أدوات البوت التي يستدعيها النموذج أثناء المكالمة: {"name", "description", "parameters"?, "timeout_ms"?}. والقواعد في تعريف الأدوات. وفي النموذج (form) تكون سلسلة JSON |
transcript | Boolean | اختياري | مفتاح تشغيل نص المحادثة. ولا يُفعَّل إلا بعد الموافقة على شروط مالكي البوتات |
mode | String | اختياري | managed (الوضع المُدار: نموذج الذكاء الاصطناعي في Pabal) أو stream (وضع الصوت الخام) |
stream_url، stream_secret | String | اختياري | مع mode=stream. ولا يُرسل السرّ إلا في جسم الطلب |
القيمة المعادة: True
getVoiceCallSettings
GET/bot<token>/getVoiceCallSettings
بلا معاملات. الإعدادات الحالية، وهل يستطيع البوت الآن استقبال المكالمات (available، unavailable_reason)، وحدود الخادم، وقوائم الأصوات واللغات، ووجهة استعلامات الأدوات ونص المحادثة، وحالة مفتاح المالك ووضع الصوت الخام وخوادم MCP. ولا تظهر المفاتيح والأسرار، بل بصماتها فقط. والحقول موضّحة في البوتات الصوتية — عرض الإعدادات الحالية.
القيمة المعادة: VoiceCallSettings (كائن)
endVoiceCall
POST/bot<token>/endVoiceCall
| المعامل | النوع | إلزامي | الوصف |
|---|---|---|---|
voice_call_id | String | نعم | voice_call.id |
farewell | Boolean | اختياري | الافتراضي true: يودّع النموذج بإيجاز ثم ينهي المكالمة (وإذا لم تنتهِ خلال 10 ثوانٍ ينهيها الخادم). وfalse تعني الإنهاء فوراً |
القيمة المعادة: True. وإذا لم تكن مكالمة جارية لهذا البوت فالنتيجة 400 VOICE_CALL_NOT_FOUND.
sendVoiceCallContext
POST/bot<token>/sendVoiceCallContext
| المعامل | النوع | إلزامي | الوصف |
|---|---|---|---|
voice_call_id | String | نعم | مكالمة جارية |
text | String | نعم | ملاحظة من مالك البوت إلى النموذج. حتى 2,000 حرف · 6,144 بايت، وتُفحص وفق قواعد المحتوى |
respond | Boolean | اختياري | الافتراضي false. وإذا كانت true يتفاعل النموذج فوراً |
القيمة المعادة: True. قبل الاتصال VOICE_CALL_NOT_ACTIVE، ولمكالمات الصوت الخام VOICE_CONTEXT_NOT_SUPPORTED، وللنص الطويل جداً VOICE_CONTEXT_TOO_LONG، وإذا تجاوزت 10 ملاحظات في الدقيقة للمكالمة الواحدة 429.
getVoiceCallUsage
GET/bot<token>/getVoiceCallUsage
| المعامل | النوع | إلزامي | الوصف |
|---|---|---|---|
period | String | اختياري | today (الافتراضي) أو month |
month | String | اختياري | YYYY-MM، ولا يُستخدم إلا مع period=month |
القيمة المعادة: period، from_date، to_date، calls، seconds، missed، refused (busy·budget·unavailable)، platform_seconds، own_key_seconds، remaining_seconds_today (bot·owner)، وoutbound (today·limits) لبوت فعّل الاتصال ولو مرة — وحدود الأيام وفق المنطقة الزمنية للخادم
startVoiceCall
POST/bot<token>/startVoiceCall
يتصل البوت بشخص. لا يستطيع ذلك إلا بوت فعّل مالكه الميزة في @BotFather وراجعه المشغّل، ولا يتصل إلا بمن أذِن لذلك البوت. والردود وطريقة فحص الطلبات في البوتات الصوتية — الاتصال.
| المعامل | النوع | إلزامي | الوصف |
|---|---|---|---|
user_id | Integer | نعم | الشخص المراد الاتصال به |
purpose | String | نعم | ما اختاره البوت من reminder، wake_up، delivery، appointment |
context | String | نعم | ما يعرفه النموذج وحده، حتى 1,000 حرف و3,072 بايت، ويُفحص بقواعد المحتوى |
max_duration | Integer | اختياري | أقصى مدة بعد الرد بالثواني، 30–300 (حتى الحد الأقصى للبوت). الافتراضي 180 |
ring_timeout | Integer | اختياري | ثواني الرنين، 30–45. الافتراضي 40 |
القيمة المعادة: {"voice_call_id": "…"} — تعني فقط أن الطلب استُلم؛ أما هل رنّ وهل ردّ أحد فيصل في تحديثات voice_call. والرفض: 403 VOICE_OUTBOUND_OFF: <reason>، و403 USER_UNAVAILABLE (المحتوى نفسه دائماً)، و429، و503 VOICE_UNAVAILABLE. ولا يمكن استدعاؤها من رد الـwebhook.
answerVoiceCallToolQuery
POST/bot<token>/answerVoiceCallToolQuery
| المعامل | النوع | إلزامي | الوصف |
|---|---|---|---|
tool_query_id | String | نعم | id الخاص بـ VoiceCallToolQuery |
result | String · Object · Array | أحدهما | نتيجة الأداة، حتى 16,384 بايت |
error | String | أحدهما | عبارة فشل من البوت، حتى 512 بايت |
القيمة المعادة: True. الرد الأول هو الأخير. وإذا تأخرت فالنتيجة 400 TOOL_QUERY_EXPIRED: answered|timeout|cancelled|call_ended|unreachable، وللمعرّف المجهول TOOL_QUERY_ID_INVALID، وإذا رُفض الرد TOOL_RESULT_EMPTY·TOOL_RESULT_INVALID·TOOL_RESULT_TOO_LONG·TOOL_ERROR_TOO_LONG·TOOL_RESULT_REFUSED: <code>. ويمكنك أيضاً الرد على POST استعلام الأداة الوارد عبر webhook في جسم الاستجابة.
setVoiceCallApiKey · deleteVoiceCallApiKey
POST/bot<token>/setVoiceCallApiKey
| المعامل | النوع | إلزامي | الوصف |
|---|---|---|---|
provider | String | نعم | google (مفتاح JSON لحساب خدمة Vertex AI) أو openai (sk-…) |
api_key | String | نعم | المفتاح. في جسم الطلب فقط (وفي سلسلة الاستعلام 400)، حتى 8KiB |
القيمة المعادة: True — ولا يُحفظ المفتاح إلا بعد اجتياز جلسة الاختبار في البوابة. API_KEY_INVALID، API_KEY_NO_REALTIME_ACCESS، 503 API_KEY_CHECK_UNAVAILABLE (لا يُحفظ)، 403 VOICE_OWN_KEY_NOT_AVAILABLE (هذا الخادم لا يقبل مفاتيح المالكين). وdeleteVoiceCallApiKey بلا معاملات ويعيد دائماً True. ولا يمكن استدعاء أيٍّ من الطريقتين عبر bots.sendCustomRequest، ولا يمكن استدعاء setVoiceCallApiKey عبر استجابة webhook أيضاً. والتفاصيل في مفتاح النموذج الخاص بالمالك.
طرق خوادم MCP
| الطريقة | المعاملات | القيمة المعادة |
|---|---|---|
setVoiceCallMcpServer | label، url، auth (كائن)، واختيارياً audience، allowed_tools، requested_level، timeout_ms، tools (تجاوز التصنيف)، declaration، auto_repin | نتيجة التسجيل (status، job_id). وإذا تغيّرت جهة الاستلام فالنتيجة 400 MCP_CHANGE_NEEDS_CONFIRMATION ثم التأكيد لدى @BotFather |
refreshVoiceCallMcpServer | label | إعادة الفحص (refreshing: true، job_id) |
deleteVoiceCallMcpServer | label | True — ممكن حتى إذا كان MCP معطّلاً |
getVoiceCallMcpBinding | لا يوجد | iss، sub (bot:<id>)، issuer_document، jwks_uri، audiences |
createVoiceCallMcpClientKey | label | jwk العام وthumbprint (المفتاح الخاص لا يغادر Pabal) |
تُرسل auth والأسرار في جسم الطلب فقط. وعلى خادم عُطّلت فيه MCP تكون النتيجة 403 VOICE_NOT_AVAILABLE: MCP tools are not available on this server. والتفاصيل في البوتات الصوتية — خوادم MCP.
لاستلام تحديثات الصوت
voice_call وvoice_call_tool_query وvoice_call_transcript لا تصل إلا إذا طُلبت بأسمائها — اكتبها في allowed_updates الخاصة بـ getUpdates أو setWebhook. ولا تصل بالقائمة الفارغة، وما يقع قبل طلبها لا يُحفظ. وتصل استعلامات الأدوات في طلب POST منفصل إذا كان هناك webhook، وإذا استدعيت getUpdates خلال آخر 15 ثانية فإنها تأتي في مقدمة getUpdates التالي.
VoiceCall
| الحقل | النوع | الوصف |
|---|---|---|
id | String | معرّف المكالمة (عدد عشري بلا إشارة) |
direction | String | incoming (مكالمة إلى البوت) أو outgoing (مكالمة أجراها البوت). موجود دائماً |
event | String | started، ended، missed، refused؛ ولمكالمة أجراها البوت started، ended، not_answered، failed |
from اختياري | User | للمكالمات إلى البوت فقط — المتصل: id، is_bot، first_name، last_name، language_code. ولا يتضمن اسم المستخدم ولا رقم الهاتف |
to اختياري | Object | للمكالمات التي أجراها البوت فقط — {"id": …}، معرّف المتلقّي وحده |
purpose اختياري | String | للمكالمات التي أجراها البوت فقط — غرض الطلب |
date | Integer | وقت الحدوث (بتوقيت يونكس بالثواني). في started هو وقت انتهاء تبادل المفاتيح لمكالمة التطبيق، ووقت اتصال صوت الساعة لمكالمة Apple Watch. ويتأخر ended حتى 10 ثوانٍ على الخادم الذي ينتظر نص المحادثة أو فُعّل فيه الاحتفاظ بالمحادثة. وفي المكالمات التي أجراها البوت يتأخر ended للمكالمة التي رُدّ عليها دائماً حتى 10 ثوانٍ أياً كانت إعدادات الخادم، لأن الخادم ينتظر استخدام البوابة |
max_duration اختياري | Integer | أقصى مدة لهذه المكالمة (بالثواني) — started، ended |
start_date، duration اختياري | Integer | وقت الاتصال وعدد ثوانيه (بساعة الخادم) — ended |
end_reason اختياري | String | caller (callee لمكالمة أجراها البوت)، bot، max_length، failed، operator، suspended — ended، missed |
refused_reason اختياري | String | busy، budget، unavailable — refused |
transcript اختياري | Object | {"turns": [{"role", "text", "offset_ms"}], "truncated"} — ended، عند تفعيل نص المحادثة. ولا يوجد أبداً في مكالمة أجراها البوت |
لا يوجد في VoiceCall حقل يبيّن هل اختار المتصل الاحتفاظ بالمحادثة. وهذا مقصود — فذلك النص ملك المتصل ولا يصل إلى البوت. لذا على الخادم الذي فُعّل فيه الاحتفاظ بالمحادثة ينتظر ended المدة نفسها في كل المكالمات غير الصوت الخام، ويكون رقم الرسالة التالية لسجل المكالمة أكبر من رقم السجل بـ 31 على الأقل في كل المكالمات (لأن الأرقام محجوزة مسبقاً).
VoiceCallToolQuery
| الحقل | النوع | الوصف |
|---|---|---|
id | String | المعرّف الذي تمرّره إلى answerVoiceCallToolQuery |
voice_call_id | String | معرّف المكالمة |
from | User | المتصل (الحقول نفسها كما في VoiceCall) |
name | String | اسم الأداة |
arguments | String | الوسائط، نصّ كائن JSON (فحصه الخادم) |
budget_ms | Integer | المهلة بالمللي ثانية، من لحظة الاستلام حتى الموعد الذي يجب أن يصل فيه الرد إلى الخادم |
VoiceCallTranscript
| الحقل | النوع | الوصف |
|---|---|---|
voice_call_id | String | معرّف المكالمة |
seq | Integer | رقم الدور |
role | String | caller أو bot |
text | String | النص الذي كتبه الذكاء الاصطناعي. وإذا احتوى على رقم بطاقة أو رقم هوية وطنية تُستبدل الأرقام بـ * |
is_final | Boolean | true دائماً |
offset_ms، date | Integer | المدة بالمللي ثانية منذ بدء صوت المكالمة، ووقت الحدوث |
لا يصل إلا عبر HTTP Bot API. والمكالمة كاملة في transcript الخاص بـ voice_call المنتهية.
وضع الصوت الخام (mode=stream)
في وضع الصوت الخام يذهب صوت المكالمة إلى خادم مالك البوت بدلاً من نموذج الذكاء الاصطناعي في Pabal. عندما ترسل إلى setVoiceCallSettings القيم mode=stream وstream_url=wss://… وstream_secret=… (من 32 إلى 128 حرف ASCII قابل للطباعة، في جسم الطلب فقط)، تحاول بوابة Pabal الاتصال بذلك العنوان مرة واحدة (فحص تجريبي)، وإذا نجحت يُفعَّل الوضع. ويلزم لذلك قبول شروط مالكي البوتات، وإصدار من التطبيق يتضمن نافذة تأكيد الصوت الخام. والإعداد ونتائج الفحص والأمثلة في البوتات الصوتية — وضع الصوت الخام.
- الاتصال: TLS 1.2 فأعلى، وشهادة عامة تطابق الاسم الوارد في URL، والبروتوكول الفرعي
pabal.voice.v1، بلا ضغط، والرسالة الواحدة حتى 64KiB · والنصية حتى 4KiB، بلا إعادة توجيه. - التوقيع:
X-Pabal-Voice-Signature: t=…,nonce=…,call=…,v1=HMAC-SHA256(stream_secret, "pabal-voice-stream/1\n<t>\n<nonce>\n<call>\n<host>\n<path?query>"). وhostهو مضيف URL الذي أبلغت به. تحقّق من 300 ثانية · وnonce لمرة واحدة · والمقارنة بالبايتات · وتطابقstart.call_idمعcall(التفاصيل). - الصوت: الرسائل النصية أحداث JSON، والثنائية PCM16 little-endian · أحادي القناة · 24 kHz. وصوت المتصل قطع طولها 20 ms (960 بايت).
- Pabal ← البوت:
start(مرة واحدة) ·live(انتهى إعلان الذكاء الاصطناعي) · الصوت ·mark·cleared·buffer_full·stop(← إغلاق 1000). - البوت ← Pabal:
ready(خلال 3 ثوانٍ بعدstart، وقبل أي شيء) · الصوت (بعدlive) ·clear·mark·hangup.
وشكل كل رسالة مفصّل في الجدول في البوتات الصوتية — المواصفة.
أخطاء طرق الصوت
جُمعت رموز أخطاء طرق الصوت ومعانيها في البوتات الصوتية — الأخطاء. وتأتي أخطاء 403 بالشكل Forbidden: <code>: <description> (VOICE_RULES_NOT_ACCEPTED، VOICE_NOT_AVAILABLE، VOICE_SUSPENDED، VOICE_OWNER_TERMS_NOT_ACCEPTED، VOICE_OWN_KEY_NOT_AVAILABLE، VOICE_STREAM_NOT_AVAILABLE، VOICE_OUTBOUND_OFF)، أما USER_UNAVAILABLE فيكون دائماً Forbidden: USER_UNAVAILABLE تماماً بلا وصف، وعند تجاوز الحد في الساعة تكون النتيجة 429 مع retry_after.
الاختلافات عن Telegram Bot API
- أنواع التحديثات: لا يصل إلا
messageوedited_messageوcallback_query، وأنواع البوتات الصوتية الخاصة بـ Pabal (voice_call،voice_call_tool_query،voice_call_transcript). ولا توجد منشورات القنوات، ولا الاستعلامات المضمّنة، ولا المدفوعات، ولا الاستطلاعات، ولا تغييرات الأعضاء (my_chat_member) وما شابهها. - التنسيق: يُتجاهل
parse_modeوentitiesويُرسل النص كما هو. ولا يُعرض تلقائياً إلا الأوامر والإشارات وعناوين URL والوسوم. - أنواع المحادثات: المحادثات الفردية والمجموعات العادية فقط. ولا توجد قنوات ولا مجموعات خارقة ولا مواضيع منتديات.
- الوسائط: الصور والملفات (
sendDocument) والمواقع والمواقع المباشرة والأماكن وجهات الاتصال فقط. ولا توجد رسائل تُشغَّل بوصفها فيديو أو صوتاً، ولا ملصقات، ولا ألبومات (sendMediaGroup)، ولا استطلاعات، ولا الإرسال عبر URL. والحدّ الأقصى للرفع والتنزيل عبر HTTP هو 20MB. - المواقع: تنبيه الاقتراب للموقع المباشر (
proximity_alert_radius) يُحفظ فقط ولا يُرسَل. والحركات التي تقع خلال 10 ثوانٍ أو 10 أمتار تُتجاوز دون تطبيق، وبطاقة جهة الاتصال التي يرسلها بوت لا تحملuser_id. - البوتات في المجموعات: لا يوجد وضع خصوصية، فيستلم البوت كل رسائل المجموعة.
- قائمة الانتظار: التحديثات التي لم تُجلب تُحفظ في الذاكرة حتى آخر 1,000 تحديث لكل بوت، وتضيع عند إعادة تشغيل الخادم (بينما يحتفظ بها Telegram مدة 24 ساعة).
- Webhook: يُرسل تحديثاً واحداً في كل مرة بالترتيب (و
max_connectionsتُحفظ فقط)، ولا تُقبل الشهادات الموقّعة ذاتياً، ولا قيود على المنفذ. - المعرّفات: معرّفات المستخدمين والرسائل والملفات لا معنى لها إلا داخل هذا الخادم. ولعدم وجود قنوات ومجموعات خارقة، لا توجد كذلك معرّفات بالشكل
-100…. - الطرق غير الموجودة: ما ليس في القائمة أعلاه (
forwardMessage،copyMessage،sendVideo،sendPoll،getChatMember،banChatMember،answerInlineQuery…) يعيد404 Not Found: method not found.