واجهة Pabal البرمجية
واجهة Pabal البرمجية (MTProto)
عندما تبني عميلاً يتصل بالخادم بالطريقة نفسها التي يتصل بها التطبيق: بيانات الاتصال، والمفتاح العام للخادم، ومسار المصادقة، والتحديثات، ونطاق الدعم.
يتحدث تطبيق Pabal مع الخادم عبر MTProto 2.0. استعن بهذا المستند عندما تبني برنامجاً يتصل بالطريقة نفسها — تطبيقاً آخر، أو أتمتةً تعمل بحساب شخص، أو عميلاً لأغراض بحثية. أما إن كنت تبني بوتاً فتكفيك Bot API الأبسط.
بما أن Pabal يتّبع البروتوكول المنشور علناً لـ Telegram، فالمرجع في التعريفات التفصيلية للبروتوكول والطرق هو وثائق MTProto وطرق API. أما هذا المستند فيذكر الاختلافات ونطاق الدعم عند الاتصال بخادم Pabal.
بيانات الاتصال
| البند | القيمة |
|---|---|
| العنوان | 122.34.175.215 |
| المنفذ | 8443 (TCP) |
| DC | مراكز البيانات من 1 إلى 5 كلها بالعنوان نفسه. يمكنك الاتصال بأيٍّ منها، وعادةً يُستخدم 2 |
| البروتوكول | MTProto 2.0، وطبقة API هي 216 |
| أنواع النقل | Abridged وIntermediate وPadded Intermediate وFull — كلٌّ منها مع التعمية (obfuscated2) |
| المفتاح العام للخادم | server-key.pem · البصمة (fingerprint) 8724853375441383205 |
| api_id · api_hash | لا يُتحقق منهما. ضع أي قيمة |
النقل عبر HTTP وعبر WebSocket وMTProxy غير متاحة بعد. يجب أن تكون ساعة جهاز العميل مضبوطة — فأرقام رسائل MTProto مشتقة من الوقت، وإذا كانت الساعة خاطئة كثيراً يتجاهل الخادم الرسائل.
المفتاح العام للخادم
عند الاتصال الأول يشفّر عميل MTProto تبادل مفتاح المصادقة بمفتاح RSA العام للخادم. وعملاء Telegram يحملون في داخلهم المفتاح العام لـ Telegram، لذا يجب لكي يتصلوا بـ Pabal أن تضع هذا المفتاح بدلاً منه (أو معه). فهذا المفتاح هو ما يمنع خادماً آخر من انتحال صفة خادم Pabal.
-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA4hH74xPQsUwr/pyXPdF4tVicYr6QbfeDrKC7mUOVrPLSL4FtmgGn
w+O4u6lVvOf3Udd1KY6+OL4fUZdMBlLzwsoGLoniiVR09dnvyXHE8LhQSS+i1LmI
oJbhQwXplLnUJf272fLXkD23e7ppKLkjYk+jeYObueCy5HYMSThklVeXEzbZVGZv
47o/mjU2vyFoRpa6wCIE4rpj1UIPtOMpekMI/TocIlGVJ+ch6cAVNxIDro53a1eG
/1oZRLQH4oViEGxeMMjBMY5gk5HPkZvjbqy4h8TjXEz7O5o0BRsSqG/OPtP/dRQV
X4ewPhj2WCU4e6l5X59ZKIcv4sQLOwClqQIDAQAB
-----END RSA PUBLIC KEY-----
curl -s -o server-key.pem https://pabal.me/docs/server-key.pem
يُنشأ هذا المفتاح مرة واحدة عند أول تشغيل للخادم، ولا يتغير بعد ذلك. تحقق من أن قيمة Loaded RSA key … (fingerprint …) في سجل الخادم تطابق البصمة أعلاه.
الاتصال باستخدام Telethon
هذا مثال على تسجيل الدخول بحساب شخص وتبادل الرسائل باستخدام Telethon في Python. سجّل الحساب أولاً من التطبيق (انظر أدناه).
# pabal_client.py — pip install telethon==1.42.0
# ضع server-key.pem (المفتاح العام للخادم الذي نزّلته أعلاه) في المجلد نفسه
import asyncio
from telethon import TelegramClient, events
from telethon.crypto import rsa
rsa.add_key(open("server-key.pem").read(), old=False) # المفتاح العام لخادم Pabal
client = TelegramClient("pabal", api_id=1, api_hash="0" * 32) # يُحفظ تسجيل الدخول في pabal.session
client.session.set_dc(2, "122.34.175.215", 8443)
@client.on(events.NewMessage(incoming=True))
async def show(event):
sender = await event.get_sender()
print(f"{sender.first_name}: {event.raw_text}")
async def main():
await client.start(phone=lambda: input("رقم الهاتف (+8210…): ")) # أدخل الرمز مرة واحدة في المرة الأولى
me = await client.get_me()
print(f"تم تسجيل الدخول: {me.first_name} (id {me.id})")
await client.send_message("BotFather", "/help")
await client.run_until_disconnected()
asyncio.run(main())
- استخدم Telethon 1.42، فهو الإصدار الذي يتحدث بالطبقة 216. أما الإصدارات الأحدث فتحاول قراءة الاستجابات بطبقة أعلى فتفشل بالخطأ
TypeNotFoundError. - تسجيل الحسابات الجديدة معطّل في Telethon (
sign_up()). سجّل من التطبيق، أو استدعِauth.signUpبنفسك. - يُحفظ تسجيل الدخول في الملف
pabal.session، فلا يُطلب منك الرمز في المرات التالية. وهذا الملف مفتاح حسابك، فاحمِه.
مسار تسجيل الدخول
شرح المخطط
- مرحلتان: في الأعلى مرحلة إنشاء مفتاح المصادقة الذي يُستخدم في التشفير (البروتوكول)، وفي الأسفل مرحلة تسجيل الدخول التي تربط حساباً بذلك المفتاح (API). وتتولى المكتبات المرحلة العليا تلقائياً.
- يرتبط تسجيل الدخول بمفتاح المصادقة: إذا فتحت عدة جلسات بمفتاح سُجّل به الدخول مرة، فكلها تكون في حالة تسجيل دخول. وإذا فقدت المفتاح (بحذف ملف الجلسة) فعليك تسجيل الدخول من جديد.
- مشغّل الخادم هو من يحدد طريق الرمز: في حالة SMS أو الإيصال عن طريق المسؤول يصل
sentCodeTypeSms، وفي حالة البريد الإلكتروني يصلsentCodeTypeSetUpEmailRequiredفيسأل العميل عن عنوان البريد ويستدعيaccount.sendVerifyEmailCode(السطر الأوسط). - الخط الأحمر المتقطع هو طريق الأرقام الجديدة: إذا كان الرمز صحيحاً ولا يوجد حساب، يصل
authorizationSignUpRequired، وباستدعاءauth.signUpمع الاسم يكتمل التسجيل. ولا يتم التسجيل إلا بعد إدخال الرمز الصحيح. - البوتات تسجّل الدخول بدلاً من المرحلة السفلى باستدعاء واحد لـ
auth.importBotAuthorization(بالرمز المميّز للبوت).
| الخطأ | متى |
|---|---|
PHONE_NUMBER_INVALID | الرقم خاطئ، أو رقم جديد والخادم مغلق أمام التسجيلات الجديدة |
PHONE_NUMBER_BANNED | رقم حظره المشغّل |
FLOOD_WAIT_n (420) | طلبت الرمز مرات كثيرة جداً. أعد المحاولة بعد n ثانية |
PHONE_CODE_INVALID | الرمز خاطئ (ويُقفل إذا تجاوزت العدد المسموح من المحاولات) |
PHONE_CODE_EXPIRED | انتهت صلاحية الرمز أو أُقفل، أو أن phone_code_hash غير معروف — ابدأ من جديد بـ sendCode |
EMAIL_INVALID، EMAIL_NOT_ALLOWED | عنوان البريد خاطئ / الحساب موجود لكن العنوان ليس بريد تسجيل الدخول المسجّل له |
AUTH_KEY_UNREGISTERED (401) | استُدعيت طريقة تتطلب تسجيل الدخول بمفتاح لم يُسجَّل به الدخول |
على الخادم الذي فعّل فيه المشغّل أرقام الاختبار، يمكن تسجيل الدخول بأرقام بالشكل +99966XYYYY دون إيصال رمز فعلي، وذلك بالرمز XXXXX (أي تكرار X خمس مرات). وهذه ميزة لخوادم التطوير فقط، وهي معطّلة على خوادم الإنتاج.
استلام التحديثات
- فورياً: ما دام الاتصال مفتوحاً، يرسل الخادم الرسائل الجديدة والتعديلات وعمليات الحذف مباشرةً على شكل
updateShortMessageوupdates. والجلسة التي أرسلت الطلب تستلم النتيجة في استجابة RPC، فلا يصلها الشيء نفسه مرة أخرى عبر الدفع (push). - pts: لكل مستخدم رقم تسلسلي (pts) يُعطى لكل تغيير. فإذا وجد العميل فجوة في أرقام pts التي استلمها، فقد فاته شيء.
- الاستدراك: احفظ pts الحالي عبر
updates.getState، وعند إعادة الاتصال استلم عبرupdates.getDifference(pts, date, qts)الرسائل الجديدة وعمليات الحذف التي وقعت في الأثناء، مع المستخدمين والمجموعات المعنيين. وإذا كان pts لدى العميل متقدماً على الخادم (كأن تكون بيانات الخادم قد أُعيدت تهيئتها) يصلdifferenceTooLong، فأعد تحميل قائمة المحادثات. - المكتبات مثل Telethon تتولى هذه العملية كلها تلقائياً.
المعرّفات والنظراء
| الكيان | المعرّف | ملاحظات |
|---|---|---|
| الأشخاص | بدءاً من 100001 | peerUser. ومعرّف @BotFather هو 100000 |
| البوتات | نظام الترقيم نفسه الخاص بالأشخاص | user.bot = true. والرقم الذي في بداية الرمز المميّز هو معرّف البوت |
| المجموعات الأساسية | بدءاً من 1000001 | peerChat. وفي Bot API تظهر بعدد سالب (-chat_id) |
| الرسائل | من 1 في كل صندوق رسائل | في المحادثة الفردية لكل مشارك نسخته الخاصة وأرقامه الخاصة، فقد يختلف رقم الرسالة نفسها بين الشخصين |
احفظ قيمة access_hash التي يعطيها الخادم كما هي واستخدمها (فهي تأتي مع نتائج البحث عن أسماء المستخدمين وقائمة المحادثات والتحديثات).
الملفات
- الرفع: ارفع الأجزاء عبر
upload.saveFilePartثم أشر إليها بـinputFileUploaded…. أماupload.saveBigFilePartالمخصّصة للملفات الكبيرة فغير متاحة بعد، فالحد الفعلي 10MB. - الإرسال: استخدم في
messages.sendMediaالقيمةinputMediaUploadedPhoto(صورة جديدة) أوinputMediaPhoto(صورة موجودة على الخادم). والوسائط الأخرى تعيدMEDIA_INVALID. - الاستلام: استخدم في
upload.getFileالقيمةinputPhotoFileLocation(صورة رسالة) أوinputPeerPhotoFileLocation(صورة ملف شخصي). والحد الأقصى 1MB في المرة الواحدة. - صورة الملف الشخصي:
photos.uploadProfilePhoto، وphotos.updateProfilePhoto، وphotos.getUserPhotos، وphotos.deletePhotos. - تُحفظ الصور بحجم واحد فقط هو الأصل (لا تُنشأ صور مصغّرة منفصلة).
نطاق الدعم
في الخادم معالِجات لـ 408 طرق من الطبقة 216، ويمكنها جميعاً قراءة الطلبات، لكن ما تحققنا منه حتى النهاية بعملاء حقيقيين هو الطرق أدناه. أما البقية فتعيد استجابات بالصيغة الصحيحة، لكن محتواها قد يكون فارغاً أو قد لا يُسجَّل.
| المجال | الطرق التي تحققنا منها |
|---|---|
| الاتصال | initConnection، invokeWithLayer، help.getConfig، auth.bindTempAuthKey (المفتاح المؤقت لـ PFS)، auth.exportAuthorization/importAuthorization |
| تسجيل الدخول | auth.sendCode، auth.signIn، auth.signUp، auth.logOut، auth.importBotAuthorization، account.sendVerifyEmailCode |
| المستخدمون وجهات الاتصال | users.getUsers، users.getFullUser، contacts.resolveUsername، contacts.importContacts، contacts.search |
| الرسائل | messages.sendMessage، messages.sendMedia (صور)، messages.getHistory، messages.getDialogs، messages.getMessages، messages.editMessage، messages.deleteMessages |
| المجموعات | messages.createChat، messages.deleteChatUser، messages.editChatTitle (وmessages.addChatUser تحققنا منها بالتطبيق الرسمي فقط) |
| البوتات | messages.getBotCallbackAnswer، messages.setBotCallbackAnswer، والرسائل التي تحمل أزراراً (reply_markup) |
| التحديثات | updates.getState، updates.getDifference، والدفع الفوري |
| الملفات والصور | upload.saveFilePart، upload.getFile، photos.* (أعلاه) |
وتحققنا كذلك من أن تطبيق Telegram Desktop الرسمي 6.2.6 يعمل دون تعديل في التسجيل وتسجيل الدخول والمحادثات والصور والمجموعات وإعادة الاتصال. أما الطرق التي يستدعيها التطبيق عند بدء تشغيله، وعددها نحو 60 طريقة، فتُفحص صيغة استجاباتها على حدة.
الأخطاء
تصل الأخطاء بالصيغة القياسية rpc_error (error_code + error_message). وتتكوّن error_message دائماً من أحرف كبيرة وأرقام وشرطات سفلية (PEER_ID_INVALID)، وقد يُلحق بها : وصف عند الحاجة.
| الرمز | المعنى |
|---|---|
400 | الطلب خاطئ — PEER_ID_INVALID، MESSAGE_ID_INVALID، MEDIA_INVALID، USERNAME_NOT_OCCUPIED … |
401 | يلزم تسجيل الدخول — AUTH_KEY_UNREGISTERED |
403 | لا صلاحية — كمجموعة لست عضواً فيها، وما شابه |
420 | FLOOD_WAIT_n — انتظر n ثانية |
500 | خطأ داخلي في الخادم |
خطأ النقل -404 | الخادم لا يعرف مفتاح المصادقة هذا — أنشئ مفتاحاً جديداً وسجّل الدخول من جديد (المفتاح الدائم)، أو أعد الربط (المفتاح المؤقت) |
ما ليس متاحاً بعد
- القنوات والمجموعات الخارقة (تستجيب
channels.*لكنها لا تظهر بشكل صحيح في التطبيق)، والمحادثات السرية، والمكالمات - الوسائط غير الصور، و
upload.saveBigFilePart، والصور المصغّرة - التحقق بخطوتين (SRP) — لا يمكن ضبطه، والعمليات التي تتطلب التحقق بخطوتين تُرفض
- النقل عبر HTTP وWebSocket، وMTProxy، وإرسال
msgs_ack، واستبدالbad_server_salt - التوزيع على عدة خوادم — خادم واحد يتولى مراكز البيانات من 1 إلى 5 كلها
لتوصيل تطبيق Telegram الرسمي بـ Pabal
يضمّن تطبيق Telegram عنوان الخادم والمفتاح العام في داخله عند البناء. لذلك لا يكفي تغييرهما من شاشة الإعدادات، بل يجب تعديل الشيفرة المصدرية وإعادة البناء. وهكذا صُنع تطبيق Pabal (Pabal.app). وإن كنت مشغّل خادم فراجع تثبيت الخادم — توصيل التطبيق.