mrKorg
@mrKorg
web developer

Как изменить сообщение в Telegram боте?

При создании бота на Laravel и Telegram Bot API - PHP SDK столкнулся с некоторыми вопросами, на которые ищу ответ, а именно:
Как в callback кнопки можно указать id сообщения, для последующего его оформления, если inline кнопка отправляется вместе с сообщением, т.е. его id ещё не существует?
Пример моей простой команды:
<?php

namespace App\Telegram\Commands;

use Telegram\Bot\Actions;
use Telegram\Bot\Commands\Command;
use Log;
use App;

class LanguageCommand extends Command
{
    /**
     * @var string Command Name
     */
    protected $name = "language";

    /**
     * @var string Command Description
     */
    protected $description = "Show menu language selection";

    /**
     * @inheritdoc
     */
    public function handle($arguments)
    {
        Log::info('language command');
        $this->replyWithChatAction(['action' => Actions::TYPING]);

        $languages = config('app.locales_assoc');

        $keyboard = [];
        $keyboardArray = [];
        foreach ($languages as $code => $language) {
            array_push($keyboardArray, ['text' => $language, 'callback_data' => '/setLanguage_' . $code]);
        }
        $keyboard['inline_keyboard'] = [$keyboardArray];

        $reply_markup = json_encode($keyboard, TRUE);

        $this->replyWithMessage(
          [
            'telegram_chat_id' => $this->update->getMessage()->getChat()->getId(),
            'text' => trans('bot.greeting_lang'),
            'reply_markup' => $reply_markup
          ]
        );

    }
}


И сопутствующий вопрос заключается в том, каким методом можно обновить сообщение?
Почему-то SDK не содержит такого метода, как editMessageText.
  • Вопрос задан
  • 6547 просмотров
Пригласить эксперта
Ответы на вопрос 1
glebovgin
@glebovgin
Full Stack Web Developer
1. Да и пёс с ним, с SDK. В доке есть editMessageText, сделайте свою обертку и работайте на здоровье.
2. Касаемо первого вопроса: а что именно вы хотите сделать-то?
В любом случае - для каждого sendMessage возвращается объект Message, в котором содержится и message_id и данные по Chat.
Поэтому, например, если вам очень хочется к кнопкам добавить message_id, то вы отправляете сообщение, получаете Message в ответ и через editMessageText обновляете изначальное сообщение, добавляя к нему inline клавиатуру с нужными данными. Но, скажу честно, выглядит как извращение.

Второй вариант: при нажатии на inline кнопку выполняется CallbackQuery, который содержит в себе и inline_message_id и сам объект Message.

Дальше выбирайте уже сами, что вам ближе.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы