Как создать простого бота

В предыдущих уроках мы научились отправлять и получать данные через API Telegram. Теперь настало время создать простого бота. Наш первый бот будет просто здороваться и выдать выдавать шутки.

Сначала нужно придумать как все будет работать: допустим при заходе в бота будет отправляться приветственное сообщение, а при отправке команды "/joke" бот будет отправлять случайную шутку. Отлично, можно приступать.

Когда вы открываете первый раз диалог с ботом, внизу есть кнопка "Запустить". При нажатии на эту кнопку бот получает от вас сообщение с текстом "/start".

На уроке "Получение данных" мы установили webhook по адресу https://botphp.ru/webhook.php, именно он принимает входящие сообщения. Давайте в нем и начнем писать новый код.

В первую очередь в начале файла зададим важные данные (Как вариант их можно задавать через константы): токен и наш id. После чего обработаем webhook, преобразуем полученный JSON в массив.


<?php

//token нашего бота, полученный от @BotFather
$token = '1234567890:ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';

//Наш собственный id в Telegram, который мы узнали в боте @getmyid_bot
$admin_id = '12345678910';

//получаем данные
$data = file_get_contents('php://input');

//преобразуем JSON в массив. Если указать вторым параметром true, то вернет массив
$array = json_decode($data,true);

Теперь напишем свою функцию "sendMessage". Она будет получать token бота, tg id человека которому нужно отправить сообщение и сам текст сообщения. Работать она будет с помощью CURL (вот документация). По себе скажу, что скорей всего, вы один раз создадите класс curl и всегда будете им пользоваться, почти не меняя ничего. Но все таки рекомендую посмотреть что значат настройки, хотя бы в данном примере. Посмотреть все настройки можете тут.


function sendMessage($token, $chat_id, $text){
    //собираем в массив параметры post
    $data = [
        'chat_id' => $chat_id,
        'text' => $text
    ];
    //Начинаем сеанс curl
    $ch = curl_init('https://api.telegram.org/bot' . $token . '/sendMessage');
    //Устанавливаем опции
    curl_setopt_array($ch, [
        CURLOPT_POST => count($data),
        CURLOPT_POSTFIELDS => http_build_query($data),
        CURLOPT_SSL_VERIFYPEER => 0,
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_TIMEOUT => 10
    ]);
    //Выполняем запрос curl и сразу превращаем данные из json в массив
    $res = json_decode(curl_exec($ch), true);
    //закрываем сеанс curl
    curl_close($ch);
    //возвращаем результат
    return $res;
}

Еще нам нужна функция которая будет давать случайный анекдот. Я нашел в интернете 20 афоризмов, которые буду использовать. Поместил их в массив и через функцию "rand" получаю случайный элемент этого массива.


//функция случайного текста
function getRandText() {
    //массив текстов
    $array = [
        'Они жили счастливо до конца жизни, пока не узнали, что другие живут дольше и гораздо счастливее.',
        'Жизнь делится на два этапа — сначала нет ума, потом здоровья.',
        'Курить вредно, пить противно, а умирать здоровым обидно.',
        'Мы учимся на своих ошибках и потом от этих ошибок лечимся.',
        'Рецепт простейших бутербродов: просто уложите кусочек хлеба на другой кусочек хлеба.',
        'Классика — это разновидность литературы, которую люди предпочитают хвалить, а не читать.',
        'Странный этот мир: двое смотрят одно и то же, а видят прямо противоположное.',
        'Только познав чёрную полосу в жизни, вы начинаете ценить серую.',
        'Честный человек, мечтающий стать политиком, должен помнить, что такое перевоплощение в принципе невозможно.',
        'В жизни настоящего программиста есть только две женщины: Ася и Клава. Ну, не считая матери. Хотите сладких снов? — Спите в торте!',
        'Какая крыша не любит быстрой езды!',
        'Когда вы начинаете вникать в суть любой распродажи, помните, что в русском языке слова «скидка» и «кинуть» имеют один и тот же корень.',
        'Все мужчины одинаковы, только зарплаты у них разные.',
        'Он лучше всех знал, как всё делать... Правда, ничего у него не получалось.',
        'Если они постоянно смеются над вами, это означает, что вы приносите радость людям.',
        'У каждого человека столько тщеславия, сколько ему не хватает интеллекта.',
        'В России многое изменилось за пять лет, почти ничего за двести лет.',
        'Синоптики, как и сапёры, ошибаются только один раз. Но каждый день.',
        'Если бы не мои ноги, меня бы здесь не было.',
        'Если в человеке все прекрасно, то может быть это не наш человек?',
    ];
    //возвращаем случайное значение массива
    return $array[rand(0, count($array)-1)];
}

Можно начинать писать логику работы нашего бота. Пока это у нас первый бот, для наглядности будем писать без всяких ООП и с помощью конструкции if else.

Проверим что мы действительно получили сообщение (мы же еще не знаем что там может слать webhook, так что навсякий случай проверяем), проверим сообщение от нас, проверим что сообщение это одна из двух команд "/start" или "/joke", после чего отправим сообщение. На всякий случай сделаем отправку сообщения тому кто не является админом, но заглянул к нам бота. Структуру массива $array вы можете посмотреть в файле result.txt, который мы создавали в уроке "получение данных".



//проверяем что мы получили сообщение
if(isset($array['message'])) {

    //проверяем что сообщение от наc (id равно указанному в переменной $admin_id)
    if(isset($array['message']['from']) and $array['message']['from']['id'] == $admin_id) {

        //проверяем что бот получил сообщение '/start'
        if(isset($array['message']['text']) and $array['message']['text'] == '/start') {
            //задаем сообщение
            $text = 'Привет создатель!';

            //отправляем сообщение
            sendMessage($token, $admin_id, $text);
        }

        //проверяем что бот получил сообщение '/joke'
        if(isset($array['message']['text']) and $array['message']['text'] == '/joke') {

            //задаем сообщение
            $text = getRandText();

            //отправляем сообщение
            sendMessage($token, $admin_id, $text);
        }

    } else { //кто то другой написал боту

        //получаем id пользователя что не является нами.
        $user_id = $array['message']['from']['id'];

        //Задаем сообщение
        $text = 'Вы кто такие? Я вас не звал, идите нафиг';

        //отправляем сообщение этому подозрительному пользователю
        sendMessage($token, $user_id, $text);
    }
}

Код нашего первого бота на PHP готов, можно его загрузить на хостинг. Только вот осталась одна деталь. Нам нужно настроить бота в @BotFather что бы появилась дополнительный команда (Это не обязательно, но так будет красивей). Заходим в бота @BotFather и жмем "Меню", в котором нужно выбрать команду "/mybots".

Выбираем нашего бота и жмем "Edit Bot" -> "Edit Commands". Придет сообщение с инструкцией как добавить команды для бота.

Напишем две команды:
start - Запуск бота
joke - Пошутить

Должно прийти сообщение "Success! Command list updated. /help", что значит что вы установили команды. Теперь у своего бота вы можете найти кнопку "Меню" со списком команд.

Давайте протестируем работу бота.

УРА 🥳 У нас теперь есть свой Telegram бот, который может здороваться и шутить.

Опубликовано: 10 ноября 2023
Автор: Семен