ボット開発
Bot API リファレンス
Pabal の HTTP Bot API が受け付けるメソッド、やり取りするオブジェクト、エラーを漏れなくまとめました。Telegram Bot API と互換性があります。
Pabal の HTTP Bot API は、Telegram Bot API と同じアドレス形式・リクエスト・レスポンス・エラーを使います。このドキュメントには、Pabal が実際に受け付けるものだけを記載しています。ここにないメソッドは 404 Not Found: method not found を返します。はじめての方は、ボット作成チュートリアルから読んでください。
リクエストの送信
https://pabal.me/bot<トークン>/<メソッド>
- HTTP メソッド:
GETとPOSTのどちらも使えます。 - パラメーターを送る 4 つの方法 — クエリ文字列(
?chat_id=1&text=hi)、application/x-www-form-urlencoded、application/json、ファイルをアップロードするときのmultipart/form-data。組み合わせて使ってもかまいません。 - オブジェクト型のパラメーター(
reply_markup、commands、allowed_updates)は、JSON 本文ではオブジェクト・配列のまま、フォーム・クエリでは JSON 文字列として入れます。 - メソッド名は大文字と小文字を区別しません(
sendMessage=sendmessage)。 - 本文のサイズは 12MB までです(超えると
413)。 - ファイルのダウンロードは、別のアドレス
https://pabal.me/file/bot<トークン>/<file_path>です(getFile)。
レスポンスとエラー
レスポンスは常に JSON です。成功なら HTTP 200 と result、失敗ならその HTTP ステータスと同じ error_code と、人が読むための description が返ります。
{"ok": true, "result": { … }}{"ok": false, "error_code": 400, "description": "Bad Request: chat not found"}| error_code | 発生する場面 | description の例 |
|---|---|---|
400 | パラメーターが正しくない | 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 | トークンが正しくない | Unauthorized |
403 | 送信する権限がない | Forbidden: bot can't initiate conversation with a user, Forbidden: bot is not a member of the group chat |
404 | 存在しないメソッド・ファイル | Not Found: method not found |
409 | Webhook の設定中に getUpdates を呼んだ | Conflict: can't use getUpdates method while webhook is active; use deleteWebhook to delete the webhook first |
413 | 本文が 12MB を超えた | Request Entity Too Large |
500 | サーバー内部エラー | Internal Server Error |
Pabal はまだリクエストのレート制限(429 Too Many Requests)を設けていませんが、今後導入される可能性があるため、429 を受け取ったら parameters.retry_after 秒待ってから再送するように実装しておいてください。
アップデートの受信
2 つの方法のどちらかを使います。同時には使えません。
getUpdates
POST/bot<トークン>/getUpdates
待機中のアップデートを取得します(ロングポーリング)。Webhook が設定されていると 409。
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
offset | Integer | 任意 | この番号以上のアップデートのみ。これより小さいものは「受信済み」として消えます。最後に処理した update_id + 1 を指定してください。 |
limit | Integer | 任意 | 1〜100、既定 100 |
timeout | Integer | 任意 | 待つ秒数、0〜50、既定 0。25〜30 をおすすめします。 |
allowed_updates | Array of String | 無視 | 受け取りますが使いません。種類で絞り込むには、受け取ったあとで絞り込んでください。 |
戻り値:Array of Update
setWebhook
POST/bot<トークン>/setWebhook
アップデートを HTTPS アドレスで受け取ります。詳しい説明は Webhook のドキュメントにあります。
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
url | String | はい | https:// のグローバルアドレス。空文字列なら Webhook を削除 |
secret_token | String | 任意 | 1〜256 文字、A-Z a-z 0-9 _ -。リクエストヘッダー X-Telegram-Bot-Api-Secret-Token で送る |
allowed_updates | Array of String | 任意 | message、edited_message、callback_query から選択。空ならすべて |
drop_pending_updates | Boolean | 任意 | 待機中のアップデートを破棄 |
max_connections | Integer | 任意 | 1〜100、既定 40。保持するだけで、配信はボットごとに一度に 1 つずつ |
certificate | InputFile | 不可 | 400 — 公的な証明書を使ってください |
ip_address | String | 無視 |
戻り値:True
deleteWebhook
POST/bot<トークン>/deleteWebhook
Webhook を削除して getUpdates に戻ります。Webhook がなくても成功します。
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
drop_pending_updates | Boolean | 任意 | 待機中のアップデートを破棄 |
戻り値:True
getWebhookInfo
GET/bot<トークン>/getWebhookInfo
Webhook の状態。パラメーターなし。Webhook がなければ url は空文字列です。
戻り値:WebhookInfo
メソッド
| メソッド | 内容 |
|---|---|
getMe | ボット自身の情報 |
sendMessage | テキストの送信(ボタンを含む) |
sendPhoto | 写真の送信 |
editMessageText | 送信したメッセージのテキスト・ボタンの編集 |
editMessageCaption | 写真のキャプションの編集 |
editMessageReplyMarkup | ボタンのみの編集 |
deleteMessage | メッセージの削除 |
answerCallbackQuery | ボタンの押下への応答 |
sendChatAction | 「入力中」の表示(受け付けるだけ) |
getChat | チャットの情報 |
getFile | 受け取った写真のダウンロードパス |
setMyCommands · getMyCommands · deleteMyCommands | コマンドメニュー |
logOut · close | 互換性のため(何もしない) |
getUpdates · setWebhook · deleteWebhook · getWebhookInfo | アップデートの受信(上記) |
chat_id に指定できるもの
1:1 の会話なら人の ID(正の数)、基本グループならグループ ID(負の数)、または人のユーザー名("@hana_lee")。いずれもアップデートの chat.id でわかります。チャンネル・スーパーグループの ID(-100…)はまだありません(400 chat not found)。
getMe
GET/bot<トークン>/getMe
トークンが正しいかを確認するときに使います。パラメーターなし。
戻り値:User — ボットの場合は、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<トークン>/sendMessage
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
chat_id | Integer または String | はい | 送信先のチャット(上のボックスを参照) |
text | String | はい | 1〜4,096 文字。文字どおりに送ります |
reply_markup | InlineKeyboardMarkup · ReplyKeyboardMarkup · ReplyKeyboardRemove · ForceReply | 任意 | ボタン |
disable_notification | Boolean | 任意 | 通知音なしで送信 |
parse_mode, entities, reply_parameters, link_preview_options … | 無視 | 受け取りますが使いません。書式は適用されません |
戻り値:送信した Message
人に送るには、その人が先にボットに話しかけている必要があります(403 Forbidden: bot can't initiate conversation with a user)。グループに送るには、ボットがそのグループのメンバーである必要があります。
sendPhoto
POST/bot<トークン>/sendPhoto
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
chat_id | Integer または String | はい | 送信先のチャット |
photo | InputFile または String | はい | multipart/form-data でアップロードしたファイル(10MB まで、JPEG・PNG・GIF)、または以前に受け取った写真の file_id。URL はまだ使えない |
caption | String | 任意 | 0〜1,024 文字 |
reply_markup | sendMessage と同じ | 任意 | |
disable_notification | Boolean | 任意 |
戻り値:送信した Message(photo に新しい file_id)
editMessageText
POST/bot<トークン>/editMessageText
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
chat_id | Integer または String | はい | メッセージのあるチャット |
message_id | Integer | はい | 編集するメッセージ(ボットが送ったもの) |
text | String | はい | 新しいテキスト、1〜4,096 文字 |
reply_markup | InlineKeyboardMarkup | 任意 | 新しいボタン。省略するとボタンが消えます(Telegram と同じ) |
inline_message_id | String | 不可 | インラインモードがないため 400 |
戻り値:編集後の Message。アプリにはすぐ反映され、人が編集したメッセージはボットに edited_message として届きます。
テキストとボタンが以前とまったく同じなら 400 Bad Request: message is not modified: …、他人のメッセージを編集しようとすると 400 Bad Request: message can't be edited になります。
editMessageCaption
POST/bot<トークン>/editMessageCaption
パラメーターは chat_id、message_id、caption(0〜1,024 文字、省略するとキャプションを削除)、reply_markup。戻り値:編集後の Message。
editMessageReplyMarkup
POST/bot<トークン>/editMessageReplyMarkup
テキストはそのままで、ボタンだけを変更します。パラメーターは chat_id、message_id、reply_markup(省略するとボタンを削除)。戻り値:編集後の Message。
deleteMessage
POST/bot<トークン>/deleteMessage
パラメーターは chat_id、message_id。メッセージを会話の双方から削除します。存在しないメッセージなら 400 Bad Request: message to delete not found。戻り値:True。
answerCallbackQuery
POST/bot<トークン>/answerCallbackQuery
人が押したボタン(CallbackQuery)に応答します。10 秒以内に、1 回だけ応答できます。
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
callback_query_id | String | はい | アップデートの callback_query.id |
text | String | 任意 | 画面上部に一瞬表示される文言 |
show_alert | Boolean | 任意 | true なら、OK ボタン付きのダイアログで表示 |
url | String | 任意 | アプリが開くアドレス |
cache_time | Integer | 任意 | アプリがこの応答を記憶する秒数 |
戻り値:True。遅すぎた場合やすでに応答済みの場合は 400 Bad Request: query is too old and response timeout expired or query ID is invalid。
sendChatAction
POST/bot<トークン>/sendChatAction
互換性のために受け付けて True を返しますが、まだアプリに「入力中…」は表示しません。
getChat
GET/bot<トークン>/getChat?chat_id=…
パラメーターは chat_id(数値)。人ならその人、グループならボットがメンバーであるグループのみ。戻り値:Chat。存在しないか閲覧できない場合は 400 Bad Request: chat not found。
getFile
GET/bot<トークン>/getFile?file_id=…
受け取った写真の file_id から、ダウンロード用のパスを取得します。戻り値:File。その後、次のアドレスからダウンロードします。
https://pabal.me/file/bot<トークン>/<file_path>
file_id は、その写真を取得する権利でもあります。無効な値なら 400 Bad Request: wrong file identifier/HTTP URL specified。
setMyCommands
POST/bot<トークン>/setMyCommands
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
commands | Array of BotCommand | はい | 最大 100 個 |
language_code | String | 任意 | 言語別の一覧として保存。アプリには現在、言語コードなしの既定の一覧だけが表示されます |
scope | BotCommandScope | 無視 |
戻り値:True。コマンドのルールに合わない場合は 400 Bad Request: BOT_COMMAND_INVALID。
getMyCommands
GET/bot<トークン>/getMyCommands
パラメーターは language_code(任意)。戻り値:Array of BotCommand。
deleteMyCommands
POST/bot<トークン>/deleteMyCommands
パラメーターは language_code(任意)。その一覧を空にします。戻り値:True。
logOut · close
Telegram では、ローカルの Bot API サーバーへ移行するときに使うメソッドです。Pabal には移行先がないため、受け付けて True を返すだけです。トークンを無効にするには、BotFather の /revoke を使ってください。
オブジェクト
フィールドの横の 任意 は、含まれない場合があることを示します。ここにない Telegram のほかのフィールドを、Pabal は送りません。
Update
1 件の新着。update_id と、下の 3 つのうち1 つが含まれます。
| フィールド | 型 | 説明 |
|---|---|---|
update_id | Integer | 1 ずつ増える番号。getUpdates の offset に使います |
message 任意 | Message | ボットに届いた新しいメッセージ(1:1、またはボットがメンバーであるグループのすべてのメッセージ) |
edited_message 任意 | Message | 編集されたメッセージ |
callback_query 任意 | CallbackQuery | インラインボタンの押下 |
User
| フィールド | 型 | 説明 |
|---|---|---|
id | Integer | ユーザー ID(このサーバー内でのみ意味を持つ) |
is_bot | Boolean | ボットなら true |
first_name | String | 名前。削除されたアカウントなら Deleted Account |
last_name 任意 | String | 姓 |
username 任意 | String | ユーザー名(@ なし) |
Chat
| フィールド | 型 | 説明 |
|---|---|---|
id | Integer | 人ならその人の ID(正の数)、基本グループなら負の数 |
type | String | private または group |
title 任意 | String | グループ名(group) |
first_name, last_name, username 任意 | String | 相手の名前・ユーザー名(private) |
Message
| フィールド | 型 | 説明 |
|---|---|---|
message_id | Integer | この会話の中でのメッセージ番号 |
from 任意 | User | 送信者 |
chat | Chat | メッセージのある会話 |
date | Integer | 送信時刻(Unix 秒) |
edit_date 任意 | Integer | 最後に編集した時刻 |
text 任意 | String | テキスト(写真のメッセージでなければ常にある) |
entities 任意 | Array of MessageEntity | テキスト中のコマンド・メンション・URL・ハッシュタグ |
photo 任意 | Array of PhotoSize | 写真(Pabal では原本 1 つ) |
caption 任意 | String | 写真のキャプション |
caption_entities 任意 | Array of MessageEntity | キャプション中のコマンド・メンション・URL・ハッシュタグ |
reply_markup 任意 | InlineKeyboardMarkup | メッセージに付いたインラインボタン |
MessageEntity
| フィールド | 型 | 説明 |
|---|---|---|
type | String | bot_command, mention, url, hashtag |
offset | Integer | 開始位置(UTF-16 コード単位) |
length | Integer | 長さ(UTF-16 コード単位) |
サーバーがテキストから自動的に見つけて付けます。太字・斜体のような書式のエンティティはまだありません。
PhotoSize
| フィールド | 型 | 説明 |
|---|---|---|
file_id | String | ダウンロード(getFile)と再送信(sendPhoto)に使う ID |
file_unique_id | String | 同じ写真なら、ボットが違っても同じ値。ダウンロードには使えない |
width, height | Integer | ピクセル単位のサイズ |
file_size | Integer | バイト数 |
File
| フィールド | 型 | 説明 |
|---|---|---|
file_id, file_unique_id | String | PhotoSize と同じ |
file_size | Integer | バイト数 |
file_path | String | photos/<file_id>.jpg の形式。/file/bot<トークン>/ の後ろに付けてダウンロードします |
CallbackQuery
| フィールド | 型 | 説明 |
|---|---|---|
id | String | answerCallbackQuery に渡す ID |
from | User | ボタンを押した人 |
message 任意 | Message | ボタンが付いたメッセージ |
chat_instance | String | その会話を表す値 |
data 任意 | String | ボタンの callback_data |
InlineKeyboardMarkup
inline_keyboard:Array of Array of InlineKeyboardButton — 外側の配列が行、内側の配列が 1 行分のボタンです。1 つのメッセージに最大 100 行・100 個。
InlineKeyboardButton
| フィールド | 型 | 説明 |
|---|---|---|
text | String | ボタンの文字 |
callback_data いずれか一方 | String | 押すとボットに送られる値、1〜64 バイト |
url いずれか一方 | String | 押すと開くアドレス |
switch_inline_query、web_app、login_url、pay のようなほかの種類はまだありません(400)。
ReplyKeyboardMarkup
| フィールド | 型 | 説明 |
|---|---|---|
keyboard | Array of Array of KeyboardButton | 入力欄の下のボタンパネル |
resize_keyboard, one_time_keyboard, is_persistent, selective 任意 | Boolean | サイズ調整 · 一度使うと非表示 · 常に表示 · 特定の人にのみ表示 |
input_field_placeholder 任意 | String | 入力欄のプレースホルダー |
KeyboardButton
文字列 1 つ、または text と任意のフィールド request_contact(自分の連絡先を送る)・request_location(現在地を送る、Boolean)を持つオブジェクト。
ReplyKeyboardRemove
{"remove_keyboard": true} — ボタンパネルを隠します。selective は任意。
ForceReply
{"force_reply": true} — アプリが、このメッセージへの返信状態で入力欄を開きます。selective、input_field_placeholder は任意。
BotCommand
| フィールド | 型 | 説明 |
|---|---|---|
command | String | 英小文字・数字・アンダースコアの 1〜32 文字(/ なし) |
description | String | 1〜256 文字 |
WebhookInfo
| フィールド | 型 | 説明 |
|---|---|---|
url | String | Webhook のアドレス。なければ空文字列 |
has_custom_certificate | Boolean | 常に false |
pending_update_count | Integer | 配信を待っているアップデートの数 |
ip_address 任意 | String | 最後に送信した IP |
last_error_date 任意 | Integer | 最後の失敗時刻(Unix 秒) |
last_error_message 任意 | String | 最後の失敗理由(一覧) |
max_connections 任意 | Integer | setWebhook で指定した値 |
allowed_updates 任意 | Array of String | setWebhook で指定した値 |
Telegram Bot API との違い
- アップデートの種類:
message、edited_message、callback_queryのみ届きます。チャンネルの投稿、インラインクエリ、決済、投票、メンバーの変更(my_chat_member)などはありません。 - 書式:
parse_mode・entitiesを無視し、文字どおりに送ります。コマンド・メンション・URL・ハッシュタグだけが自動的に表示されます。 - チャットの種類:1:1 と基本グループのみ。チャンネル・スーパーグループ・フォーラムのトピックはありません。
- メディア:写真のみ。文書・動画・音声・ステッカー・アルバム、URL を指定しての送信はありません。
- グループ内のボット:プライバシーモードがないため、グループのすべてのメッセージを受け取ります。
- キュー:未取得のアップデートはボットごとに直近 1,000 件までメモリに保持し、サーバーの再起動時に消えます(Telegram は 24 時間保持)。
- Webhook:一度に 1 つずつ順番に送り(
max_connectionsは保持のみ)、自己署名証明書は受け付けず、ポートの制限はありません。 - ID:ユーザー・メッセージ・ファイルの ID は、このサーバーの中でのみ意味を持ちます。チャンネル・スーパーグループがないため、
-100…形式の ID もありません。 - 存在しないメソッド:上の一覧にないもの(
forwardMessage、copyMessage、sendDocument、sendPoll、getChatMember、banChatMember、answerInlineQuery…)は404 Not Found: method not found。