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
相关产品推荐
相关产品推荐

