Tài liệu nhà phát triển
Tiếng Việt

Phát triển bot

Tham chiếu Bot API

Toàn bộ phương thức mà HTTP Bot API của Pabal hỗ trợ, cùng các đối tượng trao đổi và lỗi. Tương thích với Telegram Bot API.

HTTP Bot API của Pabal dùng cùng định dạng địa chỉ, request, phản hồi và lỗi như Telegram Bot API. Tài liệu này chỉ ghi lại những gì Pabal thực sự hỗ trợ. Các phương thức không có ở đây sẽ trả về 404 Not Found: method not found. Nếu bạn mới bắt đầu, hãy xem hướng dẫn tạo bot trước.

Gửi request

https://pabal.me/bot<token>/<phương-thức>
  • Phương thức HTTP: dùng được cả GETPOST.
  • Bốn cách gửi tham số — chuỗi truy vấn (?chat_id=1&text=hi), application/x-www-form-urlencoded, application/json, và multipart/form-data khi tải tệp lên. Có thể kết hợp các cách với nhau.
  • Tham số dạng đối tượng (reply_markup, commands, allowed_updates) được truyền nguyên dạng đối tượng/mảng trong phần thân JSON, còn trong form hay chuỗi truy vấn thì truyền dưới dạng chuỗi JSON.
  • Tên phương thức không phân biệt chữ hoa chữ thường (sendMessage = sendmessage).
  • Kích thước phần thân tối đa 12MB (vượt quá thì trả về 413).
  • Tải tệp xuống dùng địa chỉ riêng https://pabal.me/file/bot<token>/<file_path> (getFile).

Phản hồi và lỗi

Phản hồi luôn là JSON. Nếu thành công thì là HTTP 200 kèm result; nếu thất bại thì là mã trạng thái HTTP tương ứng, kèm error_code trùng với mã đó và description để con người đọc.

{"ok": true, "result": { … }}
{"ok": false, "error_code": 400, "description": "Bad Request: chat not found"}
error_codeKhi nàoVí dụ description
400Tham số saiBad 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
401Token saiUnauthorized
403Không có quyền gửiForbidden: bot can't initiate conversation with a user, Forbidden: bot is not a member of the group chat
404Phương thức hoặc tệp không tồn tạiNot Found: method not found
409Gọi getUpdates khi đang có webhookConflict: can't use getUpdates method while webhook is active; use deleteWebhook to delete the webhook first
413Phần thân vượt quá 12MBRequest Entity Too Large
500Lỗi nội bộ máy chủInternal Server Error

Pabal hiện chưa giới hạn tốc độ request (429 Too Many Requests), nhưng điều này có thể thay đổi trong tương lai, vì vậy hãy viết mã sao cho khi nhận 429 thì đợi parameters.retry_after giây rồi gửi lại.

Nhận update

Dùng một trong hai cách. Không thể dùng cả hai cùng lúc.

getUpdates

POST/bot<token>/getUpdates

Lấy các update đang chờ (long polling). Nếu đang thiết lập webhook thì trả về 409.

Tham sốKiểuBắt buộcMô tả
offsetIntegerTùy chọnChỉ lấy các update có số từ giá trị này trở lên. Những update nhỏ hơn được coi là "đã nhận" và bị xóa. Hãy truyền update_id + 1 của update cuối cùng đã xử lý.
limitIntegerTùy chọn1–100, mặc định 100
timeoutIntegerTùy chọnSố giây chờ, 0–50, mặc định 0. Nên dùng 25–30.
allowed_updatesArray of StringBỏ quaĐược nhận nhưng không dùng. Muốn lọc theo loại thì hãy lọc sau khi nhận.

Trả về: Array of Update

setWebhook

POST/bot<token>/setWebhook

Nhận update tại một địa chỉ HTTPS. Giải thích chi tiết có trong tài liệu Webhook.

Tham sốKiểuBắt buộcMô tả
urlStringĐịa chỉ công khai https://. Chuỗi rỗng sẽ xóa webhook
secret_tokenStringTùy chọn1–256 ký tự, A-Z a-z 0-9 _ -. Được gửi trong header request X-Telegram-Bot-Api-Secret-Token
allowed_updatesArray of StringTùy chọnChọn trong message, edited_message, callback_query. Để trống là nhận tất cả
drop_pending_updatesBooleanTùy chọnBỏ các update đang chờ
max_connectionsIntegerTùy chọn1–100, mặc định 40. Chỉ được lưu lại; mỗi bot được gửi từng update một
certificateInputFileKhông hỗ trợ400 — hãy dùng chứng chỉ công khai
ip_addressStringBỏ qua

Trả về: True

deleteWebhook

POST/bot<token>/deleteWebhook

Xóa webhook và quay lại dùng getUpdates. Vẫn thành công kể cả khi không có webhook.

Tham sốKiểuBắt buộcMô tả
drop_pending_updatesBooleanTùy chọnBỏ các update đang chờ

Trả về: True

getWebhookInfo

GET/bot<token>/getWebhookInfo

Trạng thái webhook. Không có tham số. Nếu không có webhook thì url là chuỗi rỗng.

Trả về: WebhookInfo

Phương thức

Phương thứcTác dụng
getMeThông tin của chính bot
sendMessageGửi văn bản (kể cả nút bấm)
sendPhotoGửi ảnh
editMessageTextSửa nội dung và nút của tin nhắn đã gửi
editMessageCaptionSửa chú thích ảnh
editMessageReplyMarkupChỉ sửa nút
deleteMessageXóa tin nhắn
answerCallbackQueryTrả lời lượt bấm nút
sendChatActionHiển thị "đang nhập" (chỉ nhận yêu cầu)
getChatThông tin cuộc trò chuyện
getFileĐường dẫn tải xuống của ảnh đã nhận
setMyCommands · getMyCommands · deleteMyCommandsMenu lệnh
logOut · closeĐể tương thích (không làm gì cả)
getUpdates · setWebhook · deleteWebhook · getWebhookInfoNhận update (ở trên)
Giá trị có thể dùng cho chat_id

Với trò chuyện 1:1 là ID của người dùng (số dương), với nhóm thường là ID nhóm (số âm), hoặc tên người dùng của người đó ("@hana_lee"). Tất cả đều có thể biết qua chat.id của update. ID của kênh và siêu nhóm (-100…) hiện chưa có (400 chat not found).

getMe

GET/bot<token>/getMe

Dùng để kiểm tra token có đúng không. Không có tham số.

Trả về: User — với bot có thêm can_join_groups (true), can_read_all_group_messages (true), supports_inline_queries (false), can_connect_to_business (false), has_main_web_app (false).

sendMessage

POST/bot<token>/sendMessage

Tham sốKiểuBắt buộcMô tả
chat_idInteger hoặc StringCuộc trò chuyện cần gửi đến (xem khung ở trên)
textString1–4.096 ký tự. Được gửi nguyên văn
reply_markupInlineKeyboardMarkup · ReplyKeyboardMarkup · ReplyKeyboardRemove · ForceReplyTùy chọnNút bấm
disable_notificationBooleanTùy chọnGửi không kèm âm thanh
parse_mode, entities, reply_parameters, link_preview_optionsBỏ quaĐược nhận nhưng không dùng. Định dạng không được áp dụng

Trả về: Message đã gửi

Muốn gửi cho một người thì người đó phải nhắn cho bot trước (403 Forbidden: bot can't initiate conversation with a user). Muốn gửi vào nhóm thì bot phải là thành viên của nhóm đó.

sendPhoto

POST/bot<token>/sendPhoto

Tham sốKiểuBắt buộcMô tả
chat_idInteger hoặc StringCuộc trò chuyện cần gửi đến
photoInputFile hoặc StringTệp tải lên bằng multipart/form-data (tối đa 10MB, JPEG, PNG, GIF), hoặc file_id của ảnh đã nhận trước đó. Chưa hỗ trợ URL
captionStringTùy chọn0–1.024 ký tự
reply_markupGiống sendMessageTùy chọn
disable_notificationBooleanTùy chọn

Trả về: Message đã gửi (có file_id mới trong photo)

editMessageText

POST/bot<token>/editMessageText

Tham sốKiểuBắt buộcMô tả
chat_idInteger hoặc StringCuộc trò chuyện chứa tin nhắn
message_idIntegerTin nhắn cần sửa (do bot gửi)
textStringNội dung mới, 1–4.096 ký tự
reply_markupInlineKeyboardMarkupTùy chọnNút mới. Nếu bỏ đi thì nút sẽ biến mất (giống Telegram)
inline_message_idStringKhông hỗ trợChưa có chế độ inline nên trả về 400

Trả về: Message đã sửa. Thay đổi hiện ngay trong ứng dụng; tin nhắn do người dùng sửa sẽ đến bot dưới dạng edited_message.

Nếu nội dung và nút giống hệt trước thì trả về 400 Bad Request: message is not modified: …; nếu cố sửa tin nhắn của người khác thì là 400 Bad Request: message can't be edited.

editMessageCaption

POST/bot<token>/editMessageCaption

Tham số gồm chat_id, message_id, caption (0–1.024 ký tự, bỏ đi thì chú thích bị xóa), reply_markup. Trả về: Message đã sửa.

editMessageReplyMarkup

POST/bot<token>/editMessageReplyMarkup

Giữ nguyên nội dung, chỉ đổi nút. Tham số gồm chat_id, message_id, reply_markup (bỏ đi thì nút bị xóa). Trả về: Message đã sửa.

deleteMessage

POST/bot<token>/deleteMessage

Tham số gồm chat_id, message_id. Xóa tin nhắn ở cả hai phía của cuộc trò chuyện. Nếu tin nhắn không tồn tại thì trả về 400 Bad Request: message to delete not found. Trả về: True.

answerCallbackQuery

POST/bot<token>/answerCallbackQuery

Trả lời nút mà người dùng đã bấm (CallbackQuery). Chỉ có thể trả lời trong vòng 10 giâymột lần duy nhất.

Tham sốKiểuBắt buộcMô tả
callback_query_idStringcallback_query.id của update
textStringTùy chọnDòng chữ hiện thoáng qua ở đầu màn hình
show_alertBooleanTùy chọnNếu true thì hiện hộp thoại có nút xác nhận
urlStringTùy chọnĐịa chỉ để ứng dụng mở
cache_timeIntegerTùy chọnSố giây ứng dụng ghi nhớ câu trả lời này

Trả về: True. Nếu quá muộn hoặc đã trả lời rồi thì là 400 Bad Request: query is too old and response timeout expired or query ID is invalid.

sendChatAction

POST/bot<token>/sendChatAction

Được nhận để tương thích và trả về True, nhưng hiện chưa hiển thị "đang nhập…" trong ứng dụng.

getChat

GET/bot<token>/getChat?chat_id=…

Tham số là chat_id (số). Nếu là người thì trả về người đó; nếu là nhóm thì chỉ những nhóm mà bot là thành viên. Trả về: Chat. Nếu không tồn tại hoặc không được xem thì trả về 400 Bad Request: chat not found.

getFile

GET/bot<token>/getFile?file_id=…

Dùng file_id của ảnh đã nhận để lấy đường dẫn tải xuống. Trả về: File. Sau đó tải xuống từ địa chỉ này.

https://pabal.me/file/bot<token>/<file_path>

file_id cũng chính là quyền lấy ảnh đó. Nếu giá trị không hợp lệ thì trả về 400 Bad Request: wrong file identifier/HTTP URL specified.

setMyCommands

POST/bot<token>/setMyCommands

Tham sốKiểuBắt buộcMô tả
commandsArray of BotCommandTối đa 100 lệnh
language_codeStringTùy chọnLưu thành danh sách riêng cho ngôn ngữ đó. Hiện ứng dụng chỉ hiển thị danh sách mặc định (không có mã ngôn ngữ)
scopeBotCommandScopeBỏ qua

Trả về: True. Nếu không đúng quy tắc đặt lệnh thì trả về 400 Bad Request: BOT_COMMAND_INVALID.

getMyCommands

GET/bot<token>/getMyCommands

Tham số là language_code (tùy chọn). Trả về: Array of BotCommand.

deleteMyCommands

POST/bot<token>/deleteMyCommands

Tham số là language_code (tùy chọn). Làm trống danh sách đó. Trả về: True.

logOut · close

Trên Telegram, đây là các phương thức dùng khi chuyển sang máy chủ Bot API cục bộ. Pabal không có nơi nào để chuyển sang, nên chỉ nhận yêu cầu và trả về True. Muốn vô hiệu hóa token, hãy dùng /revoke của BotFather.

Đối tượng

tùy chọn bên cạnh một trường nghĩa là trường đó có thể không có. Những trường khác của Telegram không được liệt kê ở đây thì Pabal không gửi.

Update

Một tin mới. Chứa update_idmột trong ba trường dưới đây.

TrườngKiểuMô tả
update_idIntegerSố tăng dần thêm 1. Dùng cho offset của getUpdates
message tùy chọnMessageTin nhắn mới gửi đến bot (1:1, hoặc mọi tin nhắn trong nhóm mà bot là thành viên)
edited_message tùy chọnMessageTin nhắn đã được sửa
callback_query tùy chọnCallbackQueryLượt bấm nút inline

User

TrườngKiểuMô tả
idIntegerID người dùng (chỉ có nghĩa bên trong máy chủ này)
is_botBooleantrue nếu là bot
first_nameStringTên. Với tài khoản đã bị xóa là Deleted Account
last_name tùy chọnStringHọ
username tùy chọnStringTên người dùng (không có @)

Chat

TrườngKiểuMô tả
idIntegerVới người là ID của người đó (số dương), với nhóm thường là số âm
typeStringprivate hoặc group
title tùy chọnStringTên nhóm (group)
first_name, last_name, username tùy chọnStringTên và tên người dùng của người kia (private)

Message

TrườngKiểuMô tả
message_idIntegerSố hiệu tin nhắn trong cuộc trò chuyện này
from tùy chọnUserNgười gửi
chatChatCuộc trò chuyện chứa tin nhắn
dateIntegerThời điểm gửi (giây Unix)
edit_date tùy chọnIntegerThời điểm sửa gần nhất
text tùy chọnStringNội dung văn bản (luôn có nếu không phải tin nhắn ảnh)
entities tùy chọnArray of MessageEntityLệnh, lượt nhắc, URL, hashtag trong văn bản
photo tùy chọnArray of PhotoSizeẢnh (Pabal chỉ có một ảnh gốc)
caption tùy chọnStringChú thích ảnh
caption_entities tùy chọnArray of MessageEntityLệnh, lượt nhắc, URL, hashtag trong chú thích
reply_markup tùy chọnInlineKeyboardMarkupCác nút inline gắn trên tin nhắn

MessageEntity

TrườngKiểuMô tả
typeStringbot_command, mention, url, hashtag
offsetIntegerVị trí bắt đầu (tính theo đơn vị mã UTF-16)
lengthIntegerĐộ dài (tính theo đơn vị mã UTF-16)

Máy chủ tự tìm trong văn bản và gắn vào. Các entity định dạng như in đậm, in nghiêng hiện chưa có.

PhotoSize

TrườngKiểuMô tả
file_idStringID dùng để tải xuống (getFile) và gửi lại (sendPhoto)
file_unique_idStringCùng một ảnh thì giá trị như nhau dù là bot khác. Không dùng để tải xuống được
width, heightIntegerKích thước tính bằng pixel
file_sizeIntegerByte

File

TrườngKiểuMô tả
file_id, file_unique_idStringGiống PhotoSize
file_sizeIntegerByte
file_pathStringCó dạng photos/<file_id>.jpg. Ghép vào sau /file/bot<token>/ để tải xuống

CallbackQuery

TrườngKiểuMô tả
idStringID truyền cho answerCallbackQuery
fromUserNgười đã bấm nút
message tùy chọnMessageTin nhắn có gắn nút
chat_instanceStringGiá trị đại diện cho cuộc trò chuyện đó
data tùy chọnStringcallback_data của nút

InlineKeyboardMarkup

inline_keyboard: Array of Array of InlineKeyboardButton — mảng bên ngoài là các hàng, mảng bên trong là các nút của một hàng. Mỗi tin nhắn tối đa 100 hàng và 100 nút.

InlineKeyboardButton

TrườngKiểuMô tả
textStringChữ trên nút
callback_data một trong haiStringGiá trị gửi đến bot khi bấm, 1–64 byte
url một trong haiStringĐịa chỉ mở ra khi bấm

Các loại khác như switch_inline_query, web_app, login_url, pay hiện chưa có (400).

ReplyKeyboardMarkup

TrườngKiểuMô tả
keyboardArray of Array of KeyboardButtonBảng nút bên dưới ô nhập
resize_keyboard, one_time_keyboard, is_persistent, selective tùy chọnBooleanVừa kích thước · ẩn sau một lần dùng · luôn hiển thị · chỉ cho một số người
input_field_placeholder tùy chọnStringChữ gợi ý trong ô nhập

KeyboardButton

Một chuỗi, hoặc một đối tượng có text cùng các trường tùy chọn request_contact (gửi liên hệ của tôi) và request_location (gửi vị trí của tôi, Boolean).

ReplyKeyboardRemove

{"remove_keyboard": true} — ẩn bảng nút. selective là tùy chọn.

ForceReply

{"force_reply": true} — ứng dụng mở ô nhập ở trạng thái trả lời tin nhắn này. selective, input_field_placeholder là tùy chọn.

BotCommand

TrườngKiểuMô tả
commandString1–32 ký tự gồm chữ Latin thường, chữ số, dấu gạch dưới (không có /)
descriptionString1–256 ký tự

WebhookInfo

TrườngKiểuMô tả
urlStringĐịa chỉ webhook, chuỗi rỗng nếu không có
has_custom_certificateBooleanLuôn là false
pending_update_countIntegerSố update đang chờ được chuyển
ip_address tùy chọnStringIP đã gửi đến lần gần nhất
last_error_date tùy chọnIntegerThời điểm thất bại gần nhất (giây Unix)
last_error_message tùy chọnStringLý do thất bại gần nhất (danh sách)
max_connections tùy chọnIntegerGiá trị đã truyền cho setWebhook
allowed_updates tùy chọnArray of StringGiá trị đã truyền cho setWebhook

Khác biệt so với Telegram Bot API

  • Loại update: chỉ có message, edited_message, callback_query. Không có bài đăng kênh, truy vấn inline, thanh toán, bình chọn, thay đổi thành viên (my_chat_member)…
  • Định dạng: bỏ qua parse_modeentities, gửi nguyên văn. Chỉ lệnh, lượt nhắc, URL và hashtag được đánh dấu tự động.
  • Loại cuộc trò chuyện: chỉ có 1:1 và nhóm thường. Không có kênh, siêu nhóm, chủ đề diễn đàn.
  • Phương tiện: chỉ có ảnh. Không có tài liệu, video, âm thanh, sticker, album, cũng như gửi bằng URL.
  • Bot trong nhóm: không có chế độ riêng tư, nên bot nhận mọi tin nhắn của nhóm.
  • Hàng đợi: update chưa lấy được giữ trong bộ nhớ, tối đa 1.000 update gần nhất cho mỗi bot, và mất khi máy chủ khởi động lại (Telegram giữ 24 giờ).
  • Webhook: gửi lần lượt từng update theo thứ tự (max_connections chỉ được lưu lại), không nhận chứng chỉ tự ký, không giới hạn cổng.
  • ID: ID người dùng, tin nhắn và tệp chỉ có nghĩa bên trong máy chủ này. Vì không có kênh và siêu nhóm nên cũng không có ID dạng -100….
  • Phương thức không có: những phương thức không có trong danh sách trên (forwardMessage, copyMessage, sendDocument, sendPoll, getChatMember, banChatMember, answerInlineQuery …) đều trả về 404 Not Found: method not found.