Как делать ботов в Телеграмме на php

Содержание

В прошлый раз мы разбирали более простой способ создания бота для телеграмм, который не требовал знаний программирования т.к. использовал сторонний сервис и визуальный конструктор. Сегодня предлагаю поднять планку и поговорить о том, как написать бота для Телеграм на php (это язык программирования). Если вы не программист, то материал ниже будет вам непонятен, поэтому советую прочитать другую статью. Итак, начнем.

Подготовка к написанию бота

Прежде чем мы приступим к написанию бота, убедимся, что у нас имеется в распоряжении хостинг и домен с https, а также API токен, который нам выдал Botfather (подробнее о том, как получить API ключ для Телеграмм бота см. тут).

Обращаться к API Телеграма будем при помощи TelegramBotApi. Соответственно, чтобы клонировать проект с Гитхаба нам понадобиться Composer. Composer как правило не устанавливается без файла php.exe. Самый просто способ это исправить — установить Open Server.

Клонирование проекта с Гитхаба

Telegram бот на PHP за 10 минут


Открываем командную строку, при помощи команды cd заходим в папку в которую будем устанавливать код и выполняем последовательно следующие команды: php -r «copy(‘https://getcomposer.org/installer’, ‘composer-setup.php’);» php composer-setup.php php -r «unlink(‘composer-setup.php’);»

Далее устанавливаем telegram-bot/api php composer.phar require telegram-bot/api

Заходим в папку и убеждаемся, что все файлы успешно установлены.

Теперь данные файлы помещаем на наш хостинг в папку, в которой будет располагаться наш бот. На этом подготовка завершена — приступим к кодингу.

Кодинг Telegram бота на php

В папке с ботом создадим файл index.php в котором мы и будем писать код нашего бота. Важно! Кодировка файла — utf-8 без bom!

header(‘Content-Type: text/html; charset=utf-8’); // подключаемся к API require_once(«vendor/autoload.php»); // создаем переменную бота $token = «токен, который выдал BotFather»; $bot = new TelegramBotApiClient($token);

После того как мы создали переменную бота $bot, мы можем обращаться к api, но прежде нам необходимо зарегистрировать webhook.

Что такое webhook?

WebHook — это механизм по которому выполняется связка бота с telegram’ом. Когда пользователь в телеграме вводит команду, ее надо каким-то образом передавать на сервер и получать ответ. Webhook как раз для этого и нужен. Он сообщает телеграму куда передавать команды. Поскольку Телеграм НЕ ЗНАЕТ, где именно расположен код нашего бота, то нам нужно это исправить.

Для этой цели у нас существует команда: $bot->setWebhook

// если бот еще не зарегистрирован — регистрируем if(!file_exists(«registered.trigger»))< /** * файл registered.trigger будет создаваться после регистрации бота. * если этого файла нет существует, значит бот не * зарегистрирован в Телеграмм */ // URl текущей страницы $page_url = «https://».$_SERVER[«SERVER_NAME»].$_SERVER[«REQUEST_URI»]; $result = $bot->setWebhook($page_url); if($result) < file_put_contents(«registered.trigger»,time()); // создаем файл дабы остановить повторные регистрации >> Прежде чем продолжить писать код — сохраним индексный файл и запустим его в том виде, в котором он есть сейчас. После запуска в папке с ботом должен появиться еще один файл — registered.trigger. Если файла появился — значит все сделали правильно и Телеграмм знает, где лежит наш бот.

Обязательные команды для ботов

Теперь необходимо научить нашего бота реагировать на обязательные для всех ботов команды /start и /help.

// обязательное. Запуск бота $bot->command(‘start’, function ($message) use ($bot) < $answer = ‘Добро пожаловать!’; $bot->sendMessage($message->getChat()->getId(), $answer); >); // помощь $bot->command(‘help’, function ($message) use ($bot) < $answer = ‘Команды: /help — помощь’; $bot->sendMessage($message->getChat()->getId(), $answer); >); // запускаем обработку $bot->run();

Снова сохраняем индексный файл и попробуем потестировать нашего бота! Ура, все пашет! Дальнейший кодинг зависит от поставленной Вами задачи, а потому самое время поговорить о том, как устроена наша API библиотека

Принцип работы библиотеки TelegramBotApi

Команды задаются блоком:

$bot->command(‘start’, function ($message) use ($bot) < >);

Где $message — объект Message, все его поля можно посмотреть тут — Types/Message.php

Все команды должны быть до вызова $bot->run(); , а иначе не будет работать. Т.е. $bot->run(); должен замыкать наш код.

Отправка сообщения в TelegramBot API

Отправка сообщения выполняется командой: $bot->sendMessage(id пользователя которому отправляем, текст сообщения);

Отправка картинок в TelegramBot API

Отправка картинок осуществляется через передачу Телеграмму ссылки на эту картинку. Мессенджер самостоятельно скачивает изображение и отдает пользователю! Для примера отправим юзеру картинку если он введет команду /getpic. // передаем картинку $bot->command(‘getpic’, function ($message) use ($bot) < $pic = «http://binetmed15.beget.tech/wp-content/uploads/forbot.jpg»; $bot->sendPhoto($message->getChat()->getId(), $pic); >);

Отправка документов и голосовых сообщений

Документы, в отличие от картинок необходимо оправлять ввиде POST. К счастью, библиотека TelegramBotApi сделает все что нужно без нашего с вами участия. Сначала загрузим документ в папку с нашим ботом (см картинку ниже)

Для отправки документа используем следующий код:

// передаем документ $bot->command(‘getdoc’, function ($message) use ($bot) < $document = new CURLFile(‘sendfrombot.txt’); $bot->sendDocument($message->getChat()->getId(), $document); >);

Обратите внимание, что строчка

$document = new CURLFile(‘sendfrombot.txt’);

предполагает размещение txt-файла sendfrombot в в корневой папке бота. Однако, можно передавать в переменную и обычный урл. С передачей голосовых сообщения (войсов) ситуация аналогична:

// передаем войс $bot->command(‘getvoice’, function ($message) use ($bot) < $voice = «http://binetmed15.beget.tech/wp-content/uploads/glazunov_maxim-prividenie.mp3»; $bot->sendVoice( $message->getChat()->getId(), $voice //, //$duration, //$replyToMessageId, //$replyMarkup, //$disableNotification ); >);

Получение сообщений из чата

Для получения данных из чата в API имеется команда .on(). С ее помощью мы можем прикрутить к нашему телеграм-боту, нейросеть для анализа сообщений или соорудитеь простенькую болталку по алгоритму Маркова, для отправки случайных сообщений в ответ на месенджы пользователя. Выглядеть это может примерно так:

// болталка $bot->on(function($Update) use ($bot)< $message = $Update->getMessage(); $mtext = $message->getText(); $cid = $message->getChat()->getId(); if(mb_stripos($mtext,»привет бот») !== false)< $bot->sendMessage($message->getChat()->getId(), «и тебе здорова, чувак!»); > >, function($message) use ($name)< return true; // когда тут true — команда проходит >);

Сообщаем Botfather-у список наших команд

После того как команды прописаны необходимо сообщить Botfather’у об их наличии (строго говоря это не является обязательным, но желательно все же добавить). Открываем чат с Botfather и вбиваем /setcommands (в случае опечатки используем команду /setcommands для переопределения).

Теперь потестим нашего телеграм-бота.

Как видим, все ок! Теперь вы знаете как создать своего бота на php для телеграмма. Успехов в разработке! В следующий раз мы продолжим дорабатывать нашего бота и разберем как добавить кнопки, а пока рекомендую скачать исходники текущего урока:

Источник: messagu.ru

telegram bot api — Как сделать телегам-бота на PHP (Symfony 4)

melisa's picture

Что же это такое? Если вопрос стоит так, то вам сюда.
С помощью Telegram-ботов сегодня можно обрабатывать сообщения и медиа-контент, работать со сторонними сервисами, организовывать опросы и даже проводить платежи. Давайте разберёмся, как написать своего телеграм-бота на PHP.

Регистрация

Для начала нужно зарегистрировать своего бота. Об этом на просторах интернета написано много статей, которые достаточно полно объясняют, как это сделать, например:

  • https://habrahabr.ru/company/netologyru/.
  • http://aftamat4ik.ru/pishem-bota-dlya-te.

А вот официальная документация от Telegram:

Webhook (обновление данных)

Как настроить и проверить, напишу здесь.

И далее наконец-то буду выкладывать свой вариант PHP-кода.

PHP

Для общения с Telegram-ботом можно использовать библиотеки, напрмер:

  • https://github.com/irazasyed/telegram-bo.
  • https://github.com/TelegramBot/Api

Но мы не ищем лёгких путей, поэтому пишу всё руками. Возможно, так будет нагляднее.

Логгирование

Начнём с печального. Логи ошибок, к сожалению, достать невозможно. Единственное, что можно предложить — возможность ручного дампа. Записываем данные, которые нужно проверить в файл:

// . file_put_contents($this->getProjectDir().’/var/log/telegram.log’, ‘гет проджект дир’); // .

В данном случае, происходит проверка, пишутся ли логи в файл telegram.log (предварительно создайте его), но в качестве второго аргумента вы можете передать что угодно.

Принимаем request

При настройке бота мы определили путь (route), на который будет поступать вся информация от Telegram API. У меня это /telegram. (Использую Symfony 4, путь прописываю в аннотации метода контроллера).
Контроллер будет выглядеть так:

// src/Controller/TelegramController.php getContent(), true); // . return $response; >

Достаём данные

Ну и сразу достаём данные, которые передаёт Telegram API так. Будьте внимательны 🙂 В зависимости от того, какие данные вы ожидаете, массив получаемый данных будет разный.

Роутинг

С помощью switch или elseif перебираем варианты текта сообщений, приходящих нам в Request-е и создаём индивидуальный $response:

switch ($text) : case ‘/start’: $responseBody = $startCommandHandler->getResponseBody($telegramId, $chatId); break; case ‘Анкета’: $responseBody = $worksheetCommandHandler->getResponseBody($telegramId, $chatId); break; case ‘Отменить’: $responseBody = $cancelCommandHandler->getResponseBody($telegramId, $chatId); break; case ‘/help’: $responseBody = $helpCommandHandler->getResponseBody($chatId); break; default: $responseBody = $defaultHandler->getResponseBody($telegramId, $chatId); endswitch; return new JsonResponse($responseBody);

Отправляем ответ

Следующий этап — ответ, который мы посылаем API:

// .. if ($text) < if ($text == ‘. ‘) < // здесь может быть код, если нужно что-то сделать перед ответом $response = new JsonResponse([ ‘method’ =>’. ‘, // также передаём здась другие аргументы, которые ожидает конкретный метод ]); > elseif ($text == ‘. ‘) < $response = new JsonResponse([ ‘method’ =>’. ‘, ]); > else < $response = new JsonResponse([ ‘method’ =>’. ‘, ]); > > return $response;

Методы — варианты response-ов (примеры кода)

Подробнее о действиях (методах), которые может прочитать Telegram API:

  • Отправить сообщение. sendMessage()
  • Вывести кнопки. sendMessage()

Вот и всё

Слепите всё вместе и получите рабочую модель telegram-bot-а. Логику обработки различных данных, приходящих от telegram API можно выделить в отдельные сервисы, логику формирования response тоже. Тогда вы получите более или менее красивую картинку)

Источники

  • https://core.telegram.org/bots
  • https://core.telegram.org/bots/api
  • или то же, на русском: https://tlgrm.ru/docs/bots/api
  • https://habrahabr.ru/company/netologyru/.
  • http://aftamat4ik.ru/pishem-bota-dlya-te.

Key Words for FKN + antitotal forum (CS VSU):

  • telegram bot api
  • как написать бота телеграм
  • простейший телеграм бот на php
  • symfony 4 telegram bot
  • логгирование telegram bot api
  • методы telegram bot api
  • response при работе с telegram bot api

Источник: fkn.ktu10.com

Как делать ботов в телеграмме на php

Добавлено: 15/04/2018 16:10 | Обновлено: 15/04/2018 18:51 | Добавил: nick | Просмотры: 10099 Комментарии: 0

В этом материале вы узнаете о том, как создать простой Telegram-бот для любителей собак, используя Dog API (dog.ceo/dog-api).

Материал является вольным переводом статьи Build A Telegram Bot with Laravel and BotMan с сайта scotch.io.

В данном материале для создания Telegram-бота мы используем известную библиотеку BotMan (botman.io).

На рисунке вы можете видеть результат работы созданного по этому материалу Telegram-бота. Здесь по команде /random бот вернул ссылку на случайную картинку собаки: Естественно, кроме этой команды, бот будет понимать и другие.

В первую очередь установим Botman Studio. Если вы не знаете, что это, то знайте, Botman Studio ­– это стандартное Laravel-приложение с уже включенной в него библиотекой Botman. Так что если вы уже работали с Laravel ранее, то большинство действий из этого материала будет для вас знакомо.

А теперь продолжим, и создадим новый проект командой:

composer create-project —prefer-dist botman/studio ilovedogs

После того, как все установится проверьте работает ли оно. Для этого наберите в браузере: [адрес вашего сайта]/botman/tinker (например, у меня было так: site1.com/botman/tinker), и в результате вы должны увидеть следующую страницу: Здесь нас интересует первая ссылка Tinker.

Перейдя по ней, вы увидите поле ввода, через которое можно «пообщаться» с ботом. Например, если ввести слово «Hi», в ответ вы получите «Hello!». Проверили, что все работает, можем продолжить.

В этом проекте нам нужно, чтобы бот отвечал на следующие типы команд:

  • запрос ссылки на случайную картинку из всех пород собак (команда /random)
  • запрос ссылки на случайную картинку с указанием породы (например, /b dachshund)
  • запрос ссылки на случайную картинку с указанием породы и подпороды (например, /s hound:afghan)

Также добавим простую возможность диалога, где можно выбрать желаемое действие из нескольких вариантов (команда Start conversation): Кроме возможности диалога, нужно еще предусмотреть вариант, когда человек будет вводить какие-то неизвестные команды: Это весь функционал, который нам предстоит реализовать. Читайте дальше, и вы узнаете, как это сделать.

Запрос ссылки на случайную картинку из всех пород собак (команда /random)

Для того, чтобы получить случайную картинку собаки из всех пород собак пользователю нужно будет ввести команду /random. Научим наш бот правильно реагировать на эту команду.

Откроем файл routes/botman.php и добавим туда новую строчку:

Далее создадим новый контроллер с помощью команды:

php artisan make:controller AllBreedsController
Его содержимое должно выглядеть следующим образом:

Здесь мы используем класс DogService (app/services/DogService.php), который будет отвечать за запросы к Dog API и возвращении полученной ссылки на картинку с собакой. Содержимое этого файла должно быть следующим:

Запрос ссылки на случайную картинку с указанием породы (например, /b dachshund)

Добавим новую строчку в файл routes/botman.php:
Далее откроем контроллер AllBreedsController, который мы создали ранее и добавим в него новый метод:

Определим используемый здесь метод byBreed() в сервисном классе DogService, который мы создали ранее:

Также не забудьте добавить константу с api-ссылкой для получения картинки по названию породы в начало класса DogService:

// The endpoint we will hit to get a random image by a given breed name. const BREED_ENDPOINT = ‘https://dog.ceo/api/breed/%s/images/random’;

Запрос ссылки на случайную картинку с указанием породы и подпороды (например, /s hound:afghan)

Добавим новую строчку в файл routes/botman.php:
Далее создадим новый контроллер с помощью команды:
php artisan make:controller SubBreedController

Его содержимое должно быть следующим:

Определим используемый здесь метод bySubBreed() в сервисном классе DogService, который мы создали ранее:

Также не забудьте добавить константу с api-ссылкой для получения картинки по названию породы и подпороды в начало DogService:

// The endpoint we will hit to get a random image by a given breed name and its sub-breed. const SUB_BREED_ENDPOINT = ‘https://dog.ceo/api/breed/%s/%s/images/random’;

Диалог с выбором желаемого действия (команда Start conversation)

Далее, с помощью artisan-команды создайте новый контроллер:
php artisan make:controller ConversationController
Его содержимое должно быть следующим:

startConversation(new DefaultConversation); > >

Здесь мы используем класс DefaultConversation, файл для которого нужно создать в папке app/Conversations. Эта папка уже должна быть в структуре проекта, поэтому остается только создать в ней новый файл DefaultConversation.php. Его содержимое должно быть следующим:

Неизвестные команды

Осталось предусмотреть вариант, когда пользователь вводит какие-то неизвестные команды, которые бот не знает. Снова откроем файл routes/botman.php и добавим новую строчку:

Создадим новый контроллер командой:

php artisan make:controller FallbackController
Его содержимое должно быть следующим:
reply(‘Sorry, I did not understand these commands. Try: ‘Start Conversation»); > >

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

Установка Telegram-драйвера

В первую очередь нужно установить Telegram-драйвер в проект:

composer require botman/driver-telegram

Создание нового Telegram-бота

Открываем Telegram и через поиск ищем BotFather. После чего пишем: /newbot. Далее выбираем имя для бота (name), я использовал имя BotmanTest.

Затем выбираем пользовательское имя (username), оно должно быть уникальным. После этого вы получите api-токен, который нужно указать в файле .env проекта, для этого добавьте следующую строчку в конец файла:

TELEGRAM_TOKEN=YOUR_TOKEN

И замените YOUR_TOKEN на полученный api-токен.

Открываем доступ извне к проекту с помощью ngrok

Чтобы не выкладывать свой тестовый проект на отдельный сервер в сети, воспользуемся утилитой ngrok. С помощью этой утилиты ваш проект на localhost станет доступен по отдельному адресу в Интернете. Если у вас еще не установлен ngrok, используйте официальную страницу (https://ngrok.com/download) для установки.

После того, как вы установите ngrok запустите Laravel-сервер:

php artisan serve
После чего перейдите в папку с ngrok и выполните команду:
./ngrok http 8000

Теперь ваш проект будет доступен из сети по адресам, которые указаны в строчках Forwarding: Для работы Telegram-бота нужен https-адрес, поэтому используйте его.

Связываем наш проект с Telegram

Для того, чтобы связать наш проект с Telegram, используйте Postman или CURL для выполнения следующей команды:

curl -X POST -F ‘url=https:///botman’ https://api.telegram.org/bot/setWebhook

YOU_URL – https-адрес из ngrok; TOKEN – это TELEGRAM_TOKEN, который вы указали ранее в файле .env.

Если вы все сделали правильно, то команда должна вернуть следующий результат:

На этом все, результат работы в Telegram приведен на картинке:

Источник: phpnick.ru

Рейтинг
( Пока оценок нет )
Загрузка ...