电报机器人按钮
用户可以通过电报机器人按钮,甚至直接在任何聊天窗口中通过内联按钮与您的机器人进行交互。本文将使用 MTProto API 详细介绍完整的按钮流程。
有关使用 HTTP 机器人 API 的简化说明,请参见此处 »。
按钮
keyboardButton#a2fa4880 text:string = KeyboardButton; keyboardButtonUrl#258aff05 text:string url:string = KeyboardButton; keyboardButtonCallback#35bbdb6b flags:# requires_password:flags.0?true text:string data:bytes = KeyboardButton; keyboardButtonRequestPhone#b16a6c29 text:string = KeyboardButton; keyboardButtonRequestGeoLocation#fc796b3f text:string = KeyboardButton; keyboardButtonSwitchInline#93b9fbb5 flags:# same_peer:flags.0?true text:string query:string peer_types:flags.1?Vector<InlineQueryPeerType> = KeyboardButton; keyboardButtonGame#50f41ccf text:string = KeyboardButton; keyboardButtonBuy#afd93fbb text:string = KeyboardButton; keyboardButtonUrlAuth#10b78d29 flags:# text:string fwd_text:flags.0?string url:string button_id:int = KeyboardButton; inputKeyboardButtonUrlAuth#d02e7fd4 flags:# request_write_access:flags.0?true text:string fwd_text:flags.1?string url:string bot:InputUser = KeyboardButton; keyboardButtonRequestPoll#bbc7515d flags:# quiz:flags.0?Bool text:string = KeyboardButton; inputKeyboardButtonRequestPeer#c9662d05 flags:# name_requested:flags.0?true username_requested:flags.1?true photo_requested:flags.2?true text:string button_id:int peer_type:RequestPeerType max_quantity:int = KeyboardButton;keyboardButtonRow#77608b83 buttons:Vector<KeyboardButton> = KeyboardButtonRow;replyKeyboardHide#a03e5b85 flags:# selective:flags.2?true = ReplyMarkup; replyKeyboardForceReply#86b40b08 flags:# single_use:flags.1?true selective:flags.2?true placeholder:flags.3?string = ReplyMarkup; replyKeyboardMarkup#85dd99d1 flags:# resize:flags.0?true single_use:flags.1?true selective:flags.2?true persistent:flags.4?true rows:Vector<KeyboardButtonRow> placeholder:flags.3?string = ReplyMarkup; replyInlineMarkup#48a30254 rows:Vector<KeyboardButtonRow> = ReplyMarkup;message#9815cec8 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true legacy:flags.19?true edit_hide:flags.21?true pinned:flags.24?true noforwards:flags.26?true invert_media:flags.27?true flags2:# offline:flags2.1?true video_processing_pending:flags2.4?true paid_suggested_post_stars:flags2.8?true paid_suggested_post_ton:flags2.9?true id:int from_id:flags.8?Peer from_boosts_applied:flags.29?int peer_id:Peer saved_peer_id:flags.28?Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?long via_business_bot_id:flags2.0?long reply_to:flags.3?MessageReplyHeader date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector<MessageEntity> views:flags.10?int forwards:flags.10?int replies:flags.23?MessageReplies edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long reactions:flags.20?MessageReactions restriction_reason:flags.22?Vector<RestrictionReason> ttl_period:flags.25?int quick_reply_shortcut_id:flags.30?int effect:flags2.2?long factcheck:flags2.3?FactCheck report_delivery_until_date:flags2.5?int paid_message_stars:flags2.6?long suggested_post:flags2.7?SuggestedPost = Message;---functions---messages.sendMessage#fe05dc9a flags:# no_webpage:flags.1?true silent:flags.5?true background:flags.6?true clear_draft:flags.7?true noforwards:flags.14?true update_stickersets_order:flags.15?true invert_media:flags.16?true allow_paid_floodskip:flags.19?true peer:InputPeer reply_to:flags.0?InputReplyTo message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector<MessageEntity> schedule_date:flags.10?int send_as:flags.13?InputPeer quick_reply_shortcut:flags.17?InputQuickReplyShortcut effect:flags.18?long allow_paid_stars:flags.21?long suggested_post:flags.22?SuggestedPost = Updates;
机器人可以将ReplyMarkup构造函数附加到外发消息中,以附加内联键盘或自定义回复键盘:
-
replyKeyboardMarkup- 发送自定义回复键盘。
接收到此构造函数的用户客户端应显示带有自定义回复选项的特殊键盘。 -
replyKeyboardHide- 隐藏自定义回复键盘。
接收到此构造函数的用户客户端应隐藏由replyKeyboardMarkup打开的自定义回复键盘。 -
replyKeyboardForceReply- 发送强制回复构造函数。
收到带有此构造函数的消息的用户客户端应表现得如同用户点击了消息的回复按钮一样,显示回复界面。 - replyInlineMarkup- 将内联键盘附加到消息中,允许用户向机器人发送回调数据,而无需向当前聊天发送实际消息。
按下按钮
requestPeerTypeUser#5f3b8a00 flags:# bot:flags.0?Bool premium:flags.1?Bool = RequestPeerType; requestPeerTypeChat#c9f06e1b flags:# creator:flags.0?true bot_participant:flags.5?true has_username:flags.3?Bool forum:flags.4?Bool user_admin_rights:flags.1?ChatAdminRights bot_admin_rights:flags.2?ChatAdminRights = RequestPeerType; requestPeerTypeBroadcast#339bef6c flags:# creator:flags.0?true has_username:flags.3?Bool user_admin_rights:flags.1?ChatAdminRights bot_admin_rights:flags.2?ChatAdminRights = RequestPeerType;keyboardButtonRequestPeer#53d7bfd8 text:string button_id:int peer_type:RequestPeerType max_quantity:int = KeyboardButton;messageActionRequestedPeer#31518e9b button_id:int peers:Vector<Peer> = MessageAction;keyboardButton#a2fa4880 text:string = KeyboardButton; keyboardButtonUrl#258aff05 text:string url:string = KeyboardButton; keyboardButtonCallback#35bbdb6b flags:# requires_password:flags.0?true text:string data:bytes = KeyboardButton; keyboardButtonRequestPhone#b16a6c29 text:string = KeyboardButton; keyboardButtonRequestGeoLocation#fc796b3f text:string = KeyboardButton; keyboardButtonRequestPoll#bbc7515d flags:# quiz:flags.0?Bool text:string = KeyboardButton; keyboardButtonSwitchInline#93b9fbb5 flags:# same_peer:flags.0?true text:string query:string peer_types:flags.1?Vector<InlineQueryPeerType> = KeyboardButton; keyboardButtonGame#50f41ccf text:string = KeyboardButton; keyboardButtonBuy#afd93fbb text:string = KeyboardButton; keyboardButtonUrlAuth#10b78d29 flags:# text:string fwd_text:flags.0?string url:string button_id:int = KeyboardButton;// Used by bots to send a keyboardButtonUrlAuthinputKeyboardButtonUrlAuth#d02e7fd4 flags:# request_write_access:flags.0?true text:string fwd_text:flags.1?string url:string bot:InputUser = KeyboardButton;keyboardButtonRow#77608b83 buttons:Vector<KeyboardButton> = KeyboardButtonRow;---functions---messages.sendBotRequestedPeer#91b2d060 peer:InputPeer msg_id:int button_id:int requested_peers:Vector<InputPeer> = Updates;
回复键盘和内联键盘都由一个行向量组成,每一行包含一个按钮向量,对应每一列。
每一行可以包含不同数量的列,用户客户端应该能够正确处理每种类型按钮的点击操作。
仅在回复键盘中可用的按钮:
- 键盘按钮- 向聊天发送消息,回复附加了回复键盘的消息
- keyboardButtonRequestPhone- 仅在私聊中,回复带有回复键盘的消息时,将当前用户的联系方式发送到聊天中。
- keyboardButtonRequestGeoLocation- 仅在私聊中,将当前用户的地理位置发送到聊天中,回复带有回复键盘的消息时启用此功能。
- keyboardButtonRequestPoll- 仅在私聊中,提示用户创建并发送投票(或测验投票,取决于版本),回复带有回复键盘的quiz消息即可。
- keyboardButtonRequestPeer- 提示用户根据RequestPeerType构造函数中指定的条件,使用messages.sendBotRequestedPeermax_quantity方法选择并向机器人共享最大数量的对等节点。keyboardButtonRequestPeer必须传递给该方法:对等节点及其指定的参数将作为messageActionRequestedPeer服务消息被机器人接收。button_idbutton_id
仅在直列式键盘上提供的按键:
- keyboardButtonUrl- 打开 URL,显示“是否要打开此 URL?”提示(除非该 URL 是内部 URI之一,在这种情况下,应立即打开该 URL)。
- keyboardButtonCallback- 将回调数据发送给机器人,可以选择性地提供用户的双因素身份验证 (2FA) SRP 有效负载,详情请参见此处 »
-
键盘按钮开关
- 如果keyboardButtonSwitchInline.same_peer已设置,则将机器人的用户名插入keyboardButtonSwitchInline.query当前聊天的输入字段中,从而触发内联查询。
- 如果keyboardButtonSwitchInline.same_peer未设置,则提示用户选择他们的一个聊天,然后keyboardButtonSwitchInline.query在当前聊天的输入字段中插入机器人的用户名,从而触发内联查询。
- keyboardButtonGame-从附加的messageMediaGame构造函数中打开游戏,更多信息请参见此处 »
- 键盘按钮购买- 继续启动支付流程,更多信息请点击此处 »
- keyboardButtonUrlAuth- 使用用户的 Telegram 帐户登录网站,具体信息请参见此处 »
回调查询
keyboardButtonCallback按钮可用于data在用户点击时将指定的有效负载发送回机器人。此外,机器人还可以通过要求用户使用SRP
验证其双因素身份验证 (2FA) 密码来验证用户身份。
发送回调查询
keyboardButtonGame#50f41ccf text:string = KeyboardButton; keyboardButtonCallback#35bbdb6b flags:# requires_password:flags.0?true text:string data:bytes = KeyboardButton;messages.botCallbackAnswer#36585ea4 flags:# alert:flags.1?true has_url:flags.3?true native_ui:flags.4?true message:flags.0?string url:flags.2?string cache_time:int = messages.BotCallbackAnswer;---functions---messages.getBotCallbackAnswer#9342ca07 flags:# game:flags.1?true peer:InputPeer msg_id:int data:flags.0?bytes password:flags.2?InputCheckPasswordSRP = messages.BotCallbackAnswer;
当用户点击机器人发送的消息或内联查询生成的消息中的keyboardButtonCallback时,应调用messages.getBotCallbackAnswer方法,并传入消息的 peer 和 ID。
点击keyboardButtonGame按钮时也应执行相同的操作,区别在于需要设置标志位而不是参数。
gamedata
务必妥善处理 RPC 错误形式的机器人超时BOT_RESPONSE_TIMEOUT,因为机器人可能离线且无法回复。
返回的messages.botCallbackAnswer构造函数包含:
- message如果指定,则应在非阻塞式提示通知中显示的消息
- alert指示是否message应将其显示为可关闭的提示,而不是简单的弹出式通知。
- has_url是否存在 URL
-
url如果指定,客户端应打开 URL,无需显示确认提示。
这是安全且允许的,因为机器人只能返回以下内容:- 指向自身的深度链接 »
- 如果机器人手动配置了游戏,并且点击的按钮是keyboardButtonGame,则会链接到他们拥有的有效游戏 » 。
- native_ui是否在 WebView 中打开游戏 URL,还是在原生 UI 中打开。
- cache_time指定此答案应在客户端缓存多长时间。
SRP验证
如果requires_password设置了该标志,则还必须生成SRP 2FA 有效负载并将其附加到查询中,以验证用户的身份。
请注意,该机器人将无法访问您的密码或 SRP 有效载荷。
SRP 请求体将完全在 Telegram 服务器上处理,如果验证失败,则只会返回 RPC 错误,而不会将查询传递给机器人。
这只是验证用户身份的一种方式,主要由官方@botfather机器人使用,以便安全地将机器人的所有权转移给其他用户。
回答回调查询
updateBotCallbackQuery#b9cfc48d flags:# query_id:long user_id:long peer:Peer msg_id:int chat_instance:long data:flags.0?bytes game_short_name:flags.1?string = Update;updateInlineBotCallbackQuery#691e9052 flags:# query_id:long user_id:long msg_id:InputBotInlineMessageID chat_instance:long data:flags.0?bytes game_short_name:flags.1?string = Update;updateBusinessBotCallbackQuery#1ea2fda7 flags:# query_id:long user_id:long connection_id:string message:Message reply_to_message:flags.2?Message chat_instance:long data:flags.0?bytes = Update;---functions---messages.setBotCallbackAnswer#d58f130a flags:# alert:flags.1?true query_id:long message:flags.0?string url:flags.2?string cache_time:int = Bool;
用户调用messages.getBotCallbackAnswer后,会生成updateBotCallbackQuery、updateInlineBotCallbackQuery或updateBusinessBotCallbackQuery并发送给机器人,具体取决于查询是源自机器人发送的普通消息、内联查询发送的消息,还是通过业务连接发送的消息。
无论哪种方式,机器人都必须使用messages.setBotCallbackAnswer尽快回复查询:
- query_id是query_id来自messages.getBotCallbackAnswer、updateBotCallbackQuery、updateInlineBotCallbackQuery或updateBusinessBotCallbackQuery 的结果
- message,,可以包含消息和 URLalert,url以触发不同的客户端行为,如上所述»
- cache_time表示客户端可以缓存回调查询结果的最长时间(以秒为单位)。
如果game_short_name更新中包含 `a`,机器人应返回具有指定名称的游戏 URL。即使未返回 `a`或 ` b`,也必须调用`messages.setBotCallbackAnswer`
方法,以避免客户端超时。messageurl