Développement de bots
Référence de la Bot API
Toutes les méthodes acceptées par la Bot API HTTP de Pabal, les objets échangés et les erreurs, sans exception. Compatible avec la Bot API de Telegram.
La Bot API HTTP de Pabal utilise le même format d'adresse, de requêtes, de réponses et d'erreurs que la Bot API de Telegram. Cette page ne décrit que ce que Pabal accepte réellement. Une méthode qui n'y figure pas renvoie 404 Not Found: method not found. Si vous débutez, commencez par le tutoriel de création de bot.
Envoyer une requête
https://pabal.me/bot<jeton>/<méthode>
- Méthode HTTP :
GETetPOSTfonctionnent tous les deux. - Quatre façons d'envoyer les paramètres : chaîne de requête (
?chat_id=1&text=hi),application/x-www-form-urlencoded,application/json, etmultipart/form-datapour envoyer des fichiers. Vous pouvez les combiner. - Les paramètres de type objet (
reply_markup,commands,allowed_updates) se passent tels quels (objet ou tableau) dans un corps JSON, et sous forme de chaîne JSON dans un formulaire ou une chaîne de requête. - Les noms de méthode ne tiennent pas compte de la casse (
sendMessage=sendmessage). - La taille du corps est limitée à 12 Mo (au-delà :
413). - Le téléchargement de fichiers se fait à part, via
https://pabal.me/file/bot<jeton>/<file_path>(getFile).
Réponses et erreurs
La réponse est toujours du JSON. En cas de succès : HTTP 200 et result ; en cas d'échec : un error_code égal au statut HTTP et une description lisible par un humain.
{"ok": true, "result": { … }}{"ok": false, "error_code": 400, "description": "Bad Request: chat not found"}| error_code | Quand | Exemples de description |
|---|---|---|
400 | Paramètre incorrect | 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 | Jeton incorrect | Unauthorized |
403 | Pas le droit d'envoyer | Forbidden: bot can't initiate conversation with a user, Forbidden: bot is not a member of the group chat |
404 | Méthode ou fichier inexistant | Not Found: method not found |
409 | getUpdates alors qu'un webhook est configuré | Conflict: can't use getUpdates method while webhook is active; use deleteWebhook to delete the webhook first |
413 | Corps de plus de 12 Mo | Request Entity Too Large |
500 | Erreur interne du serveur | Internal Server Error |
Pabal n'impose pas encore de limite de débit (429 Too Many Requests), mais cela pourrait venir : prévoyez dès maintenant qu'en cas de 429, votre code attende parameters.retry_after secondes avant de renvoyer la requête.
Recevoir les mises à jour
Utilisez l'une des deux méthodes. Il est impossible d'utiliser les deux en même temps.
getUpdates
POST/bot<jeton>/getUpdates
Récupère les mises à jour en attente (long polling). Si un webhook est configuré : 409.
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
offset | Integer | Facultatif | Seulement les mises à jour de ce numéro ou au-delà. Les précédentes sont effacées comme « reçues ». Passez le dernier update_id + 1 traité. |
limit | Integer | Facultatif | 1 à 100, 100 par défaut |
timeout | Integer | Facultatif | Secondes d'attente, de 0 à 50, 0 par défaut. Une valeur de 25 à 30 est recommandée. |
allowed_updates | Array of String | Ignoré | Accepté mais non utilisé. Pour filtrer par type, filtrez après réception. |
Renvoie : Array of Update
setWebhook
POST/bot<jeton>/setWebhook
Reçoit les mises à jour sur une adresse HTTPS. Tous les détails sont dans la page Webhooks.
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
url | String | Oui | Adresse publique https://. Une chaîne vide supprime le webhook |
secret_token | String | Facultatif | 1 à 256 caractères, A-Z a-z 0-9 _ -. Envoyé dans l'en-tête de requête X-Telegram-Bot-Api-Secret-Token |
allowed_updates | Array of String | Facultatif | Parmi message, edited_message, callback_query. Vide = tous |
drop_pending_updates | Boolean | Facultatif | Jette les mises à jour en attente |
max_connections | Integer | Facultatif | 1 à 100, 40 par défaut. Seulement conservé : la livraison se fait une requête à la fois par bot |
certificate | InputFile | Non pris en charge | 400 — utilisez un certificat public |
ip_address | String | Ignoré |
Renvoie : True
deleteWebhook
POST/bot<jeton>/deleteWebhook
Supprime le webhook et revient à getUpdates. Réussit même s'il n'y a pas de webhook.
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
drop_pending_updates | Boolean | Facultatif | Jette les mises à jour en attente |
Renvoie : True
getWebhookInfo
GET/bot<jeton>/getWebhookInfo
État du webhook. Aucun paramètre. S'il n'y a pas de webhook, url est une chaîne vide.
Renvoie : WebhookInfo
Méthodes
| Méthode | Ce qu'elle fait |
|---|---|
getMe | Informations sur le bot lui-même |
sendMessage | Envoyer un texte (boutons compris) |
sendPhoto | Envoyer une photo |
editMessageText | Modifier le texte et les boutons d'un message envoyé |
editMessageCaption | Modifier la légende d'une photo |
editMessageReplyMarkup | Modifier seulement les boutons |
deleteMessage | Supprimer un message |
answerCallbackQuery | Répondre à un appui sur un bouton |
sendChatAction | Indicateur « en train d'écrire » (seulement accepté) |
getChat | Informations sur une conversation |
getFile | Chemin de téléchargement d'une photo reçue |
setMyCommands · getMyCommands · deleteMyCommands | Menu des commandes |
logOut · close | Pour compatibilité (ne font rien) |
getUpdates · setWebhook · deleteWebhook · getWebhookInfo | Recevoir les mises à jour (ci-dessus) |
chat_id
Pour une conversation 1:1, l'ID de la personne (positif) ; pour un groupe simple, l'ID du groupe (négatif) ; ou encore le nom d'utilisateur de la personne ("@hana_lee"). Toutes ces valeurs se retrouvent dans le chat.id des mises à jour. Les ID de canaux et de supergroupes (-100…) n'existent pas encore (400 chat not found).
getMe
GET/bot<jeton>/getMe
Sert à vérifier que le jeton est correct. Aucun paramètre.
Renvoie : User — pour un bot, s'y ajoutent can_join_groups (true), can_read_all_group_messages (true), supports_inline_queries (false), can_connect_to_business (false) et has_main_web_app (false).
sendMessage
POST/bot<jeton>/sendMessage
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
chat_id | Integer ou String | Oui | Conversation de destination (voir l'encadré ci-dessus) |
text | String | Oui | 1 à 4 096 caractères. Envoyé tel quel |
reply_markup | InlineKeyboardMarkup · ReplyKeyboardMarkup · ReplyKeyboardRemove · ForceReply | Facultatif | Boutons |
disable_notification | Boolean | Facultatif | Envoyer sans son |
parse_mode, entities, reply_parameters, link_preview_options … | Ignoré | Acceptés mais non utilisés. Aucune mise en forme n'est appliquée |
Renvoie : le Message envoyé
Pour écrire à une personne, il faut que celle-ci ait parlé au bot la première (403 Forbidden: bot can't initiate conversation with a user). Pour écrire dans un groupe, le bot doit être membre de ce groupe.
sendPhoto
POST/bot<jeton>/sendPhoto
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
chat_id | Integer ou String | Oui | Conversation de destination |
photo | InputFile ou String | Oui | Fichier envoyé en multipart/form-data (10 Mo maximum, JPEG, PNG ou GIF), ou file_id d'une photo reçue auparavant. Pas encore d'URL |
caption | String | Facultatif | 0 à 1 024 caractères |
reply_markup | Comme pour sendMessage | Facultatif | |
disable_notification | Boolean | Facultatif |
Renvoie : le Message envoyé (avec un nouveau file_id dans photo)
editMessageText
POST/bot<jeton>/editMessageText
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
chat_id | Integer ou String | Oui | Conversation contenant le message |
message_id | Integer | Oui | Message à modifier (envoyé par le bot) |
text | String | Oui | Nouveau texte, 1 à 4 096 caractères |
reply_markup | InlineKeyboardMarkup | Facultatif | Nouveaux boutons. Sans ce paramètre, les boutons disparaissent (comme chez Telegram) |
inline_message_id | String | Non pris en charge | 400, car le mode inline n'existe pas |
Renvoie : le Message modifié. La modification apparaît aussitôt dans l'application ; un message modifié par une personne arrive au bot sous forme d'edited_message.
Si le texte et les boutons sont identiques à avant : 400 Bad Request: message is not modified: … ; si vous tentez de modifier le message de quelqu'un d'autre : 400 Bad Request: message can't be edited.
editMessageCaption
POST/bot<jeton>/editMessageCaption
Paramètres : chat_id, message_id, caption (0 à 1 024 caractères ; sans ce paramètre, la légende est supprimée), reply_markup. Renvoie : le Message modifié.
editMessageReplyMarkup
POST/bot<jeton>/editMessageReplyMarkup
Change seulement les boutons, sans toucher au texte. Paramètres : chat_id, message_id, reply_markup (sans ce paramètre, les boutons sont supprimés). Renvoie : le Message modifié.
deleteMessage
POST/bot<jeton>/deleteMessage
Paramètres : chat_id, message_id. Supprime le message des deux côtés de la conversation. Si le message n'existe pas : 400 Bad Request: message to delete not found. Renvoie : True.
answerCallbackQuery
POST/bot<jeton>/answerCallbackQuery
Répond au bouton sur lequel une personne a appuyé (CallbackQuery). On ne peut répondre que dans les 10 secondes, et une seule fois.
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
callback_query_id | String | Oui | Le callback_query.id de la mise à jour |
text | String | Facultatif | Texte affiché brièvement en haut de l'écran |
show_alert | Boolean | Facultatif | Si true, une fenêtre avec un bouton de confirmation |
url | String | Facultatif | Adresse que l'application doit ouvrir |
cache_time | Integer | Facultatif | Durée en secondes pendant laquelle l'application mémorise cette réponse |
Renvoie : True. Trop tard ou déjà répondu : 400 Bad Request: query is too old and response timeout expired or query ID is invalid.
sendChatAction
POST/bot<jeton>/sendChatAction
Acceptée par souci de compatibilité, elle renvoie True, mais n'affiche pas encore « en train d'écrire… » dans l'application.
getChat
GET/bot<jeton>/getChat?chat_id=…
Paramètre : chat_id (nombre). Pour une personne, cette personne ; pour un groupe, uniquement un groupe dont le bot est membre. Renvoie : Chat. Inexistant ou non visible : 400 Bad Request: chat not found.
getFile
GET/bot<jeton>/getFile?file_id=…
Obtient le chemin de téléchargement à partir du file_id d'une photo reçue. Renvoie : File. Téléchargez ensuite à cette adresse :
https://pabal.me/file/bot<jeton>/<file_path>
Le file_id vaut aussi droit de récupérer cette photo. Valeur incorrecte : 400 Bad Request: wrong file identifier/HTTP URL specified.
setMyCommands
POST/bot<jeton>/setMyCommands
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
commands | Array of BotCommand | Oui | 100 au maximum |
language_code | String | Facultatif | Enregistré comme liste propre à cette langue. L'application n'affiche pour l'instant que la liste par défaut, sans code de langue |
scope | BotCommandScope | Ignoré |
Renvoie : True. Si les commandes ne respectent pas les règles : 400 Bad Request: BOT_COMMAND_INVALID.
getMyCommands
GET/bot<jeton>/getMyCommands
Paramètre : language_code (facultatif). Renvoie : Array of BotCommand.
deleteMyCommands
POST/bot<jeton>/deleteMyCommands
Paramètre : language_code (facultatif). Vide la liste correspondante. Renvoie : True.
logOut · close
Chez Telegram, ces méthodes servent à migrer vers un serveur Bot API local. Pabal n'ayant nulle part où migrer, il les accepte simplement et renvoie True. Pour invalider un jeton, utilisez /revoke auprès de BotFather.
Objets
La mention facultatif à côté d'un champ signifie qu'il peut être absent. Les autres champs de Telegram qui ne figurent pas ici ne sont pas envoyés par Pabal.
Update
Une nouveauté. Contient update_id et un seul des trois champs ci-dessous.
| Champ | Type | Description |
|---|---|---|
update_id | Integer | Numéro qui augmente de 1. Sert d'offset pour getUpdates |
message facultatif | Message | Nouveau message adressé au bot (en 1:1, ou tous les messages d'un groupe dont le bot est membre) |
edited_message facultatif | Message | Message modifié |
callback_query facultatif | CallbackQuery | Appui sur un bouton inline |
User
| Champ | Type | Description |
|---|---|---|
id | Integer | ID d'utilisateur (n'a de sens que sur ce serveur) |
is_bot | Boolean | true pour un bot |
first_name | String | Prénom. Deleted Account pour un compte supprimé |
last_name facultatif | String | Nom de famille |
username facultatif | String | Nom d'utilisateur (sans @) |
Chat
| Champ | Type | Description |
|---|---|---|
id | Integer | Pour une personne, son ID (positif) ; pour un groupe simple, un nombre négatif |
type | String | private ou group |
title facultatif | String | Nom du groupe (group) |
first_name, last_name, username facultatif | String | Nom et nom d'utilisateur de l'interlocuteur (private) |
Message
| Champ | Type | Description |
|---|---|---|
message_id | Integer | Numéro du message dans cette conversation |
from facultatif | User | Expéditeur |
chat | Chat | Conversation contenant le message |
date | Integer | Heure d'envoi (secondes Unix) |
edit_date facultatif | Integer | Heure de la dernière modification |
text facultatif | String | Texte (toujours présent, sauf pour un message photo) |
entities facultatif | Array of MessageEntity | Commandes, mentions, URL et hashtags du texte |
photo facultatif | Array of PhotoSize | Photo (chez Pabal, l'original seul) |
caption facultatif | String | Légende de la photo |
caption_entities facultatif | Array of MessageEntity | Commandes, mentions, URL et hashtags de la légende |
reply_markup facultatif | InlineKeyboardMarkup | Boutons inline attachés au message |
MessageEntity
| Champ | Type | Description |
|---|---|---|
type | String | bot_command, mention, url, hashtag |
offset | Integer | Position de début (en unités de code UTF-16) |
length | Integer | Longueur (en unités de code UTF-16) |
Le serveur les détecte et les ajoute automatiquement à partir du texte. Les entités de mise en forme comme le gras ou l'italique n'existent pas encore.
PhotoSize
| Champ | Type | Description |
|---|---|---|
file_id | String | ID utilisé pour télécharger (getFile) et pour renvoyer (sendPhoto) |
file_unique_id | String | Même valeur pour une même photo, même d'un bot à l'autre. Inutilisable pour télécharger |
width, height | Integer | Dimensions en pixels |
file_size | Integer | Octets |
File
| Champ | Type | Description |
|---|---|---|
file_id, file_unique_id | String | Comme pour PhotoSize |
file_size | Integer | Octets |
file_path | String | De la forme photos/<file_id>.jpg. À ajouter après /file/bot<jeton>/ pour télécharger |
CallbackQuery
| Champ | Type | Description |
|---|---|---|
id | String | ID à passer à answerCallbackQuery |
from | User | Personne qui a appuyé sur le bouton |
message facultatif | Message | Message portant le bouton |
chat_instance | String | Valeur représentant cette conversation |
data facultatif | String | Le callback_data du bouton |
InlineKeyboardMarkup
inline_keyboard : Array of Array of InlineKeyboardButton — le tableau externe contient les rangées, chaque tableau interne les boutons d'une rangée. Au maximum 100 rangées et 100 boutons par message.
InlineKeyboardButton
| Champ | Type | Description |
|---|---|---|
text | String | Texte du bouton |
callback_data l'un des deux | String | Valeur envoyée au bot quand on appuie, 1 à 64 octets |
url l'un des deux | String | Adresse ouverte quand on appuie |
Les autres types, comme switch_inline_query, web_app, login_url ou pay, n'existent pas encore (400).
ReplyKeyboardMarkup
| Champ | Type | Description |
|---|---|---|
keyboard | Array of Array of KeyboardButton | Pavé de boutons sous le champ de saisie |
resize_keyboard, one_time_keyboard, is_persistent, selective facultatif | Boolean | Ajuster la taille · masquer après usage · toujours visible · seulement pour certaines personnes |
input_field_placeholder facultatif | String | Texte indicatif dans le champ de saisie |
KeyboardButton
Une simple chaîne, ou un objet avec text et les champs facultatifs request_contact (envoyer mon contact) et request_location (envoyer ma position), de type Boolean.
ReplyKeyboardRemove
{"remove_keyboard": true} — masque le pavé de boutons. selective facultatif.
ForceReply
{"force_reply": true} — l'application ouvre le champ de saisie en mode réponse à ce message. selective et input_field_placeholder facultatifs.
BotCommand
| Champ | Type | Description |
|---|---|---|
command | String | 1 à 32 caractères : minuscules latines, chiffres, tiret bas (sans /) |
description | String | 1 à 256 caractères |
WebhookInfo
| Champ | Type | Description |
|---|---|---|
url | String | Adresse du webhook, chaîne vide s'il n'y en a pas |
has_custom_certificate | Boolean | Toujours false |
pending_update_count | Integer | Nombre de mises à jour en attente de livraison |
ip_address facultatif | String | Dernière IP vers laquelle un envoi a eu lieu |
last_error_date facultatif | Integer | Heure du dernier échec (secondes Unix) |
last_error_message facultatif | String | Raison du dernier échec (liste) |
max_connections facultatif | Integer | Valeur passée à setWebhook |
allowed_updates facultatif | Array of String | Valeur passée à setWebhook |
Différences avec la Bot API de Telegram
- Types de mises à jour : seuls
message,edited_messageetcallback_queryarrivent. Pas de publications de canal, de requêtes inline, de paiements, de sondages, de changements de membres (my_chat_member), etc. - Mise en forme :
parse_modeetentitiessont ignorés et le texte est envoyé tel quel. Seuls les commandes, mentions, URL et hashtags sont mis en évidence automatiquement. - Types de conversation : 1:1 et groupes simples uniquement. Pas de canaux, de supergroupes ni de sujets de forum.
- Médias : photos uniquement. Pas de documents, vidéos, audio, stickers ni albums, et pas d'envoi par URL.
- Bots dans les groupes : il n'y a pas de mode confidentialité, le bot reçoit donc tous les messages du groupe.
- File d'attente : les mises à jour non récupérées sont gardées en mémoire, jusqu'aux 1 000 plus récentes par bot, et perdues au redémarrage du serveur (Telegram les conserve 24 heures).
- Webhooks : envoi d'une requête à la fois, dans l'ordre (
max_connectionsest seulement conservé), pas de certificats auto-signés, aucune restriction de port. - ID : les ID d'utilisateur, de message et de fichier n'ont de sens que sur ce serveur. Comme il n'y a ni canaux ni supergroupes, il n'existe pas non plus d'ID de la forme
-100…. - Méthodes absentes : celles qui ne figurent pas dans la liste ci-dessus (
forwardMessage,copyMessage,sendDocument,sendPoll,getChatMember,banChatMember,answerInlineQuery…) renvoient404 Not Found: method not found.