doniyorbekm
@doniyorbekm
Yii-шник

Telegram Bot — как получить сообщение от юзера?

Ребят, всем привет!
Хочу реализовать следующее: при передаче юзером в Телеграме боту команды /start - необходимо чтобы бот выдавал ответом его chat_id
Пока мне удалось только отправлять сообщения юзеру, вот так:
Класс для отправки сообщений я взял тут
В контроллере Yii2 я пишу:
$api = new Telegram();
        $api->token = '439152430:AAE***_мой_токен';
        $api->sendMessage(821_мой_чат_id, "Hello, world!") ;

Теперь мне нужно получать от юзера команду /start и ответом отправлять ему его chat_id
Знаю что нужно ставить webHook и "слушать" JSON от бота, но никак не получается((((
Пока на сервере https://mywebsite.ru/bot/bot.php я прописал:
json_decode(file_get_contents('php://input'));
  • Вопрос задан
  • 5744 просмотра
Пригласить эксперта
Ответы на вопрос 1
Akdmeh
@Akdmeh
PHP, Yii2, Music
Да вы шутите! Как раз позавчера игрался над этой задачей.

<?php
namespace app\telegram_logger;

use yii\base\Component;
use yii\base\InvalidConfigException;
use yii\httpclient\Client;
/**
 * Telegram Bot
 *
 * @author Ali Irani <ali@irani.im>
 */
class TelegramBot extends Component
{
    const API_BASE_URL = 'https://api.telegram.org/bot';
    /**
     * Bot api token secret key
     * @var string
     */
    public $token;

    private $_client;
    /**
     * Check required property
     */
    public function init()
    {
        parent::init();
        if ($this->token === null) {
            throw new InvalidConfigException(self::className() . '::$token property must be set');
        }
    }
    /**
     * @return Client
     */
    public function getClient()
    {
        if ($this->_client) {
            return $this->_client;
        }
        return new Client(['baseUrl' => self::API_BASE_URL . $this->token]);
    }
    /**
     * Send message to the telegram chat or channel
     * @param int|string $chat_id
     * @param string $text
     * @param string $parse_mode
     * @param bool $disable_web_page_preview
     * @param bool $disable_notification
     * @param int $reply_to_message_id
     * @param null $reply_markup
     * @link https://core.telegram.org/bots/api#sendmessage
     * return array
     */
    public function sendMessage($chat_id, $text, $parse_mode = null, $disable_web_page_preview = null, $disable_notification = null, $reply_to_message_id = null, $reply_markup = null)
    {
        $response = $this->getClient()
            ->post('sendMessage', compact('chat_id', 'text', 'parse_mode', 'disable_web_page_preview', 'disable_notification', 'reply_to_message_id', 'reply_markup'))
            ->send();
        return $response->data;
    }

    public function getUpdates($offset, $timeout = 30)
    {
        $response = $this->getClient()
            ->post('getUpdates', ['offset'=>$offset, 'timeout'=>$timeout])
            ->send();
        return $response->data;
    }
}

Потом запускаю консольное приложение:
<?php

namespace app\console;

use Yii;

use app\telegram_logger\TelegramBot;

set_time_limit(0);
ini_set('memory_limit', '512M');

class TelegramController extends \yii\console\Controller
{
    const UPDATE_INFO_FILE = '@runtime/last_telegram_update_id.txt';

    public function actionIndex()
    {
        echo "Start waiting for messages\n";

        $bot = new TelegramBot(['token' => Yii::$app->params['telegram']['botToken']]);

        if (file_exists(Yii::getAlias(self::UPDATE_INFO_FILE))) {
            $last_update_id = Yii::getAlias(self::UPDATE_INFO_FILE);
        } else {
            $last_update_id = 1;
        }

        while (true) {
            echo "Requesting updates\n";
            $data = $bot->getUpdates($last_update_id, 5);
            if (empty($data)) {
                echo "Empty response\n";
            } else {
                if ($data['ok'] == 1) {
                    if (is_array($data['result'])) {
                        foreach ($data['result'] as $update) {
                            if (!empty($update['message']['text']) && $update['message']['text'] == '/getid') {
                                $bot->sendMessage($update['message']['chat']['id'], 'Ваш ID: '.$update['message']['chat']['id']);
                            }
                            $last_update_id = $update['update_id'] + 1;
                        }

                        file_put_contents(Yii::getAlias(self::UPDATE_INFO_FILE), $last_update_id);
                    } else {
                        echo "Result is not array\n";
                    }
                } else {
                    echo 'Error '.$data['error_code'].': '.$data['description']."\n";
                }
            }
        }

        echo "Finished\n";
    }
}


Сразу говорю, код плохой, я его делал на коленке, так как нужно было довольно срочно и, что называется "на вчера", но от него можно оттолкнуться. А вообще почитайте документацию Telegram Bot API, хотя она и запутанная.

P.S. В композер пропиши yii2-httpclient; также надеюсь вы знаете, как подключать консольное приложение.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы