Предыстория
Так уж случилось, что контора решила перейти с WhatsApp на Telegram. А так как лень двигатель прогресса, то я сделал простенького БОТ-а. Потом прикрутил БОТа к сайту, чтобы он постил оформленные документы в чаты. Теперь поступил «заказ» на БОТа что будет заниматься складом картриджей. И тут я решил, что пора бы уже написать систематизированный учебник, как быстренько наваять бота для телеги.
Начало — Папаша ботов: @BotFather
Первое, что нам нужно, это — придумать название боту. Например vlgkart. После чего сообщить папке ботов о том что мы хотим сделать нового бота. Для этого надо в телеграмме найти контакт @BotFather. Остерегайтесь подделок — там много ботов со схожим написанием!
После чего отправить ему команду начала работы с ним /start
После чего он таки начнёт с нами «беседовать». Конечно наша первая команда будет это /newbot и тут он спросит две вещи — как зовут бота и какой у него псевдоним. Обратите внимание, что псевдоним всегда должен заканчиваться на «bot».
Если папку всё устроит, то он нам выдаст токен для идентификации бота. Он у меня закрашен красным. Кто знает этот токен, тот сможет шалить от имени бота. Но, я вам покажу как исправить этот момент очень просто. Есть две команды:
/revoke — удалить текущий токен
/token — создать токен или отобразить текущий
Ну вот теперь, после того как я закончу урок, надо не забыть сменить токен своему боту.
Заменим боту картинку. Отправлять надо как ФОТО, а не как файл без сжатия.
Чтобы убедиться что картинка реально поменялась, просто найдём в пользователях нашего бота:
Картинку лучше слать квадратную. А ещё лучше если рисунок будет исключительно в центральном круге. Но, это вы и сами увидите. И… её можно поменять в любой момент. Собственно любую команду папка-боту можно задавать когда хочешь и сколько хочешь раз.
Тут же в чате можно ему нажать кнопку «Запустить» или ввести команду /start. Правда реакции не будет никакой, т.к. логику мы ему ещё не делали.
Что нам ещё нужно, так это отключить приватность нашему ботинку: /setprivace и disable. Что это даст? только то, что бот будет реагировать на любой текст в чате, а не только на команды начинающиеся на слэш.
Кстати, на этом идентификация или подготовка БОТа завершена.
Единственное, что в будущем нам может понадобиться, это рассказать папке о том, какие команды поддерживает наш пасынок. Делается это через /setcommands. Две команды являются обязательно рекомендуемыми: /start и /help. Их мы и зададим. И учтите, писать их надо одним сообщением (перевод строки у меня Ctrl+Enter)
Ну… И можно добавить краткое описание бота:
Кодим бота на PHP — SSL и HTTPS как камень преткновения
Есть два варианта работать с ботом — вебхуками и крон-запросами. Второй вариант нам не интересен. Я хочу чтобы бот работал тогда, когда он нужен. И тут мы упираемся в одно существенное ограничение — там где будет лежать бот, т.е. наш сайт, должен иметь защищённое подключение по https протоколу. При этом на имя домена абсолютно наплевать. Как купить/создать/устанавливать SSL сертификат рассматривать не буду. Скажу только, что для себя я его сгенерировал бесплатно на данном сервисе: https://certbot.eff.org/lets-encrypt/windows-apache
Ниже я вложил чутка обрезанный (работа с БД и мелочь) код из рабочего варианта бота по учёту «хотелок». Этого более чем достаточно для того чтобы понять как БОТ принимает и передаёт сообщения.
<?php /* /help - справка хз - комментируется "хер его знает" */ // где лежит лог define("LOG_FILE", "log/kart_log.json"); // токен данного бота define('TOKEN', '1906445235:AAEu2bpjbxvgrlMTvyZBB5Ewzhlv2yMwj8U'); // полученный WebHook $data = json_decode(file_get_contents('php://input'), TRUE); //пишем в файл лог сообщений file_put_contents(LOG_FILE, '$data: '.print_r($data, 1)."\n", FILE_APPEND); // преобразуем в удобоперевариваемый вид $data = $data['callback_query'] ? $data['callback_query'] : $data['message']; // конвертируем для русского языка $message = mb_strtolower(($data['text'] ? $data['text'] : $data['data']),'utf-8'); // начинаем распарсивать полученное сообщение $command = ''; // команды нет $user_text = ''; // текст от юзера пустой $message_length = strlen($message); // определяем длину сообщения if($message_length!=0){ // если сообщение не нулевое $fs_pos = strpos($message,' '); // определяем позицию первого пробела if($fs_pos === false){ // если пробелов нет, $command = $message; // то это целиком команда, без текста } else{ // если пробелы есть, // разделяем команду и текст $command = substr($message,0,$fs_pos); $user_text = substr($message,$fs_pos+1,$message_length-$fs_pos-1); } } // перебираем варианты сообщений из чата, в том числе и команды switch ($command) { case '/help': // простой пример обработки команды справки $method = 'sendMessage'; // .PHP_EOL. - это пример встраивания перевода строки $send_data = ['text' => 'справка подготавливается и когда нибудь будет готова...'. PHP_EOL . PHP_EOL .'/хотелка - и далее текст запоминаемой хотелки'.PHP_EOL .'/хотелки - выдаёт текущий список хотелок'.PHP_EOL .'/хотелки clear - очищает текущий список хотелок. <b>Осторожно!</b>'.PHP_EOL ]; break; // Это выход из switch, иначе будет обрабатывать и команды дальше case '/start': $method = 'sendMessage'; $send_data = ['text' => 'Начинаем работать...']; break; // тут перебираем, через условия, все остальные сообщения из чата // попросту - парсим им их default: // просто проверяем на вхождение подстроки $pos = strpos($message, 'хз'); // просто глумимся в конфе if ($pos !== false){ $method = 'sendMessage'; $send_data = ['text' => 'не хз, а "хрен его знает"']; } // команды с параметрами // тут обрабатывается команда if ($command === '/хотелка'){ $method = 'sendMessage'; // отправляем данные в БД $msg = 'ПРИНЯТО: ' . $user_text; // вырезаем контекст $send_data = ['text' => $msg ]; } // тут обрабатывается вся строка // эти две должны идти друг за другом!!! // сперва выведется список, потом он будет очищен! if ($command === '/хотелки'){ $method = 'sendMessage'; // $msg заполняется из БД $send_data = ['text' => $msg ]; } if ($message === '/хотелки clear'){ $method = 'sendMessage'; // $msg заполняется из БД - выше $msg=$msg . PHP_EOL . "<b>Список хотелок очищен...</b>"; $send_data = ['text' => $msg ]; } break; } // указываем в какой чат отправить $send_data['chat_id'] = $data['chat'] ['id']; // откуда получили, туда и кидаем ответ // указываем примитивный парсинг HTML $send_data['parse_mode'] = 'HTML'; // собственно отправка в телеграм if( isset($send_data['text'])){ $res = sendTelegram($method, $send_data); // тестирование - пишем в лог что отправляем file_put_contents(LOG_FILE, '$send_data: '.print_r($send_data, 1)."\n", FILE_APPEND); } // главная функция по отправке сообщения телеге // // это всё что нужно данной функции (если не считать токена) // $method = 'sendMessage'; // $send_data['chat_id'] = $data['chat'] ['id'] // $send_data = ['text' => 'не хз, а "хер его знает"']; function sendTelegram($method, $data, $headers = []) { $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_POST => 1, CURLOPT_HEADER => 0, CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => 'https://api.telegram.org/bot' . TOKEN . '/' . $method, CURLOPT_POSTFIELDS => json_encode($data), CURLOPT_HTTPHEADER => array_merge(array("Content-Type: application/json")) ]); $result = curl_exec($curl); curl_close($curl); return (json_decode($result, 1) ? json_decode($result, 1) : $result); } ?>
Сохраним его в файлик kart.php. Это и будет мозг нашего БОТа. А попросту это файл реализующий WebHook от сервера Telegram к нашему боту. Но чтобы телега об этом узнала, надо её об этом рассказать. Для этого надо использовать ссылку вида:
https://api.telegram.org/bot[BOTTOKEN]/setWebhook?url=https://[MYDOMEN]/[MYBOT]/bot.php
В нашем случае она будет выглядеть так:
Как видим(«Ok», «Webhook was set»), всё устроила телеграм и теперь наш бот будет «живым».
Можно начинать с ним «общаться».
Ну а мне на этом стоит попрощаться с Вами.
И пойти поменять токен у этой заготовки бота.
А обо всех возможностях для БОТов Telegram можно узнать на официальном сайте: