У меня возникла проблема с написанием базового «эхо-бота» Telegram на PHP (то есть такого, который повторяет все, что вы ему отправляете). Я написал класс Message, который не обязательно работает эффективно, но его использование кажется более интуитивным. Всякий раз, когда я передаю полученное сообщение экземпляру класса, оно перестает работать. Бот не отправляет обратно одно и то же сообщение. Но если я сделаю то же самое, не используя определенный мной класс Message, то это сработает. Я не уверен, что пошло не так. (Я не слишком хорошо знаком с PHP, поэтому прошу прощения, если это очевидно).
Я определил следующий класс:
Сообщение класса{ публичное $сообщение; публичный $текст; общественный $message_id; общественный $от; общедоступная $дата; публичный $чат; общественный $forward_from = ноль; общественный $forward_from_chat = ноль; общественный $reply_to_message = null; общественный $документ = ноль; общественный $reply_markup = null; публичная функция __construct($message){ $это->сообщение = $сообщение; $this->text = isset($this->message["text"]) ? $this->message["текст"]: ноль; $this->message_id = $this->message["message_id"]; $this->from = isset($this->message["from"]) ? новый пользователь($this->message["from"]): null; $this->date = $this->message["дата"]; $this->chat = новый чат($this->message["чат"]); $this->forward_from = isset($this->message["forward_from"]) ? новый пользователь($this->message["forward_from"]): null; $this->forward_from_chat = isset($this->message["forward_from_chat"]) ? новый чат($this->message["forward_from_chat"]): null; $this->reply_to_message = isset($this->message["reply_to_message"]) ? новое сообщение($this->message["reply_to_message"]): null; $this->document = isset($this->message["document"]) ? новый документ($this->message["документ"]): null; $this->reply_markup = isset($this->message["reply_markup"]) ? новый InlineKeyboardMarkup($this->message["reply_markup"]): null; } } Все остальные упомянутые здесь классы также определены аналогичным образом.
Я просто пытаюсь запустить следующее:
$content = file_get_contents('php://input'); $update = json_decode($content, true); define("API_KEY", "..."); // ... заголовок('Тип контента: приложение/json'); $message = isset($update["сообщение"]) ? новое сообщение($update["сообщение"]): ноль; file_get_contents("https://api.telegram.org/bot" . API_KEY "/sendMessage?chat_id=...&text=" . $message->text); В результате бот вообще не будет отвечать.

Однако, если я вообще не использую свой класс Message, он работает
$content = file_get_contents('php://input'); $update = json_decode($content, true); define("API_KEY", "..."); // ... заголовок('Тип контента: приложение/json'); $message = $update["сообщение"]; file_get_contents("https://api.telegram.org/bot" . API_KEY "/sendMessage?chat_id=...&text=" . $message["text"]);

Значит, я предполагаю, что с моим классом что-то не так? Но я не уверен в чем, потому что единственная разница между $message["text"] и $message->text заключается в том, что есть несколько дополнительных шагов. Ответ $update JSON на сообщение, которое я отправляю в чат-бот Telegram, выглядит следующим образом (после его кодирования с помощью json_encode):
{ «update_id»: 213123489, "сообщение": { «идентификатор_сообщения»: 362, "от": { "id": //ID ПОЛЬЗОВАТЕЛЯ, «is_bot»: ложь, "first_name": "Лейла", "имя пользователя": // ИМЯ ПОЛЬЗОВАТЕЛЯ, "language_code": "ru" }, "чат": { "id": // Идентификатор ЧАТа, "first_name": "Лейла", "имя пользователя": // ИМЯ ПОЛЬЗОВАТЕЛЯ, "тип": "частный" }, "дата": 1698423686, "текст": "Тест" } } Вебхук установлен, поэтому проблем быть не должно (дополнительным доказательством является то, что другой метод действительно работает). Вот ответ, который я получаю с помощью getWebhookInfo:
{ «ок»: правда, "результат": { "url": "https://***.com", «has_custom_certificate»: ложь, «pending_update_count»: 0, "max_connections": 40, "ip_address": // IP-АДРЕС } } Ссылки:
[*]Сообщение согласно определению в документации Telegram Bot API [*]Как определяются классы в PHP [*]Получение данных через вебхук
Мобильная версия