API Pabal
API Pabal (MTProto)
Untuk membuat klien yang terhubung ke server dengan cara yang sama seperti aplikasi: informasi koneksi, kunci publik server, alur autentikasi, update, dan cakupan dukungan.
Aplikasi Pabal berkomunikasi dengan server menggunakan MTProto 2.0. Bacalah dokumen ini saat Anda membuat program yang tersambung dengan cara yang sama โ aplikasi lain, otomatisasi yang berjalan dengan akun manusia, atau klien untuk riset. Jika Anda membuat bot, Bot API yang lebih sederhana sudah cukup.
Pabal mengikuti protokol terbuka Telegram, jadi definisi rinci protokol dan metodenya mengacu pada dokumen MTProto dan metode API. Dokumen ini mencatat perbedaan dan cakupan dukungan saat tersambung ke server Pabal.
Informasi koneksi
| Butir | Nilai |
|---|---|
| Alamat | 122.34.175.215 |
| Port | 8443 (TCP) |
| DC | DC 1โ5 semuanya beralamat sama. Anda boleh tersambung ke DC mana pun; biasanya dipakai 2 |
| Protokol | MTProto 2.0, API layer 216 |
| Transport | Abridged, Intermediate, Padded Intermediate, Full โ masing-masing termasuk obfuskasi (obfuscated2) |
| Kunci publik server | server-key.pem ยท fingerprint 8724853375441383205 |
| api_id ยท api_hash | Tidak diperiksa. Isi dengan nilai apa pun |
Transport HTTP, transport WebSocket, dan MTProxy belum ada. Jam di perangkat klien harus tepat โ nomor pesan MTProto diturunkan dari waktu, jadi jika jamnya meleset jauh, server akan membuang pesan.
Kunci publik server
Saat pertama kali tersambung, klien MTProto mengenkripsi pertukaran auth key dengan kunci publik RSA server. Klien Telegram menyimpan kunci publik Telegram di dalamnya, jadi untuk tersambung ke Pabal Anda harus memasukkan kunci ini sebagai gantinya (atau di sampingnya). Kunci inilah yang mencegah server lain berpura-pura menjadi server 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
Kunci ini dibuat sekali saat server pertama kali menyala dan tidak berubah. Pastikan nilai Loaded RSA key โฆ (fingerprint โฆ) di log server sama dengan fingerprint di atas.
Menyambung dengan Telethon
Berikut contoh masuk ke akun manusia dengan Telethon untuk Python, lalu bertukar pesan. Daftarkan akunnya terlebih dahulu di aplikasi (lihat di bawah).
# pabal_client.py โ pip install telethon==1.42.0
# server-key.pem (kunci publik server yang diunduh di atas) di folder yang sama
import asyncio
from telethon import TelegramClient, events
from telethon.crypto import rsa
rsa.add_key(open("server-key.pem").read(), old=False) # kunci publik server Pabal
client = TelegramClient("pabal", api_id=1, api_hash="0" * 32) # status masuk disimpan di 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("Nomor telepon (+8210โฆ): ")) # masukkan kode sekali saja di awal
me = await client.get_me()
print(f"Masuk sebagai: {me.first_name} (id {me.id})")
await client.send_message("BotFather", "/help")
await client.run_until_disconnected()
asyncio.run(main())
- Pakai Telethon 1.42. Versi inilah yang berbicara dengan layer 216. Versi yang lebih baru mencoba membaca respons dengan layer yang lebih tinggi dan gagal dengan
TypeNotFoundError. - Pendaftaran akun baru diblokir oleh Telethon (
sign_up()). Daftar lewat aplikasi, atau panggilauth.signUpsecara langsung. - Status masuk disimpan di berkas
pabal.session, jadi lain kali kode tidak ditanyakan lagi. Berkas ini adalah kunci akun Anda, jadi jagalah baik-baik.
Alur masuk
Penjelasan diagram
- Dua tahap: bagian atas adalah tahap membuat auth key untuk enkripsi (protokol), dan bagian bawah adalah tahap masuk yang melekatkan akun pada kunci itu (API). Pustaka mengurus tahap atas secara otomatis.
- Status masuk melekat pada auth key: walaupun Anda membuka beberapa sesi dengan kunci yang sudah pernah masuk, semuanya berstatus masuk. Jika kuncinya hilang (berkas sesi terhapus), Anda harus masuk lagi.
- Jalur pengiriman kode ditentukan oleh operator server: untuk SMS atau disampaikan admin, yang datang adalah
sentCodeTypeSms; untuk email, yang datang adalahsentCodeTypeSetUpEmailRequired, lalu klien menanyakan alamat email dan memanggilaccount.sendVerifyEmailCode(baris tengah). - Garis putus-putus merah adalah jalur untuk nomor baru: jika kodenya benar tetapi akunnya belum ada, datang
authorizationSignUpRequired; panggilauth.signUpdengan nama, maka pendaftaran selesai. Pendaftaran hanya bisa dilakukan setelah kode dimasukkan dengan benar. - Bot masuk cukup dengan satu kali
auth.importBotAuthorization(token bot), sebagai ganti tahap bawah.
| Error | Kapan |
|---|---|
PHONE_NUMBER_INVALID | Nomornya salah, atau nomor baru saat server sedang menutup pendaftaran baru |
PHONE_NUMBER_BANNED | Nomor yang diblokir operator |
FLOOD_WAIT_n (420) | Terlalu sering meminta kode. Coba lagi setelah n detik |
PHONE_CODE_INVALID | Kode salah (dikunci jika melebihi batas percobaan) |
PHONE_CODE_EXPIRED | Kode kedaluwarsa atau terkunci, atau phone_code_hash tidak dikenal โ mulai lagi dari sendCode |
EMAIL_INVALID, EMAIL_NOT_ALLOWED | Alamat email salah / akun sudah ada tetapi alamat itu bukan email login yang terdaftar |
AUTH_KEY_UNREGISTERED (401) | Memanggil metode yang memerlukan login dengan kunci yang belum masuk |
Di server yang nomor ujinya diaktifkan operator, nomor berbentuk +99966XYYYY bisa masuk dengan kode XXXXX (X lima kali) tanpa pengiriman kode sungguhan. Fitur ini hanya untuk server pengembangan dan dimatikan di server produksi.
Menerima update
- Real-time: selama koneksi terbuka, server langsung mengirim pesan baru, suntingan, dan penghapusan sebagai
updateShortMessageatauupdates. Sesi yang mengirim permintaan menerima hasilnya sebagai respons RPC, jadi hal yang sama tidak datang lagi sebagai push. - pts: setiap perubahan per pengguna diberi nomor urut (pts). Jika ada celah pada pts yang diterima klien, berarti ada sesuatu yang terlewat.
- Menyusul: simpan pts saat ini dengan
updates.getState, lalu saat tersambung kembali terima pesan baru, penghapusan, serta pengguna dan grup terkait di antara keduanya denganupdates.getDifference(pts, date, qts). Jika pts milik klien lebih maju daripada server (misalnya data server diatur ulang), yang datang adalahdifferenceTooLong; muat ulang daftar obrolan. - Pustaka seperti Telethon mengurus seluruh proses ini secara otomatis.
ID dan peer
| Objek | ID | Catatan |
|---|---|---|
| Orang | Mulai dari 100001 | peerUser. @BotFather adalah 100000 |
| Bot | Sistem penomoran yang sama dengan orang | user.bot = true. Angka di depan token adalah ID bot |
| Grup biasa | Mulai dari 1000001 | peerChat. Di Bot API tampil sebagai bilangan negatif (-chat_id) |
| Pesan | Mulai dari 1 untuk setiap kotak pesan | Dalam obrolan 1:1, setiap peserta punya salinan dan nomornya sendiri. Pesan yang sama bisa bernomor berbeda bagi dua orang |
Simpan access_hash persis seperti yang diberikan server, lalu pakai kembali (nilainya ikut datang bersama pencarian nama pengguna, daftar obrolan, dan update).
Berkas
- Mengunggah: unggah potongan dengan
upload.saveFilePart, lalu rujuk denganinputFileUploadedโฆ.upload.saveBigFilePartuntuk berkas besar belum ada, jadi batas praktisnya 10MB. - Mengirim:
messages.sendMediadenganinputMediaUploadedPhoto(foto baru) atauinputMediaPhoto(foto yang sudah ada di server). Media lain menghasilkanMEDIA_INVALID. - Menerima:
upload.getFiledenganinputPhotoFileLocation(foto pesan) atauinputPeerPhotoFileLocation(foto profil). Maksimal 1MB per panggilan. - Foto profil:
photos.uploadProfilePhoto,photos.updateProfilePhoto,photos.getUserPhotos,photos.deletePhotos. - Foto hanya disimpan dalam satu ukuran, yaitu ukuran aslinya (thumbnail tidak dibuat terpisah).
Cakupan dukungan
Server punya penangan untuk 408 metode layer 216 dan semuanya bisa membaca permintaan, tetapi yang sudah diperiksa sampai tuntas dengan klien sungguhan adalah metode-metode di bawah ini. Sisanya menjawab dengan format yang benar, tetapi isinya bisa kosong atau tidak tercatat.
| Bidang | Metode yang sudah diperiksa |
|---|---|
| Koneksi | initConnection, invokeWithLayer, help.getConfig, auth.bindTempAuthKey (kunci sementara PFS), auth.exportAuthorization/importAuthorization |
| Masuk | auth.sendCode, auth.signIn, auth.signUp, auth.logOut, auth.importBotAuthorization, account.sendVerifyEmailCode |
| Pengguna dan kontak | users.getUsers, users.getFullUser, contacts.resolveUsername, contacts.importContacts, contacts.search |
| Pesan | messages.sendMessage, messages.sendMedia (foto), messages.getHistory, messages.getDialogs, messages.getMessages, messages.editMessage, messages.deleteMessages |
| Grup | messages.createChat, messages.deleteChatUser, messages.editChatTitle (messages.addChatUser hanya diperiksa dengan aplikasi resmi) |
| Bot | messages.getBotCallbackAnswer, messages.setBotCallbackAnswer, pesan yang memiliki tombol (reply_markup) |
| Update | updates.getState, updates.getDifference, push real-time |
| Berkas dan foto | upload.saveFilePart, upload.getFile, photos.* (di atas) |
Sudah dipastikan juga bahwa Telegram Desktop resmi 6.2.6 berfungsi tanpa modifikasi untuk pendaftaran, masuk, obrolan, foto, grup, hingga tersambung ulang. Sekitar 60 metode yang dipanggil aplikasi saat mulai diperiksa format responsnya secara tersendiri.
Error
Error datang sebagai rpc_error standar (error_code + error_message). error_message selalu berbentuk huruf besar, angka, dan garis bawah (PEER_ID_INVALID), dan bila perlu diikuti : keterangan.
| Kode | Arti |
|---|---|
400 | Permintaan salah โ PEER_ID_INVALID, MESSAGE_ID_INVALID, MEDIA_INVALID, USERNAME_NOT_OCCUPIED โฆ |
401 | Perlu masuk โ AUTH_KEY_UNREGISTERED |
403 | Tidak berhak โ misalnya grup yang Anda bukan anggotanya |
420 | FLOOD_WAIT_n โ tunggu n detik |
500 | Error internal server |
Error transport -404 | Server tidak mengenal auth key ini โ buat kunci baru lalu masuk lagi (kunci permanen) atau ikat ulang (kunci sementara) |
Yang belum ada
- Kanal dan supergrup (
channels.*menjawab, tetapi tidak tampil dengan benar di aplikasi), obrolan rahasia, panggilan - Media selain foto,
upload.saveBigFilePart, thumbnail - Verifikasi dua langkah (SRP) โ tidak bisa diatur, dan tindakan yang memerlukan verifikasi dua langkah ditolak
- Transport HTTP dan WebSocket, MTProxy, pengiriman
msgs_ack, penggantianbad_server_salt - Pembagian ke beberapa server โ satu server menangani semua DC 1โ5
Menyambungkan aplikasi Telegram resmi ke Pabal
Aplikasi Telegram menanamkan alamat server dan kunci publik ke dalam dirinya saat dibangun (build). Karena itu, yang perlu diubah bukan layar pengaturan, melainkan kode sumbernya, lalu dibangun ulang. Aplikasi Pabal (Pabal.app) dibuat dengan cara itu. Jika Anda operator server, lihat Instalasi server โ menghubungkan aplikasi.