Dokumentasi pengembang
Bahasa Indonesia

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.

Baca juga dokumentasi Telegram

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

ButirNilai
Alamat122.34.175.215
Port8443 (TCP)
DCDC 1โ€“5 semuanya beralamat sama. Anda boleh tersambung ke DC mana pun; biasanya dipakai 2
ProtokolMTProto 2.0, API layer 216
TransportAbridged, Intermediate, Padded Intermediate, Full โ€” masing-masing termasuk obfuskasi (obfuscated2)
Kunci publik serverserver-key.pem ยท fingerprint 8724853375441383205
api_id ยท api_hashTidak 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 panggil auth.signUp secara 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

1 ยท Auth key (sekali) req_pq_multi โ†’ req_DH_params set_client_DH_params Auth key 2048 bitdilindungi kunci publik server 2 ยท Masuk (sekali per auth key) auth.sendCodenomor telepon sentCodeTypeSmsSMS atau disampaikan admin SetUpEmailRequiredmode email โ†’ tanya alamat account.sendVerifyEmailCodepurpose: loginSetup auth.signInphone_code atau kode email auth.authorizationberhasil masuk authorizationSignUpRequirednomor baru โ†’ auth.signUp(nama) setelah kode diterima
Buat auth key, lalu masuk dengan kode

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 adalah sentCodeTypeSetUpEmailRequired, lalu klien menanyakan alamat email dan memanggil account.sendVerifyEmailCode (baris tengah).
  • Garis putus-putus merah adalah jalur untuk nomor baru: jika kodenya benar tetapi akunnya belum ada, datang authorizationSignUpRequired; panggil auth.signUp dengan 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.
ErrorKapan
PHONE_NUMBER_INVALIDNomornya salah, atau nomor baru saat server sedang menutup pendaftaran baru
PHONE_NUMBER_BANNEDNomor yang diblokir operator
FLOOD_WAIT_n (420)Terlalu sering meminta kode. Coba lagi setelah n detik
PHONE_CODE_INVALIDKode salah (dikunci jika melebihi batas percobaan)
PHONE_CODE_EXPIREDKode kedaluwarsa atau terkunci, atau phone_code_hash tidak dikenal โ€” mulai lagi dari sendCode
EMAIL_INVALID, EMAIL_NOT_ALLOWEDAlamat 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
Nomor uji

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 updateShortMessage atau updates. 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 dengan updates.getDifference(pts, date, qts). Jika pts milik klien lebih maju daripada server (misalnya data server diatur ulang), yang datang adalah differenceTooLong; muat ulang daftar obrolan.
  • Pustaka seperti Telethon mengurus seluruh proses ini secara otomatis.

ID dan peer

ObjekIDCatatan
OrangMulai dari 100001peerUser. @BotFather adalah 100000
BotSistem penomoran yang sama dengan oranguser.bot = true. Angka di depan token adalah ID bot
Grup biasaMulai dari 1000001peerChat. Di Bot API tampil sebagai bilangan negatif (-chat_id)
PesanMulai dari 1 untuk setiap kotak pesanDalam 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 dengan inputFileUploadedโ€ฆ. upload.saveBigFilePart untuk berkas besar belum ada, jadi batas praktisnya 10MB.
  • Mengirim: messages.sendMedia dengan inputMediaUploadedPhoto (foto baru) atau inputMediaPhoto (foto yang sudah ada di server). Media lain menghasilkan MEDIA_INVALID.
  • Menerima: upload.getFile dengan inputPhotoFileLocation (foto pesan) atau inputPeerPhotoFileLocation (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.

BidangMetode yang sudah diperiksa
KoneksiinitConnection, invokeWithLayer, help.getConfig, auth.bindTempAuthKey (kunci sementara PFS), auth.exportAuthorization/importAuthorization
Masukauth.sendCode, auth.signIn, auth.signUp, auth.logOut, auth.importBotAuthorization, account.sendVerifyEmailCode
Pengguna dan kontakusers.getUsers, users.getFullUser, contacts.resolveUsername, contacts.importContacts, contacts.search
Pesanmessages.sendMessage, messages.sendMedia (foto), messages.getHistory, messages.getDialogs, messages.getMessages, messages.editMessage, messages.deleteMessages
Grupmessages.createChat, messages.deleteChatUser, messages.editChatTitle (messages.addChatUser hanya diperiksa dengan aplikasi resmi)
Botmessages.getBotCallbackAnswer, messages.setBotCallbackAnswer, pesan yang memiliki tombol (reply_markup)
Updateupdates.getState, updates.getDifference, push real-time
Berkas dan fotoupload.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.

KodeArti
400Permintaan salah โ€” PEER_ID_INVALID, MESSAGE_ID_INVALID, MEDIA_INVALID, USERNAME_NOT_OCCUPIED โ€ฆ
401Perlu masuk โ€” AUTH_KEY_UNREGISTERED
403Tidak berhak โ€” misalnya grup yang Anda bukan anggotanya
420FLOOD_WAIT_n โ€” tunggu n detik
500Error internal server
Error transport -404Server 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, penggantian bad_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.