Урок 9. Telegram-бот

Видео-урок будет доступен после 15.12.2022

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

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

Ранее мы познакомились с языком разметки 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-массив с информацией о пользователе и его сообщении, которое он отправил в наш бот.

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

				
					$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;

foreach ($pictures as $picture) {
    $maxres_image = $picture -> file_id;
    
    $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

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

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

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

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

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

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

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