我遇到了在电报机器人中处理用户消息输入的问题。
我在没有任何库的情况下在 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 个字符,所以我希望我能清楚地展示和描述问题。提前感谢您的帮助。