Как можно отобразить на сайте процесс ввода сообщения из Telegram?

Как можно изменить PHP-скрипт для получения статуса печатания сообщения от бота таким образом, чтобы значения $displayStatus['ok'] и $displayStatus['result'] возвращались как true только в момент, когда я действительно печатаю сообщение в чате? В настоящее время он всегда возвращает true, даже при обращении напрямую через URL или с использованием Ajax-запроса. Мой код выглядит так: <br/> <pre><code class="php">public function statusTelegrammAction(){
        $urlStatus = 'https://api.telegram.org/bot' . $token . '/sendChatAction?chat_id='.$chatId.'&amp;action=typing';
        $getStatus = file_get_contents($urlStatus);
        $displayStatus = json_decode($getStatus, true);
        if($displayStatus['ok'] == true &amp;&amp; $displayStatus['result'] == true){
            echo 'Печатает...';
            die;
        }
    }</code></pre> <br/> А Ajax-запрос выглядит так: <br/> <pre><code class="javascript">$.ajax({
    url: '/chat/status-telegramm',
    data: {},
    type: 'POST',
    success: function(res){
        $('.typing-message').html(res);
    },
    error: function(xhr, ajaxOptions, thrownError) {
        console.log(xhr.status);
        console.log(thrownError);
    }
});</code></pre> <br/> Почему в результате вывода всегда отображается сообщение "Печатает..."? Как исправить эту ситуацию?
  • 4 ноября 2024 г. 13:13
Ответы на вопрос 2
Для корректного отображения процесса ввода сообщения в Telegram и правильного отслеживания статуса печатания сообщений, вам необходимо учитывать несколько моментов.

Ваш текущий код вызывает метод `sendChatAction`, который всегда будет возвращать `true`, так как он просто указывает на то, что действие "печатает..." было отправлено в Telegram. Не существует механизма, который подтверждает, что пользователь действительно печатает сообщение. Будет всегда `true`, если вы вызываете этот метод.

Чтобы достичь желаемой функциональности, можно использовать следующие методы:

1. **Отслеживание событий на стороне клиента**:
   Если вы хотите отобразить статус "Печатает...", когда пользователь начинает вводить сообщение, вам нужно отслеживать события ввода. В JavaScript для этого можно использовать событие `input` или `keydown`.

   Пример использования jQuery:

   ```javascript
   $('#message-input').on('input', function() {
       $.ajax({
           url: '/chat/status-telegramm',
           data: {},
           type: 'POST',
           success: function(res){
               $('.typing-message').html(res);
           },
           error: function(xhr, ajaxOptions, thrownError) {
               console.log(xhr.status);
               console.log(thrownError);
           }
       });
   });
   ```

   Здесь `#message-input` — это id вашего текстового поля. Каждый раз, когда пользователь начинает вводить текст, отправляется AJAX-запрос, который обновляет статус отображения.

2. **Изменение PHP кода**:
   Ваша функция `statusTelegrammAction` будет просто возвращать успешно отправленное сообщение, без дополнительных проверок:

   ```php
   public function statusTelegrammAction() {
       $response['ok'] = true; // Предполагается, что действие инициировано
       $response['result'] = true; // Действие выполнено успешно
       
       echo json_encode($response);
       die;
   }
   ```

3. **Отображение сообщения**:
   Чтобы отображать статус "Печатает..." только тогда, когда поступает AJAX-запрос, проверяйте это в JavaScript:

   ```javascript
   $('#message-input').on('input', function() {
       $('.typing-message').html('Печатает...');

       $.ajax({
           url: '/chat/status-telegramm',
           data: {},
           type: 'POST',
           success: function(res){
               // Если нужно, обработайте результат
           },
           error: function(xhr, ajaxOptions, thrownError) {
               console.log(xhr.status);
               console.log(thrownError);
           }
       });
   });

   $('#message-input').on('blur', function() {
       $('.typing-message').html(''); // Убираем статус при потере фокуса
   });
   ```

Таким образом, вы можете контролировать отображение статуса печатания непосредственно на стороне клиента и отправлять запросы на сервер только во время ввода текста.
$urlStatus = ' https://api.telegram.org/bot ' . $token . '/sendChatAction?chat_id='.$chatId.'&action=typing'; 
этот enndpoint передает в бот инфу о том, что производятся действия ботом.
ссылка на доку с этим методом https://core.telegram.org/bots/api#sendchataction
Похожие вопросы