如何用PHP为Telegram消息添加inline_keyboard?代码无法显示键盘
Telegram Inline Keyboard 加载失败问题排查与修复
错误原因分析
- API 请求URL构造错误:你把
reply_markup参数拼接到URL中,同时用POST方式发送其他参数,Telegram API的POST请求要求所有参数统一放在POST体里,而非混合URL拼接和POST字段。另外URL中的Bot Token格式错误,正确格式是bot{token}后直接跟接口路径,不能用&拼接参数。 - 参数传递方式错误:
reply_markup没有被包含到POST请求的参数数组中,导致Telegram服务器无法接收键盘配置。
修复后的代码
$txt = $data; if ($telegram == "on"){ // 构造inline键盘 $keyboard = [ "inline_keyboard" => [ [ [ "text" => "Button 1", "callback_data" => "1" ], [ "text" => "Button 2", "callback_data" => "2" ] ] ] ]; // 整合所有请求参数,包括reply_markup $send = [ 'chat_id' => $chat_id, 'text' => $txt, 'reply_markup' => json_encode($keyboard) ]; // 正确构造API URL:bot{token}后直接跟接口路径 $website_telegram = "https://api.telegram.org/bot{$bot_token}/sendMessage"; $ch = curl_init($website_telegram); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $send); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $result = curl_exec($ch); curl_close($ch); // 可选:打印结果排查错误 // var_dump($result); }
关键修改说明
- 将
reply_markup加入到$send参数数组中,确保Telegram能接收到键盘配置 - 修正API URL的构造方式,去掉错误的URL参数拼接,使用标准的
bot{token}/sendMessage格式 - 保持
json_encode对键盘数组的处理,因为Telegram要求reply_markup是JSON字符串格式
内容的提问来源于stack exchange,提问作者ucefdark
相关产品推荐
相关产品推荐

