如何在TelegramBotPHP库中使用callback_data获取用户Twitter用户名
你现有代码的核心问题是把inline按钮回传的checkIsMember当成普通消息文本判断了,回调数据不会出现在普通消息的$text字段里,需要单独读取callback_query对象的内容,完整实现方案如下:
步骤1:读取callback_data并应答回调
首先要从Telegram推送的更新数据中单独提取回调相关字段,且必须应答回调请求,否则用户点击按钮后会一直显示加载状态:
// 你原有逻辑里的普通消息字段读取 $text = $telegram->Text(); $chat_id = $telegram->ChatID(); // 新增回调相关字段读取 $callback_query = $telegram->Callback_Query(); $callback_data = $telegram->Callback_Data(); $callback_chat_id = $telegram->Callback_ChatID(); // 收到回调请求优先应答 if ($callback_query) { $telegram->answerCallbackQuery([ 'callback_query_id' => $callback_query['id'], 'show_alert' => false ]); }
步骤2:通过callback_data触发引导输入逻辑
将原有的$text == 'checkIsMember'判断改成判断回调字段,同时需要存储用户的当前输入状态(可以用SESSION、本地文件或者数据库存储,对应每个用户的chat_id),用来标识接下来用户发的消息是Twitter用户名:
if($text == '🚀 提交你的信息'){ $option = array( // 不需要跳转url的话第二个参数传空字符串 array($telegram->buildInlineKeyBoardButton('✅ 完成', $url = '', $callback_data = 'checkIsMember')) ); $keyb = $telegram->buildInlineKeyBoard($option); $content = array( 'chat_id' => $chat_id, 'reply_markup' => $keyb, 'text' => '请先加入我们的Telegram频道 <b>点击"✅ 完成"按钮继续后续操作</b>', 'parse_mode' => 'HTML' ); $telegram->sendMessage($content); } // 响应callback回调 if($callback_data == 'checkIsMember'){ // 存储当前用户状态为:等待输入Twitter用户名,这里用SESSION示例,开头需要先加session_start() $_SESSION['user_status'][$callback_chat_id] = 'wait_twitter'; $content = array( 'chat_id' => $callback_chat_id, 'text' => '👉 请在下方输入你的Twitter用户名,需要带@符号 示例:@username' ); $telegram->sendMessage($content); }
步骤3:接收并校验用户输入的Twitter用户名
后续用户发普通消息时,先判断用户状态,如果处于等待输入Twitter的状态,就对输入内容做格式校验:
// 处理用户普通输入 if ($text && isset($_SESSION['user_status'][$chat_id])) { if ($_SESSION['user_status'][$chat_id] == 'wait_twitter') { // 校验是否符合Twitter用户名规则:@开头,后接1-15位字母/数字/下划线 if (preg_match('/^@[A-Za-z0-9_]{1,15}$/', $text)) { $twitter_username = $text; // 存储用户名后可以把状态改成下一步,比如等待输入密码 $_SESSION['user_status'][$chat_id] = 'wait_password'; $content = array( 'chat_id' => $chat_id, 'text' => 'Twitter用户名验证通过,请输入密码:' ); $telegram->sendMessage($content); } else { $content = array( 'chat_id' => $chat_id, 'text' => '用户名格式错误,请重新输入,示例:@username' ); $telegram->sendMessage($content); } } // 可继续扩展等待密码状态的处理逻辑,完成后续信息收集 }
内容的提问来源于stack exchange,提问作者ebrahim babavand
相关产品推荐
相关产品推荐

