Предыстория
Так уж случилось, что контора решила перейти с 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 можно узнать на официальном сайте: