Telegram — Создание БОТа на PHP

Автор: | 10 августа, 2021
Поделиться...

Предыстория

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

https://core.telegram.org/api


Поделиться...

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *