開発者ドキュメント
日本語

ボット開発

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 メソッドGETPOST のどちらも使えます。
  • パラメーターを送る 4 つの方法 — クエリ文字列(?chat_id=1&text=hi)、application/x-www-form-urlencodedapplication/json、ファイルをアップロードするときの multipart/form-data。組み合わせて使ってもかまいません。
  • オブジェクト型のパラメーターreply_markupcommandsallowed_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
409Webhook の設定中に 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

パラメーター必須説明
offsetInteger任意この番号以上のアップデートのみ。これより小さいものは「受信済み」として消えます。最後に処理した update_id + 1 を指定してください。
limitInteger任意1〜100、既定 100
timeoutInteger任意待つ秒数、0〜50、既定 0。25〜30 をおすすめします。
allowed_updatesArray of String無視受け取りますが使いません。種類で絞り込むには、受け取ったあとで絞り込んでください。

戻り値:Array of Update

setWebhook

POST/bot<トークン>/setWebhook

アップデートを HTTPS アドレスで受け取ります。詳しい説明は Webhook のドキュメントにあります。

パラメーター必須説明
urlStringはいhttps:// のグローバルアドレス。空文字列なら Webhook を削除
secret_tokenString任意1〜256 文字、A-Z a-z 0-9 _ -。リクエストヘッダー X-Telegram-Bot-Api-Secret-Token で送る
allowed_updatesArray of String任意messageedited_messagecallback_query から選択。空ならすべて
drop_pending_updatesBoolean任意待機中のアップデートを破棄
max_connectionsInteger任意1〜100、既定 40。保持するだけで、配信はボットごとに一度に 1 つずつ
certificateInputFile不可400 — 公的な証明書を使ってください
ip_addressString無視

戻り値:True

deleteWebhook

POST/bot<トークン>/deleteWebhook

Webhook を削除して getUpdates に戻ります。Webhook がなくても成功します。

パラメーター必須説明
drop_pending_updatesBoolean任意待機中のアップデートを破棄

戻り値: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_idInteger または Stringはい送信先のチャット(上のボックスを参照)
textStringはい1〜4,096 文字。文字どおりに送ります
reply_markupInlineKeyboardMarkup · ReplyKeyboardMarkup · ReplyKeyboardRemove · ForceReply任意ボタン
disable_notificationBoolean任意通知音なしで送信
parse_mode, entities, reply_parameters, link_preview_options無視受け取りますが使いません。書式は適用されません

戻り値:送信した Message

人に送るには、その人が先にボットに話しかけている必要があります(403 Forbidden: bot can't initiate conversation with a user)。グループに送るには、ボットがそのグループのメンバーである必要があります。

sendPhoto

POST/bot<トークン>/sendPhoto

パラメーター必須説明
chat_idInteger または Stringはい送信先のチャット
photoInputFile または Stringはいmultipart/form-data でアップロードしたファイル(10MB まで、JPEG・PNG・GIF)、または以前に受け取った写真の file_idURL はまだ使えない
captionString任意0〜1,024 文字
reply_markupsendMessage と同じ任意
disable_notificationBoolean任意

戻り値:送信した Messagephoto に新しい file_id

editMessageText

POST/bot<トークン>/editMessageText

パラメーター必須説明
chat_idInteger または Stringはいメッセージのあるチャット
message_idIntegerはい編集するメッセージ(ボットが送ったもの)
textStringはい新しいテキスト、1〜4,096 文字
reply_markupInlineKeyboardMarkup任意新しいボタン。省略するとボタンが消えます(Telegram と同じ)
inline_message_idString不可インラインモードがないため 400

戻り値:編集後の Message。アプリにはすぐ反映され、人が編集したメッセージはボットに edited_message として届きます。

テキストとボタンが以前とまったく同じなら 400 Bad Request: message is not modified: …、他人のメッセージを編集しようとすると 400 Bad Request: message can't be edited になります。

editMessageCaption

POST/bot<トークン>/editMessageCaption

パラメーターは chat_idmessage_idcaption(0〜1,024 文字、省略するとキャプションを削除)、reply_markup。戻り値:編集後の Message

editMessageReplyMarkup

POST/bot<トークン>/editMessageReplyMarkup

テキストはそのままで、ボタンだけを変更します。パラメーターは chat_idmessage_idreply_markup(省略するとボタンを削除)。戻り値:編集後の Message

deleteMessage

POST/bot<トークン>/deleteMessage

パラメーターは chat_idmessage_id。メッセージを会話の双方から削除します。存在しないメッセージなら 400 Bad Request: message to delete not found。戻り値:True

answerCallbackQuery

POST/bot<トークン>/answerCallbackQuery

人が押したボタン(CallbackQuery)に応答します。10 秒以内に1 回だけ応答できます。

パラメーター必須説明
callback_query_idStringはいアップデートの callback_query.id
textString任意画面上部に一瞬表示される文言
show_alertBoolean任意true なら、OK ボタン付きのダイアログで表示
urlString任意アプリが開くアドレス
cache_timeInteger任意アプリがこの応答を記憶する秒数

戻り値: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

パラメーター必須説明
commandsArray of BotCommandはい最大 100 個
language_codeString任意言語別の一覧として保存。アプリには現在、言語コードなしの既定の一覧だけが表示されます
scopeBotCommandScope無視

戻り値: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_idInteger1 ずつ増える番号。getUpdates の offset に使います
message 任意Messageボットに届いた新しいメッセージ(1:1、またはボットがメンバーであるグループのすべてのメッセージ)
edited_message 任意Message編集されたメッセージ
callback_query 任意CallbackQueryインラインボタンの押下

User

フィールド説明
idIntegerユーザー ID(このサーバー内でのみ意味を持つ)
is_botBooleanボットなら true
first_nameString名前。削除されたアカウントなら Deleted Account
last_name 任意String
username 任意Stringユーザー名(@ なし)

Chat

フィールド説明
idInteger人ならその人の ID(正の数)、基本グループなら負の数
typeStringprivate または group
title 任意Stringグループ名(group)
first_name, last_name, username 任意String相手の名前・ユーザー名(private)

Message

フィールド説明
message_idIntegerこの会話の中でのメッセージ番号
from 任意User送信者
chatChatメッセージのある会話
dateInteger送信時刻(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

フィールド説明
typeStringbot_command, mention, url, hashtag
offsetInteger開始位置(UTF-16 コード単位)
lengthInteger長さ(UTF-16 コード単位)

サーバーがテキストから自動的に見つけて付けます。太字・斜体のような書式のエンティティはまだありません。

PhotoSize

フィールド説明
file_idStringダウンロード(getFile)と再送信(sendPhoto)に使う ID
file_unique_idString同じ写真なら、ボットが違っても同じ値。ダウンロードには使えない
width, heightIntegerピクセル単位のサイズ
file_sizeIntegerバイト数

File

フィールド説明
file_id, file_unique_idStringPhotoSize と同じ
file_sizeIntegerバイト数
file_pathStringphotos/<file_id>.jpg の形式。/file/bot<トークン>/ の後ろに付けてダウンロードします

CallbackQuery

フィールド説明
idStringanswerCallbackQuery に渡す ID
fromUserボタンを押した人
message 任意Messageボタンが付いたメッセージ
chat_instanceStringその会話を表す値
data 任意Stringボタンの callback_data

InlineKeyboardMarkup

inline_keyboardArray of Array of InlineKeyboardButton — 外側の配列が行、内側の配列が 1 行分のボタンです。1 つのメッセージに最大 100 行・100 個。

InlineKeyboardButton

フィールド説明
textStringボタンの文字
callback_data いずれか一方String押すとボットに送られる値、1〜64 バイト
url いずれか一方String押すと開くアドレス

switch_inline_queryweb_applogin_urlpay のようなほかの種類はまだありません(400)。

ReplyKeyboardMarkup

フィールド説明
keyboardArray 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} — アプリが、このメッセージへの返信状態で入力欄を開きます。selectiveinput_field_placeholder は任意。

BotCommand

フィールド説明
commandString英小文字・数字・アンダースコアの 1〜32 文字(/ なし)
descriptionString1〜256 文字

WebhookInfo

フィールド説明
urlStringWebhook のアドレス。なければ空文字列
has_custom_certificateBoolean常に false
pending_update_countInteger配信を待っているアップデートの数
ip_address 任意String最後に送信した IP
last_error_date 任意Integer最後の失敗時刻(Unix 秒)
last_error_message 任意String最後の失敗理由(一覧
max_connections 任意IntegersetWebhook で指定した値
allowed_updates 任意Array of StringsetWebhook で指定した値

Telegram Bot API との違い

  • アップデートの種類messageedited_messagecallback_query のみ届きます。チャンネルの投稿、インラインクエリ、決済、投票、メンバーの変更(my_chat_member)などはありません。
  • 書式parse_modeentities を無視し、文字どおりに送ります。コマンド・メンション・URL・ハッシュタグだけが自動的に表示されます。
  • チャットの種類:1:1 と基本グループのみ。チャンネル・スーパーグループ・フォーラムのトピックはありません。
  • メディア:写真のみ。文書・動画・音声・ステッカー・アルバム、URL を指定しての送信はありません。
  • グループ内のボット:プライバシーモードがないため、グループのすべてのメッセージを受け取ります。
  • キュー:未取得のアップデートはボットごとに直近 1,000 件までメモリに保持し、サーバーの再起動時に消えます(Telegram は 24 時間保持)。
  • Webhook:一度に 1 つずつ順番に送り(max_connections は保持のみ)、自己署名証明書は受け付けず、ポートの制限はありません。
  • ID:ユーザー・メッセージ・ファイルの ID は、このサーバーの中でのみ意味を持ちます。チャンネル・スーパーグループがないため、-100… 形式の ID もありません。
  • 存在しないメソッド:上の一覧にないもの(forwardMessagecopyMessagesendDocumentsendPollgetChatMemberbanChatMemberanswerInlineQuery …)は 404 Not Found: method not found