1

我遇到了在电报机器人中处理用户消息输入的问题。

我在没有任何库的情况下在 php 上编写电报机器人。Bot 通过 webhook 从电报接收信息,两个 switch-case 正在处理消息和 callback_query。

短版看起来像这样,它也没有保存到数据库:

$output = json_decode(file_get_contents('php://input'), TRUE);
$chat_id = $output['message']['chat']['id'];
$message = $output['message']['text'];
$callback_query = $output['callback_query'];
$data = $callback_query['data'];
$callback_query_id = $callback_query['id'];
$message_id = $output['callback_query']['message']['message_id'];
$message_id_message = $output['message']['message_id'];
$chat_id_in = $callback_query['message']['chat']['id'];]

//Handler of messages
switch($message) {
    case '/start':
        $button1 = ['text'=>'Almaty', 'callback_data'=>"almaty"];
        $button2 = ['text'=>'Astana', 'callback_data'=>"astana"];
        $inline_keyboard = [[$button1],[$button2]];
        $keyboard=["inline_keyboard"=>$inline_keyboard];
        $replyMarkup = json_encode($keyboard);
        sendMessage($chat_id, "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", $replyMarkup);

        // Save User to bd if it new, or catch to file.txt
        try
        {
            $first_name = isset($output["message"]['from']['first_name']) ? $output["message"]['from']['first_name'] : null;
            $username = isset($output["message"]['from']['username']) ? $output["message"]['from']['username'] : null;
            $pdo = getPDO();
            $stmt = $pdo->prepare("
                    INSERT INTO 
                      users (chat_id,first_name,username)
                    VALUES (:chat_id, :first_name, :username)
                ");
        } catch (Exception $e) {
            file_put_contents('file.txt', $e->getMessage()."\n", FILE_APPEND);
        }
        break;
}
    
//handler of callback_query
switch($data){
    case 'almaty':
        deleteMessage($chat_id_in, $message_id);
        deleteMessage($chat_id_in, $message_id-1);

        $inline_keyboard = [
            [
                ['text'=>'aujezovskij', 'callback_data'=>"aujezovskij"]
            ],
            [
                ['text'=>'alatauskij', 'callback_data'=>"alatauskij"]
            ],
            [
                ['text'=>'almalinskij', 'callback_data'=>"almalinskij"]
            ],
            [
                ['text'=>'bostandykskij', 'callback_data'=>"bostandykskij"]
            ],
            [
                ['text'=>'zhetysuskij', 'callback_data'=>"zhetysuskij"]
            ],
            [
                ['text'=>'medeuskij', 'callback_data'=>"medeuskij"]
            ],
            [
                ['text'=>'nauryzbajskiy', 'callback_data'=>"nauryzbajskiy"]
            ],
            [
                ['text'=>'turksibskij', 'callback_data'=>"turksibskij"]
            ],
            [
                ['text'=>'Go back', 'callback_data'=>"goback"]
            ]
        ];
        $keyboard=["inline_keyboard"=>$inline_keyboard];
        $replyMarkup = json_encode($keyboard);
        sendMessage($chat_id_in, "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", $replyMarkup);
        break;

    case 'astana':
        deleteMessage($chat_id_in, $message_id);
        deleteMessage($chat_id_in, $message_id-1);

        $inline_keyboard = [
            [
                ['text'=>'esilskij', 'callback_data'=>"esilskij"]
            ],
            [
                ['text'=>'almatinskij', 'callback_data'=>"almatinskij"]
            ],
            [
                ['text'=>'saryarkinskij', 'callback_data'=>"saryarkinskij"]
            ],
            [
                ['text'=>'r-n-bajkonur', 'callback_data'=>"r-n-bajkonur"]
            ],
            [
                ['text'=>'Go back', 'callback_data'=>"goback"]
            ]
        ];
        $keyboard=["inline_keyboard"=>$inline_keyboard];
        $replyMarkup = json_encode($keyboard);
        sendMessage($chat_id_in, "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", $replyMarkup);
        break;

    case "goback":
        deleteMessage($chat_id_in, $message_id);
        $button1 = ['text'=>'Almaty', 'callback_data'=>"almaty"];
        $button2 = ['text'=>'Astana', 'callback_data'=>"astana"];
        $inline_keyboard = [[$button1],[$button2]];
        $keyboard=["inline_keyboard"=>$inline_keyboard];
        $replyMarkup = json_encode($keyboard);
        sendMessage($chat_id_in, "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", $replyMarkup);
        break;

    case "aujezovskij":
    case "alatauskij":
    case "almalinskij":
    case "bostandykskij":
    case "zhetysuskij":
    case "medeuskij":
    case "nauryzbajskiy":
    case "turksibskij":
    case "esilskij":
    case "almatinskij":
    case "saryarkinskij":
    case "r-n-bajkonur":
        deleteMessage($chat_id_in, $message_id);

        $inline_keyboard = [
            [
                ['text'=>'flats', 'callback_data'=>"kvartiry"]
            ],
    

        [
                    ['text'=>'rooms', 'callback_data'=>"komnaty"]
                ],
                [
                    ['text'=>'all', 'callback_data'=>"all"]
                ],
                [
                    ['text'=>'Go back', 'callback_data'=>"$city"]
                ]
            ];
            $keyboard=["inline_keyboard"=>$inline_keyboard];
            $replyMarkup = json_encode($keyboard);
            sendMessage($chat_id_in, "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", $replyMarkup);
            break;
}

接下来的所有步骤我只使用带有内联按钮的回调查询。但是在接下来的几个步骤中,我需要发送带有问题“写价格范围”和两个按钮的消息返回“没关系”给用户“写价格范围”的消息图片

主要问题是用户应该写整数范围的地方会有同样的问题,我需要知道我应该把这个答案保存到哪个数据库列。

最近的尝试是创建一个包含队列的表,这些队列将在某个步骤创建并指示保存答案的位置。为此,我在从该队列表中选择字段的位置添加了开关默认值,并通过 IF 语句检查用户来自哪个步骤。除了那些按钮Go back"Doesn't matter"之外,一切正常,因为在队列表中存在行的情况下,脚本被卡在正在处理消息的 switch-default 中,并且无法转到 switch-case 是处理回调查询代码的简短示例:

// Message handler
switch($message) {
    case '/start':
        $button1 = ['text'=>'Алматы', 'callback_data'=>"almaty"];
        $button2 = ['text'=>'Астана', 'callback_data'=>"astana"];
        $inline_keyboard = [[$button1],[$button2]];
        $keyboard=["inline_keyboard"=>$inline_keyboard];
        $replyMarkup = json_encode($keyboard);
        sendMessage($chat_id, "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", $replyMarkup);

        // Save User to bd if it new, or catch to file.txt
        try
        {
            $first_name = isset($output["message"]['from']['first_name']) ? $output["message"]['from']['first_name'] : null;
            $username = isset($output["message"]['from']['username']) ? $output["message"]['from']['username'] : null;
            $pdo = getPDO();
            $stmt = $pdo->prepare("
                    INSERT INTO 
                      users (chat_id,first_name,username)
                    VALUES (:chat_id, :first_name, :username)
                ");
        } catch (Exception $e) {
            file_put_contents('file.txt', $e->getMessage()."\n", FILE_APPEND);
        }
        break;

    default:
        $pdo = getPDO();
        $stmt = $pdo->prepare("
                        SELECT suspense, suspense_from from user_suspense
                        WHERE chat_id = 201502307
                    ");

        $stmt->execute();
        $status = $stmt->fetch();
        if ($status['suspense_from'] == "price" AND $status['suspense'] == 'wait'){
            try
            {
                $pdo = getPDO();
                $stmt = $pdo->prepare("
                        UPDATE users
                        SET price=:price
                        WHERE chat_id = $chat_id
                    ");

                $stmt->execute([
                    ':price' => $message
                ]);

                $stmt = $pdo->prepare("
                        UPDATE user_suspense
                        SET suspense = :suspense
                        WHERE chat_id = $chat_id
                    ");

                $stmt->execute([
                    ':suspense' => 'proceed'
                ]);
            } catch (Exception $e) {
                file_put_contents('file.txt', $e->getMessage() . "\n", FILE_APPEND);
            }
                $pdo = getPDO();
                $stmt = $pdo->prepare("
                            SELECT suspense from user_suspense
                            WHERE chat_id = $chat_id
                        ");

                $stmt->execute();
                $status = $stmt->fetch();
            deleteMessage($chat_id, $status['chat_id_in']);
            deleteMessage($chat_id, $message_id_message);
            sendMessageNomarkup($chat_id, 'fffff');
        }
        break;
}

//Callback Query handler
switch($data){
case "price":
            try
            {
                $pdo = getPDO();
                $stmt = $pdo->prepare("
                    INSERT INTO 
                      user_suspense (chat_id)
                    VALUES (:chat_id)
                ");

                $stmt->execute([
                    ':chat_id'=> $chat_id_in
                ]);
            } catch (Exception $e) {
                file_put_contents('file.txt', $e->getMessage()."\n", FILE_APPEND);
            }

            try
            {
                $pdo = getPDO();
                $stmt = $pdo->prepare("
                        UPDATE user_suspense
                        SET suspense=:suspense, suspense_from=:suspense_from, chat_id_in=:chat_id_in
                        WHERE chat_id = $chat_id_in
                    ");

                $stmt->execute([
                    ':suspense' => 'wait',
                    ':suspense_from' => $data,
                    ':chat_id_in' => $message_id+1
                ]);
            } catch (Exception $e) {
                file_put_contents('file.txt', $e->getMessage() . "\n", FILE_APPEND);
            }
            deleteMessage($chat_id_in, $message_id);
            $inline_keyboard = [
                [
                    ['text'=>"Doesn't matter", 'callback_data'=>"commission"]
                ],
                [
                    ['text'=>'Go back', 'callback_data'=>"remont"]
                ]
            ];
            $keyboard=["inline_keyboard"=>$inline_keyboard];
            $replyMarkup = json_encode($keyboard);
            sendMessage($chat_id_in, "Write price range \n Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n Example: 100-200", $replyMarkup);
        break;
}

现在我不知道如何解决这个问题,没有代码的全局更改。我想添加完整的代码,但它限制为 30000 个字符,所以我希望我能清楚地展示和描述问题。提前感谢您的帮助。

4

0 回答 0