Pengembangan bot
Referensi Bot API
Semua metode yang diterima HTTP Bot API Pabal, objek yang dipertukarkan, dan error-nya, tanpa ada yang terlewat. Kompatibel dengan Bot API Telegram.
HTTP Bot API Pabal memakai format alamat, permintaan, respons, dan error yang sama dengan Bot API Telegram. Dokumen ini hanya mencantumkan apa yang benar-benar diterima Pabal. Metode yang tidak ada di sini mengembalikan 404 Not Found: method not found. Jika Anda baru mulai, bacalah tutorial membuat bot terlebih dahulu.
Mengirim permintaan
https://pabal.me/bot<token>/<metode>
- Metode HTTP:
GETmaupunPOSTbisa dipakai. - Ada empat cara mengirim parameter — query string (
?chat_id=1&text=hi),application/x-www-form-urlencoded,application/json, danmultipart/form-datasaat mengunggah berkas. Boleh dicampur. - Parameter berupa objek (
reply_markup,commands,allowed_updates) dimasukkan apa adanya sebagai objek atau array di badan JSON, dan sebagai string JSON di formulir atau query. - Nama metode tidak membedakan huruf besar dan kecil (
sendMessage=sendmessage). - Ukuran badan hingga 12MB (jika lebih,
413). - Mengunduh berkas memakai alamat tersendiri,
https://pabal.me/file/bot<token>/<file_path>(getFile).
Respons dan error
Respons selalu berupa JSON. Jika berhasil, Anda menerima HTTP 200 dan result; jika gagal, Anda menerima status HTTP tersebut, error_code yang sama dengan status itu, dan description yang bisa dibaca manusia.
{"ok": true, "result": { … }}{"ok": false, "error_code": 400, "description": "Bad Request: chat not found"}| error_code | Kapan | Contoh description |
|---|---|---|
400 | Parameter salah | 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 | Token salah | Unauthorized |
403 | Tidak berhak mengirim | Forbidden: bot can't initiate conversation with a user, Forbidden: bot is not a member of the group chat |
404 | Metode atau berkas tidak ada | Not Found: method not found |
409 | getUpdates dipanggil saat webhook terpasang | Conflict: can't use getUpdates method while webhook is active; use deleteWebhook to delete the webhook first |
413 | Badan melebihi 12MB | Request Entity Too Large |
500 | Error internal server | Internal Server Error |
Pabal belum menerapkan pembatasan laju permintaan (429 Too Many Requests), tetapi karena bisa saja ditambahkan nanti, tulislah kode Anda agar saat menerima 429 ia menunggu selama parameters.retry_after detik lalu mengirim ulang.
Menerima update
Gunakan salah satu dari dua cara. Keduanya tidak bisa dipakai bersamaan.
getUpdates
POST/bot<token>/getUpdates
Mengambil update yang sedang menunggu (long polling). Jika webhook terpasang, hasilnya 409.
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
offset | Integer | Opsional | Hanya update dengan nomor ini atau lebih besar. Yang lebih kecil dihapus sebagai "sudah diterima". Berikan update_id + 1 terakhir yang sudah diproses. |
limit | Integer | Opsional | 1–100, bawaan 100 |
timeout | Integer | Opsional | Detik untuk menunggu, 0–50, bawaan 0. Disarankan 25–30. |
allowed_updates | Array of String | Diabaikan | Diterima tetapi tidak dipakai. Untuk menyaring jenis update, saring setelah diterima. |
Mengembalikan: Array of Update
setWebhook
POST/bot<token>/setWebhook
Menerima update di alamat HTTPS. Penjelasan lengkapnya ada di dokumen Webhook.
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
url | String | Ya | Alamat publik https://. String kosong menghapus webhook |
secret_token | String | Opsional | 1–256 karakter, A-Z a-z 0-9 _ -. Dikirim dalam header permintaan X-Telegram-Bot-Api-Secret-Token |
allowed_updates | Array of String | Opsional | Pilihan dari message, edited_message, callback_query. Jika kosong, semuanya |
drop_pending_updates | Boolean | Opsional | Membuang update yang sedang menunggu |
max_connections | Integer | Opsional | 1–100, bawaan 40. Hanya disimpan; pengiriman tetap satu per satu untuk setiap bot |
certificate | InputFile | Tidak didukung | 400 — gunakan sertifikat publik |
ip_address | String | Diabaikan |
Mengembalikan: True
deleteWebhook
POST/bot<token>/deleteWebhook
Menghapus webhook dan kembali ke getUpdates. Tetap berhasil meskipun tidak ada webhook.
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
drop_pending_updates | Boolean | Opsional | Membuang update yang sedang menunggu |
Mengembalikan: True
getWebhookInfo
GET/bot<token>/getWebhookInfo
Status webhook. Tanpa parameter. Jika tidak ada webhook, url berupa string kosong.
Mengembalikan: WebhookInfo
Metode
| Metode | Fungsinya |
|---|---|
getMe | Informasi tentang bot itu sendiri |
sendMessage | Mengirim teks (termasuk tombol) |
sendPhoto | Mengirim foto |
editMessageText | Mengedit teks dan tombol pesan yang sudah dikirim |
editMessageCaption | Mengedit keterangan foto |
editMessageReplyMarkup | Mengedit tombolnya saja |
deleteMessage | Menghapus pesan |
answerCallbackQuery | Menjawab penekanan tombol |
sendChatAction | Indikator "sedang mengetik" (hanya diterima) |
getChat | Informasi obrolan |
getFile | Jalur unduhan foto yang diterima |
setMyCommands · getMyCommands · deleteMyCommands | Menu perintah |
logOut · close | Untuk kompatibilitas (tidak melakukan apa pun) |
getUpdates · setWebhook · deleteWebhook · getWebhookInfo | Menerima update (lihat di atas) |
chat_id
Untuk obrolan 1:1, ID orang tersebut (bilangan positif); untuk grup biasa, ID grup (bilangan negatif); atau nama pengguna orang tersebut ("@hana_lee"). Semuanya bisa diketahui dari chat.id pada update. ID kanal atau supergrup (-100…) belum ada (400 chat not found).
getMe
GET/bot<token>/getMe
Dipakai untuk memeriksa apakah token benar. Tanpa parameter.
Mengembalikan: User — untuk bot, ditambah can_join_groups (true), can_read_all_group_messages (true), supports_inline_queries (false), can_connect_to_business (false), dan has_main_web_app (false).
sendMessage
POST/bot<token>/sendMessage
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
chat_id | Integer atau String | Ya | Obrolan tujuan (lihat kotak di atas) |
text | String | Ya | 1–4.096 karakter. Dikirim apa adanya |
reply_markup | InlineKeyboardMarkup · ReplyKeyboardMarkup · ReplyKeyboardRemove · ForceReply | Opsional | Tombol |
disable_notification | Boolean | Opsional | Kirim tanpa suara |
parse_mode, entities, reply_parameters, link_preview_options … | Diabaikan | Diterima tetapi tidak dipakai. Format tidak diterapkan |
Mengembalikan: Message yang dikirim
Untuk mengirim ke seseorang, orang itu harus sudah lebih dulu mengirim pesan ke bot (403 Forbidden: bot can't initiate conversation with a user). Untuk mengirim ke grup, bot harus menjadi anggota grup itu.
sendPhoto
POST/bot<token>/sendPhoto
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
chat_id | Integer atau String | Ya | Obrolan tujuan |
photo | InputFile atau String | Ya | Berkas yang diunggah dengan multipart/form-data (hingga 10MB, JPEG/PNG/GIF), atau file_id foto yang pernah diterima. URL belum didukung |
caption | String | Opsional | 0–1.024 karakter |
reply_markup | Sama dengan sendMessage | Opsional | |
disable_notification | Boolean | Opsional |
Mengembalikan: Message yang dikirim (dengan file_id baru di photo)
editMessageText
POST/bot<token>/editMessageText
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
chat_id | Integer atau String | Ya | Obrolan tempat pesan itu berada |
message_id | Integer | Ya | Pesan yang akan diedit (yang dikirim bot) |
text | String | Ya | Teks baru, 1–4.096 karakter |
reply_markup | InlineKeyboardMarkup | Opsional | Tombol baru. Jika dihilangkan, tombolnya ikut hilang (sama seperti Telegram) |
inline_message_id | String | Tidak didukung | 400 karena mode inline tidak ada |
Mengembalikan: Message yang sudah diedit. Perubahan langsung tampil di aplikasi, dan pesan yang diedit oleh manusia datang ke bot sebagai edited_message.
Jika teks dan tombol sama persis dengan sebelumnya, hasilnya 400 Bad Request: message is not modified: …; jika mencoba mengedit pesan milik orang lain, hasilnya 400 Bad Request: message can't be edited.
editMessageCaption
POST/bot<token>/editMessageCaption
Parameternya chat_id, message_id, caption (0–1.024 karakter; jika dihilangkan, keterangan dihapus), dan reply_markup. Mengembalikan: Message yang sudah diedit.
editMessageReplyMarkup
POST/bot<token>/editMessageReplyMarkup
Mengganti tombolnya saja, teks dibiarkan. Parameternya chat_id, message_id, dan reply_markup (jika dihilangkan, tombol dihapus). Mengembalikan: Message yang sudah diedit.
deleteMessage
POST/bot<token>/deleteMessage
Parameternya chat_id dan message_id. Menghapus pesan dari kedua sisi obrolan. Jika pesannya tidak ada, 400 Bad Request: message to delete not found. Mengembalikan: True.
answerCallbackQuery
POST/bot<token>/answerCallbackQuery
Menjawab tombol yang ditekan seseorang (CallbackQuery). Anda bisa menjawab dalam 10 detik dan hanya sekali.
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
callback_query_id | String | Ya | callback_query.id dari update |
text | String | Opsional | Teks yang muncul sebentar di atas layar |
show_alert | Boolean | Opsional | Jika true, ditampilkan dalam jendela dengan tombol OK |
url | String | Opsional | Alamat yang akan dibuka aplikasi |
cache_time | Integer | Opsional | Berapa detik aplikasi mengingat jawaban ini |
Mengembalikan: True. Jika terlambat atau sudah dijawab, 400 Bad Request: query is too old and response timeout expired or query ID is invalid.
sendChatAction
POST/bot<token>/sendChatAction
Diterima demi kompatibilitas dan mengembalikan True, tetapi belum menampilkan "sedang mengetik…" di aplikasi.
getChat
GET/bot<token>/getChat?chat_id=…
Parameternya chat_id (angka). Untuk orang, orang tersebut; untuk grup, hanya grup yang anggotanya termasuk bot. Mengembalikan: Chat. Jika tidak ada atau tidak bisa dilihat, 400 Bad Request: chat not found.
getFile
GET/bot<token>/getFile?file_id=…
Mendapatkan jalur unduhan dari file_id foto yang diterima. Mengembalikan: File. Setelah itu, unduh dari alamat ini.
https://pabal.me/file/bot<token>/<file_path>
file_id juga merupakan hak untuk mengambil foto itu. Jika nilainya salah, 400 Bad Request: wrong file identifier/HTTP URL specified.
setMyCommands
POST/bot<token>/setMyCommands
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
commands | Array of BotCommand | Ya | Maksimal 100 |
language_code | String | Opsional | Disimpan sebagai daftar per bahasa. Saat ini aplikasi hanya menampilkan daftar bawaan tanpa kode bahasa |
scope | BotCommandScope | Diabaikan |
Mengembalikan: True. Jika tidak sesuai aturan perintah, 400 Bad Request: BOT_COMMAND_INVALID.
getMyCommands
GET/bot<token>/getMyCommands
Parameternya language_code (opsional). Mengembalikan: Array of BotCommand.
deleteMyCommands
POST/bot<token>/deleteMyCommands
Parameternya language_code (opsional). Mengosongkan daftar itu. Mengembalikan: True.
logOut · close
Di Telegram, metode ini dipakai saat pindah ke server Bot API lokal. Di Pabal tidak ada tempat untuk pindah, jadi metode ini hanya diterima dan mengembalikan True. Untuk membatalkan token, gunakan /revoke di BotFather.
Objek
Tanda opsional di samping kolom berarti kolom itu bisa saja tidak ada. Kolom Telegram lain yang tidak tercantum di sini tidak dikirim oleh Pabal.
Update
Satu update baru. Berisi update_id dan salah satu dari tiga kolom di bawah.
| Kolom | Tipe | Deskripsi |
|---|---|---|
update_id | Integer | Nomor yang bertambah 1. Dipakai untuk offset pada getUpdates |
message opsional | Message | Pesan baru untuk bot (obrolan 1:1, atau semua pesan di grup yang anggotanya termasuk bot) |
edited_message opsional | Message | Pesan yang diedit |
callback_query opsional | CallbackQuery | Tombol inline ditekan |
User
| Kolom | Tipe | Deskripsi |
|---|---|---|
id | Integer | ID pengguna (hanya bermakna di dalam server ini) |
is_bot | Boolean | true jika bot |
first_name | String | Nama depan. Deleted Account jika akunnya sudah dihapus |
last_name opsional | String | Nama belakang |
username opsional | String | Nama pengguna (tanpa @) |
Chat
| Kolom | Tipe | Deskripsi |
|---|---|---|
id | Integer | Untuk orang, ID orang tersebut (bilangan positif); untuk grup biasa, bilangan negatif |
type | String | private atau group |
title opsional | String | Nama grup (group) |
first_name, last_name, username opsional | String | Nama dan nama pengguna lawan bicara (private) |
Message
| Kolom | Tipe | Deskripsi |
|---|---|---|
message_id | Integer | Nomor pesan di dalam obrolan ini |
from opsional | User | Pengirim |
chat | Chat | Obrolan tempat pesan itu berada |
date | Integer | Waktu dikirim (detik Unix) |
edit_date opsional | Integer | Waktu terakhir diedit |
text opsional | String | Teks (selalu ada jika bukan pesan foto) |
entities opsional | Array of MessageEntity | Perintah, sebutan, URL, dan tagar di dalam teks |
photo opsional | Array of PhotoSize | Foto (di Pabal hanya satu, yaitu ukuran asli) |
caption opsional | String | Keterangan foto |
caption_entities opsional | Array of MessageEntity | Perintah, sebutan, URL, dan tagar di dalam keterangan |
reply_markup opsional | InlineKeyboardMarkup | Tombol inline yang terpasang pada pesan |
MessageEntity
| Kolom | Tipe | Deskripsi |
|---|---|---|
type | String | bot_command, mention, url, hashtag |
offset | Integer | Posisi awal (dalam unit kode UTF-16) |
length | Integer | Panjang (dalam unit kode UTF-16) |
Server otomatis menemukannya di dalam teks dan menambahkannya. Entitas format seperti tebal dan miring belum ada.
PhotoSize
| Kolom | Tipe | Deskripsi |
|---|---|---|
file_id | String | ID untuk mengunduh (getFile) dan mengirim ulang (sendPhoto) |
file_unique_id | String | Bernilai sama untuk foto yang sama, meskipun botnya berbeda. Tidak bisa dipakai untuk mengunduh |
width, height | Integer | Ukuran dalam piksel |
file_size | Integer | Byte |
File
| Kolom | Tipe | Deskripsi |
|---|---|---|
file_id, file_unique_id | String | Sama dengan PhotoSize |
file_size | Integer | Byte |
file_path | String | Berbentuk photos/<file_id>.jpg. Tempelkan di belakang /file/bot<token>/ untuk mengunduh |
CallbackQuery
| Kolom | Tipe | Deskripsi |
|---|---|---|
id | String | ID yang diberikan ke answerCallbackQuery |
from | User | Orang yang menekan tombol |
message opsional | Message | Pesan tempat tombol itu terpasang |
chat_instance | String | Nilai yang mewakili obrolan tersebut |
data opsional | String | callback_data tombol |
InlineKeyboardMarkup
inline_keyboard: Array of Array of InlineKeyboardButton — array luar adalah baris, array dalam adalah tombol-tombol dalam satu baris. Maksimal 100 baris dan 100 tombol per pesan.
InlineKeyboardButton
| Kolom | Tipe | Deskripsi |
|---|---|---|
text | String | Teks tombol |
callback_data salah satu | String | Nilai yang dikirim ke bot saat ditekan, 1–64 byte |
url salah satu | String | Alamat yang dibuka saat ditekan |
Jenis lain seperti switch_inline_query, web_app, login_url, dan pay belum ada (400).
ReplyKeyboardMarkup
| Kolom | Tipe | Deskripsi |
|---|---|---|
keyboard | Array of Array of KeyboardButton | Papan tombol di bawah kolom input |
resize_keyboard, one_time_keyboard, is_persistent, selective opsional | Boolean | Sesuaikan ukuran · sembunyikan setelah sekali pakai · selalu tampil · hanya untuk orang tertentu |
input_field_placeholder opsional | String | Teks petunjuk di kolom input |
KeyboardButton
Satu string, atau objek yang berisi text dan kolom opsional request_contact (kirim kontak saya) serta request_location (kirim lokasi saya), keduanya Boolean.
ReplyKeyboardRemove
{"remove_keyboard": true} — menyembunyikan papan tombol. selective opsional.
ForceReply
{"force_reply": true} — aplikasi membuka kolom input dalam keadaan membalas pesan ini. selective dan input_field_placeholder opsional.
BotCommand
| Kolom | Tipe | Deskripsi |
|---|---|---|
command | String | 1–32 karakter huruf Latin kecil, angka, dan garis bawah (tanpa /) |
description | String | 1–256 karakter |
WebhookInfo
| Kolom | Tipe | Deskripsi |
|---|---|---|
url | String | Alamat webhook; string kosong jika tidak ada |
has_custom_certificate | Boolean | Selalu false |
pending_update_count | Integer | Jumlah update yang menunggu dikirim |
ip_address opsional | String | IP tujuan pengiriman terakhir |
last_error_date opsional | Integer | Waktu kegagalan terakhir (detik Unix) |
last_error_message opsional | String | Alasan kegagalan terakhir (daftar) |
max_connections opsional | Integer | Nilai yang diberikan ke setWebhook |
allowed_updates opsional | Array of String | Nilai yang diberikan ke setWebhook |
Perbedaan dengan Bot API Telegram
- Jenis update: hanya
message,edited_message, dancallback_query. Postingan kanal, inline query, pembayaran, polling, perubahan anggota (my_chat_member), dan lainnya tidak ada. - Format:
parse_modedanentitiesdiabaikan, dan teks dikirim apa adanya. Hanya perintah, sebutan, URL, dan tagar yang ditandai otomatis. - Jenis obrolan: hanya 1:1 dan grup biasa. Kanal, supergrup, dan topik forum tidak ada.
- Media: hanya foto. Dokumen, video, suara, stiker, album, dan pengiriman lewat URL tidak ada.
- Bot di grup: tidak ada mode privasi, jadi bot menerima semua pesan di grup.
- Antrean: update yang belum diambil disimpan di memori, hingga 1.000 update terbaru per bot, dan hilang saat server dimulai ulang (Telegram menyimpannya 24 jam).
- Webhook: dikirim satu per satu secara berurutan (
max_connectionshanya disimpan), sertifikat self-signed tidak diterima, dan tidak ada batasan port. - ID: ID pengguna, pesan, dan berkas hanya bermakna di dalam server ini. Karena tidak ada kanal dan supergrup, ID berbentuk
-100…juga tidak ada. - Metode yang tidak ada: yang tidak tercantum di daftar di atas (
forwardMessage,copyMessage,sendDocument,sendPoll,getChatMember,banChatMember,answerInlineQuery…) menghasilkan404 Not Found: method not found.