You need to enable JavaScript to run this app. Bogdaan/viber-bot-php开发Viber机器人自定义按钮无响应及实现问题
优惠活动
大模型
产品
解决方案
定价
更多

Bogdaan/viber-bot-php开发Viber机器人自定义按钮无响应及实现问题

自定义按钮无响应的核心原因

所有修改按钮后机器人失灵的情况,基本都是踩了Viber API的硬性校验规则:

  • 自定义键盘的网格为固定6列宽,单行所有按钮设置的columns值累加总和不能超过6,超出阈值时Viber服务端会直接丢弃整条带键盘的消息,表现为修改配置后机器人无响应
  • 按钮必填字段缺失(比如未设置行高rows、actionBody为空)时,服务端会直接返回400校验错误,消息无法正常投递
  • 按钮的text和actionBody包含超长文本、未转义特殊字符时,序列化后的JSON不符合API规范,同样会被服务端拒收
  • 替换按钮的actionBody值后,机器人的回调匹配逻辑没有同步更新,收到按钮点击请求后找不到对应处理分支,也会出现无响应的表现
基于提取的汽车品牌生成可用自定义键盘的实现步骤

修正原有品牌提取逻辑

原提取代码存在逻辑硬伤:通过implode把独立品牌值数组合并成了单个长字符串,无法获取独立的品牌项用于生成按钮,正确的提取代码应该保留数组结构,同时清洗无效值:

global $wpdb;
// 直接查询去重后的非空品牌值,移除无意义的占位传参
$makes = $wpdb->get_col( "
    SELECT DISTINCT meta_value 
    FROM {$wpdb->postmeta} 
    WHERE meta_key = 'make' 
      AND meta_value != '' 
      AND TRIM(meta_value) != ''
" );
// 数据清洗:去空、去重、转首字母大写
$makes = array_map(function($item) {
    return ucwords(trim($item));
}, array_unique($makes));

生成符合API规范的按钮组

生成按钮时需避开校验规则的常见坑点:

  • 按6列固定网格排版,比如每个品牌按钮占3列,单排可放置2个按钮,排版均匀且不会触发宽度校验
  • 补全所有必填字段,避免字段缺失导致的校验失败
  • 给按钮的actionBody添加固定识别前缀,降低后续逻辑匹配的复杂度

对应生成代码:

$buttons = [];
foreach ($makes as $brand) {
    $buttons[] = (new \Viber\Api\Keyboard\Button())
        ->setColumns(3) // 单按钮占3列,单排总宽度符合6列的网格要求
        ->setRows(1) // 必设参数,控制按钮高度
        ->setBgColor('#f0f2f5')
        ->setTextColor('#222222')
        ->setActionType('reply')
        ->setActionBody('select_brand:' . $brand) // 带固定前缀的回调值,便于逻辑匹配
        ->setText($brand);
}
// 挂载按钮到键盘对象,明确设置总网格列数
$keyboard = new \Viber\Api\Keyboard();
$keyboard->setButtons($buttons);
$keyboard->setColumnSize(6); // 和按钮排版的总宽度保持一致
快速排查无响应问题的方法
  • 查看机器人的请求日志,找到发送带键盘消息时Viber服务端的返回内容,400错误会明确标注不合法的字段问题,按提示修正即可
  • 检查webhook的接收日志,确认按钮点击的请求是否能正常到达服务端,如果没有请求,说明消息本身未被Viber正常投递
  • 同步更新机器人的回调匹配逻辑:原有匹配k0-k8的处理分支,需替换为匹配select_brand:开头的actionBody值,避免请求到达后无对应处理逻辑

内容的提问来源于stack exchange,提问作者Regular User

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.25 17:45:11