出现了以下问题 - 我在电报中编写了一个机器人(没有库),将一个 webhook 连接到它,并在此时卡住了按钮,或者更确切地说,在单击它们后处理请求。理论上,点击后,机器人应该会收到另一条消息,但最终没有任何回应。
机器人可执行代码:
<?php
include 'config.php'; // Токен бота
include 'functions.php'; // Основные функции
// В теле запроса содержится JSON, php://input читает сырой запрос, а json_decode расшифровывает в виде массива
$update = json_decode(file_get_contents('php://input'), JSON_OBJECT_AS_ARRAY);
$chat_id = $update['message']['chat']['id']; // Определяет ID чата
$message = $update['message']['text']; // Определяет текст сообщения
$message_id = ['callback_query']['message']['message_id']; // Определяет ID сообщения
$callback_query = $update['callback_query'];
$callback_query_id = $callback_query['id'];
$callback_data = $callback_query['data'];
// Делается запрос
$method = 'setWebhook';
$url = 'https://api.telegram.org/bot' . BOT_TOKEN . '/' . $method;
$options = [
'url' => 'https://example.ru/bot.php'
];
// То, что возвращается из запроса
$response = file_get_contents($url . '?' . http_build_query($options));
var_dump($response);
if (strpos($message, "/help") === 0) { // Команда /help
$post = [
'chat_id' => $chat_id,
'text' => 'Эта памятка создана для объяснения различных
терминов, посуды',
$help_buttons = [
[['text' => 'Термины 📃', 'callback_data' => 'terms']],
[['text' => 'Посуда / Штучки 🥄', 'callback_data' => 'dishes']]
],
'reply_markup' => inline_keyboard($help_buttons),
];
sendRequest('sendMessage', $post);
} else {
// Начальное сообщение
$post = [
'chat_id' => $chat_id,
'text' => 'Давай определимся с категорией коктейлей:',
$main_menu = [
[['text' => 'Незабываемые', 'callback_data' => 'the_unforgettables']],
[['text' => 'Современная Классика', 'callback_data' => 'contemporary_classic']],
[['text' => 'Напитки Новой Эры', 'callback_data' => 'new_era_drinks']]
],
'reply_markup' => inline_keyboard($main_menu)
];
sendRequest('sendMessage', $post);
}
switch ($callback_data) {
case 'the_unforgettables':
$post = [
'chat_id' => $chat_id,
'text' => 'Отлично, теперь выбери любой коктейль из списка:',
$InlineTheUnforgettables = [
[['text' => 'Негрони', 'callback_data' => 'negroni']],
[['text' => 'Манхэттен', 'callback_data' => 'manhattan']],
[['text' => 'Американо', 'callback_data' => 'americano']]
],
'reply_markup' => inline_keyboard($InlineTheUnforgettables),
];
sendRequest('sendMessage', $post);
break;
}
消息发送功能:
function sendRequest($method, $params = [])
{
if (!empty($params)) {
$url = BOT_URL . $method . '?' . http_build_query($params);
} else {
$url = BOT_URL . $method;
}
return json_decode(
file_get_contents($url),
JSON_OBJECT_AS_ARRAY
);
}
同时,webhook 中挂起如下错误:
string(64) "{"ok":true,"result":true,"description":"Webhook is already set"}"
Warning: file_get_contents(https://api.telegram.org/bot[BOT_TOKEN]/sendMessage?
text=%D0%94%D0%B0%D0%B2%D0%B0%D0%B9+%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B8%D0%B
C%D1%81%D1%8F+%D1%81+%D0%BA%D0%B0%D1%82%D0%B5%D0%B3%D0%BE%D1%80%D0%B8%D0%B5%D0%B9+%D0%BA%
D0%BE%D0%BA%D1%82%D0%B5%D0%B9%D0%BB%D0%B5%D0%B9%3A&0%5B0%5D%5B0%5D%5Btext%5D=%D0%9D%D0%B5
%D0%B7%D0%B0%D0%B1%D1%8B%D0%B2%D0%B0%D0%B5%D0%BC%D1%8B%D0%B5+%E2%99%BE&0%5B0%5D%5B0%5D%5B
callback_data%5D=the_unforgettables&0%5B1%5D%5B0%5D%5Btext%5D=%D0%A1%D0%BE%D0%B2%D1%80%D0
%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%B0%D1%8F+%D0%9A%D0%BB%D0%B0%D1%81%D1%81%D0%B8%D0%BA%D0%B0+
%F0%9F%8D%B9&0%5B1%5D%5B0%5D%5Bcallback_data%5D=contemporary_classic&0%5B2%5D%5B0%5D%5Bte
xt%5D=%D0%9D%D0%B0%D0%BF%D0%B8%D1%82%D0%BA%D0%B8+%D0%9D%D0%BE%D0%B2%D0%BE%D0%B9+%D0%AD%D1
%80%D1%8B+%F0%9F%86%95&0%5B2%5D%5B0%5D%5Bcallback_data%5D=new_era_drinks&reply_markup=%7B
%22inline_keyboard%22%3A%5B%5B%7B%22text%22%3A%22%5Cu041d%5Cu0435%5Cu0437%5Cu0430%5Cu0431
% in /home/db_name/public_html/example.ru/functions.php on line 12
也就是说,webhook 抱怨这条线 -file_get_contents($url)
究竟可能是什么错误以及如何纠正?这是单击按钮时未显示另一条机器人消息的原因吗?
首先,我处理了 webhook 中的错误 - 我没有找到它发生的原因,因为文件中没有描述字段,因此很难理解究竟是什么导致了错误。我用另一个替换了发送消息功能:
它的工作方式相同,不会导致任何错误。
然后我处理按钮的处理,或者更确切地说是它们的反向查询(callback_query/callback_data)。我创建了两个文件 - 数据,我在其中获取 chat_id、message、message_id,我需要它来发送主要消息(按问候语类型、命令)。然后我创建了一个 callback_query 文件,在其中放置了以下几行 -
在他们的帮助下,您可以通过单击按钮收到退货请求。我的主要代码现在看起来像这样: