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 lewat 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.
Menghubungkan lewat 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, atau nomor akun yang ditangguhkan (jika akunnya dihapus saat masih ditangguhkan, bawaannya 1 tahun โ operator bisa memperpanjang atau membuatnya tanpa batas waktu) |
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; saat tersambung kembali, ambil pesan baru dan penghapusan yang terjadi selama terputus, beserta pengguna dan grup terkait, 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. - Notifikasi push โ Android: aplikasi Android yang tidak tersambung dibangunkan oleh push Firebase. Setelah aplikasi mendaftar dengan
account.registerDevice(token_type2 = token FCM,secret= kunci perangkat 256 byte), server mengenkripsi pesan dan panggilan baru dengan kunci perangkat itu lalu mengirimnya lewat FCM, dan aplikasi yang terbangun menyusul denganupdates.getDifference. Push hanya bisa sampai ke aplikasi yang dibangun dengan project Firebase milik operator server. - Notifikasi push โ iPhone: aplikasi iPhone mendaftarkan dua hal dengan permintaan yang sama โ
token_type1 (token notifikasi APNs) dan 9 (token VoIP PushKit);secretuntuk keduanya adalah kunci perangkat 256 byte milik akun itu. Pesan baru dikirim sebagai notifikasi APNs: teks luar yang bisa dilihat Apple hanyalah nama aplikasi dan kalimat tanpa isi seperti "Ada notifikasi baru", sedangkan pesannya dienkripsi dengan kunci perangkat dan dimuat dip, lalu ekstensi notifikasi aplikasi (Notification Service Extension) membukanya dan menampilkannya. Panggilan memunculkan layar panggilan CallKit lewat push VoIP (mulai dari build yang VoIP-nya sudah dinyalakan operator; sebelum itu sebagai notifikasi), dan apa yang dibaca atau dihapus di perangkat lain diberitahukan lewat push latar belakang. Push hanya bisa sampai ke aplikasi yang ditandatangani oleh tim yang sama dengan pemilik kunci APNs operator server dan memiliki bundle ID yang sama.token_typelainnya hanya dijawabboolTruetanpa dikirimi apa pun. - 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 | Satu urutan untuk seluruh server | Dalam obrolan 1:1, kedua salinan memakai nomor yang sama, sehingga permintaan yang hanya menerima nomor pesan tanpa peer (messages.getMessages, messages.deleteMessages) menunjuk pesan yang sama bagi kedua orang. Hanya kanal yang menghitung sendiri mulai dari 1 |
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 (maksimal 512KB per potongan, hingga 4.000 potongan) dengan
upload.saveFilePart, lalu rujuk denganinputFileUploadedโฆ. Berkas yang lebih dari 10MB diunggah denganupload.saveBigFilePartโ karena jumlah potongannya diberitahukan lebih dulu, berkas yang ukurannya tidak diterima server ditolak denganFILE_TOO_BIGsebelum semuanya terkirim. Potongan langsung ditulis ke disk begitu tiba, lalu disatukan ketika ada pesan yang merujuk berkas itu. - Mengirim:
messages.sendMediadenganinputMediaUploadedPhoto(foto baru),inputMediaPhoto(foto yang sudah ada di server),inputMediaUploadedDocument(berkas baru), atauinputMediaDocument(berkas yang sudah ada di server). Media lainnya menghasilkanMEDIA_INVALID. Anda juga bisa mengunggah lebih dulu tanpa mengirimnya denganmessages.uploadMedia(media yang dikembalikannya bisa Anda kirim apa adanya nanti), sedangkanmessages.sendMultiMediaditerima tetapi kirimannya datang satu per satu dan tidak disatukan (tanpa grouped_id). - Menerima:
upload.getFiledenganinputPhotoFileLocation(foto pesan),inputDocumentFileLocation(berkas pesan), atauinputPeerPhotoFileLocation(foto profil). Maksimal 1MB per panggilan. Saat menerima pun berkas tidak dimuat seluruhnya ke memori; hanya bagian yang diminta yang dibaca. - Foto profil:
photos.uploadProfilePhoto,photos.updateProfilePhoto,photos.getUserPhotos,photos.deletePhotos. - Foto hanya disimpan dalam satu ukuran, yaitu ukuran aslinya (thumbnail tidak dibuat terpisah). Berkas dibiarkan apa adanya tanpa disentuh, dan
documentAttribute*yang dilampirkan pengirim diteruskan byte demi byte ke penerima โ server meneruskannya begitu saja tanpa perlu memahami durasi video atau bentuk gelombang suara.
Cakupan dukungan
Server punya penangan untuk 469 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 dan berkas), 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.saveBigFilePart (di atas 10MB), 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.
Yang ditambahkan sesudahnya โ daftar perangkat dan mengeluarkannya (account.getAuthorizations, account.resetAuthorization, auth.resetAuthorizations), ekspor data aplikasi desktop (account.initTakeoutSession, invokeWithTakeout, invokeWithMessagesRange, account.finishTakeoutSession โ tiga kali mulai per hari per akun, lebih dari itu 420 TAKEOUT_INIT_DELAY_n), dan mengganti nomor (account.sendChangePhoneCode, account.changePhone โ 400 PHONE_CHANGE_DISABLED selama operator belum menyalakannya, BOT_METHOD_INVALID untuk bot) โ sudah dipastikan dengan uji server; pemeriksaan ujung ke ujung dengan aplikasi sungguhan belum dilakukan.
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 tempat Anda bukan anggota |
406 | Belum boleh sekarang โ perangkat yang masuk kurang dari 24 jam lalu mencoba mengeluarkan perangkat lain: FRESH_RESET_AUTHORISATION_FORBIDDEN |
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) |
API jam tangan
/api/watch/v1/ di server adalah pintu masuk JSON lewat HTTPS khusus untuk aplikasi Pabal di Apple Watch. Pintu ini dibuat terpisah karena jam tangan tidak bisa memakai MTProto, dan ini bukan spesifikasi publik serta masih disiapkan, jadi bisa berubah tanpa pemberitahuan. Untuk membuat program yang tersambung ke Pabal, gunakan MTProto di halaman ini. Operator server silakan membaca Instalasi server โ pintu masuk Apple Watch.
Yang belum ada
- Kanal dan supergrup (
channels.*menjawab, tetapi tidak tampil dengan benar di aplikasi), obrolan rahasia, panggilan grup - Pesan video dan suara yang diputar di dalam aplikasi, album yang ditampilkan sebagai satu kesatuan (grouped_id), stiker, thumbnail (berkas hanya aslinya)
- Verifikasi dua langkah (SRP) โ tidak bisa diatur, dan tindakan yang memerlukan verifikasi dua langkah ditolak
- Transport HTTP dan WebSocket, MTProxy, pengiriman
msgs_ack, rotasi berkala salt server (salt yang salah dijawab denganbad_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.