You need to enable JavaScript to run this app. 如何使用Botman.io框架在Telegram中实现非按钮式动态键盘并修复代码问题
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Botman.io框架在Telegram中实现非按钮式动态键盘并修复代码问题

Botman.io Telegram 非内嵌按钮式动态键盘实现方案

原代码问题定位

  • 变量拼写偏差:创建键盘实例时变量名误写为$keybord,与后续使用的$keyboard命名不统一,易引发参数传递为空的问题
  • 参数格式不符合要求:Botman核心方法要求传入的附加参数需为数组结构,直接传入Keyboard实例会导致Telegram驱动无法解析键盘结构,也就是你排查到的未调用toArray()的核心问题
  • 调用方式冗余:原代码通过call_user_func_array间接调用addRow方法,可直接使用PHP数组展开语法简化传参逻辑

修正后可运行代码

use BotMan\BotMan\Buttons\Keyboard;
use BotMan\BotMan\Buttons\KeyboardButton;

// 动态生成按钮文本列表
$buttonTextList = ['test1', 'test2', 'test3'];

// 批量生成按钮实例
$buttons = array_map(function ($item) {
    return KeyboardButton::create($item);
}, $buttonTextList);

// 创建输入框上方的原生动态键盘(区别于内嵌在消息中的内联按钮键盘)
$keyboard = Keyboard::create(Keyboard::TYPE_KEYBOARD);
// 展开按钮数组传入addRow,完成一整行按钮的添加
$keyboard->addRow(...$buttons);

// 核心修正:将键盘实例转为数组后传入ask方法
$this->ask(
    'What is your name',
    function ($answer) {
        $this->say('your name is ' . $answer->getText());
    },
    $keyboard->toArray()
);

扩展实现说明

  • 自定义行布局:若需要调整按钮换行逻辑,可拆分按钮数组后多次调用addRow,例如将3个按钮拆分为每行2个的布局:
// 第一行放置前2个按钮
$keyboard->addRow(...array_slice($buttons, 0, 2));
// 第二行放置最后1个按钮
$keyboard->addRow(...array_slice($buttons, 2, 1));
  • 专属参数调整:若需要设置键盘收起逻辑、键盘缩放大小等Telegram专属配置,可在$keyboard->toArray()返回的数组结构基础上追加对应字段,适配Telegram的键盘参数规范。

内容的提问来源于stack exchange,提问作者Solayman Mousa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 01:45:03