Урок 9. Telegram-бот

Полезные материалы:

Добро пожаловать на девятый (заключительный) урок курса для начинающих разработчиков под названием “Как гуглить?”.

Ранее мы познакомились с языком разметки HTML, каскадными таблицами стилей CSS, языками программирования PHP и Javascript, научились работать с базами данных MySQL и сегодня я бы хотел поговорить о том, с чем вам придется сталкиваться постоянно – об интеграциях.

В реальном мире крайне редко встречаются полностью обособленные информационные системы. Наоборот, зачастую, разработчику приходится реализовывать интеграции со сторонними системами.

На прошлом уроке, мы уже немного затронули вопрос интеграций – мы реализовали собственный API и сами же произвели интеграцию с этим API на стороне нашего мобильного приложения. В этом уроке, мы рассмотрим интеграцию со сторонними сервисами.

В качестве примера, я предлагаю реализовать Telegram-бота для сохранёнок. Бот позволит сохранять пересланные изображения на нашем сервере а в ответ отправлять прямую ссылку на сохранённое изображение.

Не изменяя своим принципам и не имея совершенно никакого понимания как делать чат-боты, мы идем в Google и формируем наш поисковый запрос: “Telegram бот php”.

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

Перво-наперво, нам нужно создать нашего бота через другого бота (BotFather): https://t.me/BotFather

Открываем Telegram, находим бота @BotFather и отправляем ему сообщение:

				
					/newbot
				
			

Отвечаем на предложенные вопросы и получаем токен, который нам позволит взаимодействовать с API Telegram для управления нашим ботом.

Продвигаясь по найденной ранее инструкции мы наткнёмся на так называемые “вебхуки”. Как говорит википедия, вебхук – метод расширения или изменения поведения веб-страницы или веб-приложения с помощью обратных вызовов. Эти обратные вызовы могут поддерживаться, изменяться и управляться сторонними пользователями и разработчиками, которые не обязательно связаны с исходным веб-сайтом или приложением.

Простыми словами, Telegram может отправлять на наш сервер информацию, которую получает Telegram-бот от использующих его пользователей.

Для того, чтобы Telegram отправлял информацию по нужному адресу нам нужно задать URL для вебхуков.

Переходим в панель управления нашим хостингом, создаем в корневой директории сайта, который мы использовали на всех прошлых уроках новую директорию – telegram, а в ней создадим файл webhook.php и сделаем так, чтобы все POST- и GET-запросы, которые отправляются в файл webhook.php сохранялись где-то рядом в текстовых файлах и у нас была возможность изучить, что приходит в наш вебхук.

				
					<?php
    $log_path = "log/".date("Y")."/";
    if (!file_exists($log_path)) {
        mkdir($log_path, 0777, true);
    }
    $log_path .= date("Y-m").".txt";
    $log .= "IP: ".$_SERVER['REMOTE_ADDR']."\n";
    $log .= file_get_contents('php://input');
    $log .= "~ ~ ~ ~ ~ ~ ~ ~ ~\n\n";
    $f = fopen($log_path, 'a');
    fwrite($f, $log);
    fclose($f);
?>
				
			

Также, в панели управления хостингом, для используемого нами доменного имени необходимо выпустить SSL-сертификат, т.к. API Telegram может работать только по протоколу HTTPS. Для этого переходим в раздел “Веб-сайты”, выбираем наш сайт и нажимаем “Редактировать”. В разделе “SSL-сертификаты” выбираем пункт “Новый сертификат Let’s encrypt” и нажимаем “Сохранить”.

				
					https://api.telegram.org/bot5236473451:AAEAjVbZY0kbxOLwBFYTV4j1YXRs77HmJEI/setWebhook?url=https://илонмаск.рф/telegram/webhook.php
				
			

Кусок 5236473451:AAEAjVbZY0kbxOLwBFYTV4j1YXRs77HmJEI в запросе необходимо заменить токеном, который мы получили от @BotFather, а https://илонмаск.рф/telegram/webhook.php – на полный URL-адрес нашего вебхука

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

Сейчас мы можем найти нашего бота в Telegram и написать ему что-нибудь.

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

Перейдем к директории telegram, откроем папку logs и попробуем открыть только что созданный текстовый документ.

В логах мы видим JSON-массив с информацией о пользователе и его сообщении, которое он отправил в наш бот.

Сейчас попробуем переслать в наш бот какой-нибудь пост с картинкой и посмотрим, что придет в логи.

				
					<?php
    $tg_token = "5236473451:AAEAjVbZY0kbxOLwBFYTV4j1YXRs77HmJEI"; //токен нашего Telegram-бота

    $website = "https://илонмаск.рф"; //адрес нашего сайта

	function generateRandomString($length = 16) {
		$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
		$charactersLength = strlen($characters);
		$randomString = '';
		for ($i = 0; $i < $length; $i++) {
			$randomString .= $characters[rand(0, $charactersLength - 1)];
		}
		return $randomString;
	}

	$json_data = json_decode(file_get_contents('php://input'));

	$pictures = $json_data -> message -> photo;
	$user_id = $json_data -> message -> from -> id;

    $bytes = 0;
	foreach ($pictures as $picture) {
	    if ($picture -> file_size > $bytes){
		    $maxres_image = $picture -> file_id;
		    $bytes = $picture -> file_size;
	    }
	}
	
	if ($bytes > 0){
    	$filename = generateRandomString();
    
        $tg_response = file_get_contents("https://api.telegram.org/bot$tg_token/getFile?file_id=$maxres_image");
        $tg_response = json_decode($tg_response);
    
        $image_path = $tg_response -> result -> file_path;
    
        $image = file_get_contents("https://api.telegram.org/file/bot$tg_token/" . $image_path);
    
        file_put_contents("../uploads/$filename.jpg", $image);
    
        $tg_data = [
            'chat_id' => $user_id,
            'text' => "$website/uploads/$filename.jpg"
        ];
        file_get_contents("https://api.telegram.org/bot$tg_token/sendMessage?".http_build_query($tg_data));
	}
?>
				
			

Готово! Теперь у нас есть Telegram-бот, позволяющий организовать хостинг картинок. Просто отправляем боту картинку или пересылаем в него чье-нибудь сообщение и получаем от бота прямую ссылку на изображение – отличная альтернатива Joxi или ipic.su

Скачать исходные файлы урока №9

Обсудите ваш проект с менеджером

    Я согласен на обработку персональных данных согласно политике конфиденциальности

    Звоните
    Пишите

    Meta* признана экстремистской организацией на территории РФ

    Служба поддержки

      Тариф Базовый Продвинутый Профессиональный
      При оплате на 1 год 390 руб./мес. 450 руб./мес. 490 руб./мес.
      При оплате на 2 года 332 руб./мес. 383 руб./мес. 417 руб./мес.
      При оплате на 3 года 273 руб./мес. 315 руб./мес. 343 руб./мес.

      Реквизиты для рассчётного счета

      Заполните реквизиты вашей организации, а мы подготовим и направим счет вам на электронную почту. Обратите внимание, при оплате через расчетный счет срок выполнения работ увеличен до 10 рабочих дней.

        Я согласен на обработку персональных данных согласно политике конфиденциальности