<MyRusakov.ru />

Разработчик игр на Unreal Engine

Разработчик игр на Unreal Engine

Этот комплект с нуля всего за 7 месяцев сделает Вас Unreal-разработчиком. И при этом учиться достаточно 1 час в день.

Начнёте Вы с основ программирования, постепенно перейдя к C++. Затем очень подробно изучите Unreal Engine, и после научитесь программировать на C++ в Unreal Engine. В конце создадите крупный проект на C++ в Unreal Engine для своего портфолио.

Комплект содержит:

- 416 видеоуроков

- 95 часов видео

- 1024 задания для закрепления материала из уроков

- 3 финальных тестирования

- 4 сертификата

- 12 Бонусных курсов

Подробнее
Подписка

Подпишитесь на мой канал на YouTube, где я регулярно публикую новые видео.

YouTube Подписаться

Подписавшись по E-mail, Вы будете получать уведомления о новых статьях.

Подписка Подписаться

Добавляйтесь ко мне в друзья ВКонтакте! Отзывы о сайте и обо мне оставляйте в моей группе.

Мой аккаунт Мой аккаунт Моя группа
Опрос

Какая тема Вас интересует больше?

Как можно создать простого Telegram-бота используя официальное Telegram Bot API

Как можно создать простого Telegram-бота используя официальное Telegram Bot API

Доброго времени суток! Сегодня мы рассмотрим с Вами пример, того как можно создать простого Telegram-бота используя официальное Telegram Bot API, без использования сторонних библиотек.

Итак, для начала необходимо создать бота через "отца всех ботов" @BotFather. Там Вы получите API-токен, который затем понадобиться для работы бота. Этот токен необходимо держать в секрете.

Общение с ботом идет с помощью сообщений. Поэтому давайте создадим PHP-класс, который будет представлять часть ответа бота - сообщение - Message.


<?php

class Message
{
    public function __construct(
        public readonly int $id, // идентификатор сообщения
        public readonly int $chat_id, // идентификатор чата - сюда можно будет слать сообщения пользователю
        public readonly string $first_name, // имя пользователя, если установлено
        public readonly string $username, // никнейм
        public readonly int $date, // дата сообщения
        public readonly ?string $text, // текст сообщения
        public readonly ?string $type, // тип сообщения
        public readonly ?string $phone, // номер- телефона
    )
    {}


    public static function from(array $data)
    {
        return new self(
            $data['message_id'],
            $data['chat']['id'],
            $data['chat']['first_name'],
            $data['chat']['username'],
            $data['date'],
            $data['text'] ?? null,
            $data['entities'][0]['type'] ?? null,
            $data['contact']['phone_number'] ?? null
        );
    }

    public function isBotCommand() : bool 
    {
        return $this->type === 'bot_command';    
    }

    public function __toString()
    {
        return json_encode($this, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
    }
}


Так как Telegram-сервер возвращает нам ответ в виде JSON, то мы преобразуем его в тип - Message, для дальнейшего удобного использования.

Теперь рассмотрим файл bot.php

В данном файле располагается все логика работы скрипта. Обратите внимание, что скрипт работает в режиме лонг-поллинга, т.е. запускается бесконечный цикл, в котором, через равные промежутки времени отправляется запрос на Telegram-сервер, который возвращает ответ, который содержит все сообщения отправленный пользователем боту. Но, так как нам не нужны постоянно одни и те же сообщения, то мы этот случай также обрабатываем с помощью переменной-счетчика $offset. В коде ниже есть комментарий.

Преимущество использования режима лонг-полинга (длинные запросы) в том, что бота можно запустить прямо на компьютере разработчика без настройки https веб-хуков на собственном домене.

<?php

require __DIR__ . '/Message.php'; // класс, созданный выше

const BOT_API_TOKEN = '1111111111:BsQsaaaaaaaaaaaaaaaaaaax-kNnnjsjj5d'; // токен вашего бота
const BOT_API_BASE_URL = 'https://api.telegram.org/bot' . BOT_API_TOKEN; // адрес откуда будут получаться сообщения и куда будут отправляться сообщения
const BOT_API_METHOD_SEND_MESSAGE = BOT_API_BASE_URL. '/sendMessage'; // url-адрес (метод Telegram Bot API) куда будут отправляться сообщения


// функция для отправки http-сообщений
function fetch(string $method, string $url, string $body, array $headers = []) {

    $context = stream_context_create([
        "http" => [
            "method"        => $method,
            "header"        => implode("\r\n", $headers),
            "content"       => $body,
            "ignore_errors" => true,
        ],
    ]);


    $response = file_get_contents($url, false, $context);

    $status_line = $http_response_header[0];

    preg_match('{HTTP\/\S*\s(\d{3})}', $status_line, $match);

    $status = $match[1];

    if ($status !== '200') {
        throw new RuntimeException("unexpected response status: {$status_line}\n" . $response);
    }

    return $response;
}

// получаем последние сообщения, отправленный боту
// параметр $offset - позволяет получать только последние сообщения
function getUpdates(int $offset)
{
    $updates = file_get_contents(BOT_API_BASE_URL . '/getUpdates?offset=' . $offset);
    return json_decode($updates, true);
}

// отправка сообщений в чат
function sendMessage(int $chat_id, string $message)
{
    $send_url = BOT_API_BASE_URL . "/sendMessage?chat_id=$chat_id&text=$message";
    return file_get_contents($send_url);
}

// отправка клавиатуры ботом
// запрашивает у пользователя номер телефона
function sendMarkup(int $chat_id, string $text)
{
    $keyboard = [
        'keyboard' => [[
            ['text' => '⚡️ Получить код по номеру ⚡️','request_contact' => true,]
        ]],
        'resize_keyboard' => true,
        'one_time_keyboard' => true,
    ];


    $data = [
        'chat_id' => $chat_id,
        'text' => $text,
        'reply_markup' => $keyboard
    ];

    return fetch('POST', BOT_API_METHOD_SEND_MESSAGE, json_encode($data), [
        'Content-Type: application/json',
    ]);
}


// глобальная переменная - смещение - необходима для получения только последний сообщений
$offset = -1;

// запускаем бесконечный цикл
while (true) 
{
    // получаем сообщения 
    $response = getUpdates($offset);

    // если все хорошо и есть сообщение
    if ($response['ok'] && !empty($response['result'][0])) {
        $item = $response['result'][0]; // получаем сообщение
        $offset = ++$item['update_id']; // увеличиваем глобальный счетчик сообщений на 1, чтобы при следующем запросе получить только последние сообщения

        // если сообщение не пустое
        if (!empty($item['message'])) 
        {
            // создаем объект класса сообщения и далее уже работаем с типизированный ответом (работает автодополнение)
            $message = Message::from($item['message']);
            $chat_id = $message->chat_id;

            // если это команда для бота, то реализуем необходимую нам логику
            if ($message->isBotCommand()) 
            {
                $chunks = explode(' ', $message->text);
                $command = $chunks[0];
                $args = !empty($chunks[1]) ? $chunks[1] : [];

                switch ($command) {
                    case '/start':
                        sendMessage($chat_id, "Привет, рады видеть Вас, $message->first_name");
                        break;

                    case '/debug':
                        sendMessage($chat_id, json_encode($response, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
                        break;

                    case '/verify':
                        $response_message = preg_match('#^7\d+#', trim($args)) ? "Отлично, Вы зарегистрированы с номером $args" : "Формат номера неверный";
                        sendMessage($chat_id, $response_message);
                        break;

                    case '/contact':

                        sendMarkup($chat_id, 'Для завершения регистрации необходимо предоставить номер боту, чтобы получить код');
                        break;

                    default:
                        sendMessage($chat_id, "Хммм... Не могу ответить на данный вопрос.");
                        break;
                }
            } else {
                print_r($response['result']);
                sendMessage($chat_id, "Возвращаю: $message");
            }


            print $message;
            print PHP_EOL;
        }
    }

    // останавливаем скрипт на 3 секунды
    sleep(3);
}


Запускается скрипт крайне просто:


$ php bot.php

Вот таким образом мы создали простого бота на PHP, использую только официальное Bot API от Telegram.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

  1. Кнопка:

    Она выглядит вот так: Как создать свой сайт

  2. Текстовая ссылка:

    Она выглядит вот так: Как создать свой сайт

  3. BB-код ссылки для форумов (например, можете поставить её в подписи):

Комментарии (0):

Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.