Как подключить telegram bot sdk
Для любого бизнеса важно установить канал общения с клиентами. Но сделать это не так просто. Психология людей такова, что они не хотят захламлять память своего смартфона новым фирменным приложением из того места, которое они посетили. Совсем другое дело — чат-бот. Ненавязчивый и дружелюбный. А кроме того — со всеми необходимыми фишками: рекламными акциями, скидками и быстрым заказом. И уведомления в одном единственном удобном мессенджере. Почему бы его не реализовать в своем бизнесе? Тем более, что это не так сложно, как вы думаете.
Сегодня мы поговорим о ботах и их API ( telegram api ) на базе популярного мессенджера Telegram.
Содержание
Telegram Bot API и Telegram API
Все началось с того, что Николай Дуров совместно с командой программистов создал криптографический протокол. Его движок задействовал комбинацию симметричного шифрования AES , протокол Диффи-Хеллмана для обмена ключами шифрования между клиентами и ряд хеш-функций. На основе этого протокола был построен MTProto — механизм, позволяющий пользователям сегодня использовать Telegram-мессенджеры.
На данный момент есть два основных инструмента API, с помощью которых можно задействовать сервисы Telegram — Telegram Bot API и Telegram API . Первый служит для разработки чат-ботов, второй позволяет делать полностью кастомные Telegram-клиенты. Разработчикам также доступна открытая библиотека TDLib (Telegram Database Library), с помощью которой можно создавать свою версию мессенджера с уникальными опциями (как например, Telegram X, построенный именно на TDLib). Telegram Bot API является надстройкой над Telegram API , поэтому пользоваться Bot API можно без знаний о механизме используемого протокола MTProto .
Принцип работы любого бота заключается в том, что он перманентно направляет запросы на сервер и регулярно получает обновления. Получать их можно двумя способами. Во-первых, можно использовать вебхуки, когда сервер делает обратный вызов на указанный URL. А во-вторых, можно просто « забрасывать » запросами Telegram, получая постоянные ответы.
BotFather: быстрый Start
Чтобы приступить к созданию собственного бота, необходимо получить токен для авторизации и подключения через API. Делается это при помощи служебного бота. Введите в поиске Telegram его имя — BotFather. Далее следует выбрать команду /newbot и дать имя боту.
Затем BotFather спросит вас имя, которое обязательно должно заканчиваться на bot , например, shop_serge_bot . Далее для бота будет сгенерирован уникальный токен, который будет выглядеть примерно так — 2093336709:AAGiH64Ec1R8r222sM9IywvlIGFkb7wFqyo .
Всего можно генерировать не более 20 ботов на одного пользователя. Управление ботами также происходит через меню команд служебного бота BotFather. Например, если вам потребуется настроить какой-то из ваших ботов, вы должны перейти по командам / mybots и затем нажать на кнопку Edit Bot . Здесь вы сможете настроить имя — Edit Name и указать описание — Edit Description .
В меню настроек BotSettings включается режим встроенных запросов (по умолчанию эта опция отключена). Когда встроенные запросы активированы, пользователи могут вызвать вашего бота, просто введя имя пользователя в поле для ввода текста в любом чате, группе или канале.
Если Telegram использовать в коммерческих целях, чат-бот можно вооружить средствами для приема платежей. Стоит обратить внимание, что сам Telegram не занимается проведением транзакций, он лишь дает возможность подключить услуги длинного списка провайдеров.
В их числе такие платежные системы, как Stripe, YooMoney, Сбербанк, PayMaster, PSB, Tranzzo, Payme, CLICK, LiqPay, Portmone, Paymega, ECOMMPAY и др. Разумеется, чтобы использовать эти платежные системы, нужно быть юридическим лицом.
aiogram — асинхронная библиотека
pip install -U aiogram.
Создаем эхо-бот
Создаем конфигурационный файл config.py и указываем в нем значение, сгенерированное ботом BotFather. Приступаем к написанию кода самого чат-бота.
Для начала импортируем конфигурацию и систему логирования. Затем подключаем все необходимые модули из aiogram . Указываем уровень логирования, а затем инициализируем бота, создав две переменные — Bot и Dispatcher .
Как уже говорилось ранее, обработка событий в Telegram может происходить двумя способами — long polling , когда мы со своей стороны постоянно запрашиваем сервер, а второй вариант — более мощное и быстрое решение вебхук . Реализация long polling на Linux имеет большой минус — бот часто зависает и его приходится постоянно перезапускать.
Если вы делаете бота, который работает с деньгами или какой-то конфиденциальной информацией, то параметр skip_updates лучше устанавливать в значение Falsе — тогда обработчик не будет пропускать старые события и будет обрабатывать их в любом случае. Если этого не делать, существует вероятность, что какая-нибудь важная транзакция может потеряться и возникнет потенциальная угроза безопасности (или коллизия).
Оформление: кнопки и текст
Например, URL button — простая кнопка со ссылкой на какой-то веб-ресурс. Вариант кнопки Callback запрашивает обновление. Она может применяться, скажем, для уведомлений или предупреждений (с окном notification или окном alert ). Кнопка для перехода в режим инлайн может открывать меню для выбора чата.
Другой тип кнопок — клавиатурный. Он дают возможность использовать подсказки бота. Например, они могут содержать наиболее частые запросы, ожидаемые от пользователя ( « как к вам проехать » , « время работы » и т.д.)
Один из примеров такой клавиатуры — бот в кафе для дистанционного принятия заказов:
Инструмент для оформления текста выбирается аргументом функции parse_mode .
Используя модуль markdown из aiogram.utils по ходу текста можно менять форматирование. Тип форматирования определяется функцией с дописанной к ней букве h , которая означает поддержку HTML.
Учим бот-модерации
Даем возможность бана в группе
Помимо основного кода нам понадобится сделать файл filters.py , который поместим рядом с главным файлом нашего бота:
В коде бота мы его импортируем:
Также необходимо в конфигурационном файле config.py указать id чата ( GROUP_ID ).
Все пользователи Telegram имеют свой id . Он постоянный, и поэтому по нему можно идентифицировать чаты. Если вдруг вы не знаете id , вы можете воспользоваться ботом @username_to_id_bot , который покажет это значение.
В токене бота первая часть — это его id . Например, токен 110301514:AмHdqTcvCG1vGWDxfyeDfSAs0K5PALDsaw принадлежит боту с id 110301514 . В Bot API перед id супергрупп и каналов добавляется -100 (например, id 1322414430 превращается в -1001322414430 ).
Заключение
Более сложные боты обладают искусственным интеллектом и умеют использовать нейронные сети. Возможности таких чат-ботов ограничены только вашей фантазией, но об этом — в следующий раз. А пока посмотрите дополнительное видео по технике создания ботов на JavaScript для Telegram API :
Highload нужны авторы технических текстов. Вы наш человек, если разбираетесь в разработке, знаете языки программирования и умеете просто писать о сложном!
Откликнуться на вакансию можно здесь .
Если вы читаете это, то скорее всего понимаете, что боты для чатов является популярным трендом в 2016 году.
Эволюция ботов заключается не только в искусственном интеллекте. Ботом может быть инструмент в вашем мессенджере с простым интерфейсом, который может быть использован для расширения функционала сайта или сервиса, или использован как отдельное приложение. Боты легки в разработке и установке, и еще один плюс заключается в том, что мессенджеры могут использоваться на любом устройстве: ноутбуках, смартфонах и планшетах. Вот почему все сходят с ума по ботам.
И наиболее популярным мессенджером с открытым API для ботов является Telegram.
Что мы собираемся делать
В этой статье мы создадим простой бот-секундомер для Telegram. Я покажу вам как создавать собственного бота, связываться с аналитикой, напишем немножко кода и в конце добавим своего бота в магазин ботов.
Кстати я заранее приготовил демо, так что вы можете протестировать бота, просто добавив @stopwatchbot в свой контакт лист в Telegram.
Создаем бота с помощью BotFather
Первым шагом при создании бота нужно зарегистрировать аккаунт для своего бота в Telegram. И для этого есть собственный бот, который называется BotFather. Просто добавьте его в свой контакт лист и вы сможете создавать и настраивать ботов Telegram, просто напечатав команду /newbot и следуя инструкциям от BotFather.
Позднее вы сможете использовать BotFather для добавления описаний и фото к профилям ваших ботов, регенерации токенов, задания списка доступных боту команд, удаления аккаунтов и прочее. Чтобы получить полный список команд, просто напечатайте /help в чате с BotFather.
Соединяемся с Botan Analytics
Не существует никакой встроенной аналитики в Telegrem Bots API, но все равно важно знать, сколько пользователей у вас есть, как они себя ведут и какие команды используют чаще других. Конечно можно собрать такую информацию, используя собственный движок, но если мы собираемся сфокусироваться на функционале самого бота, а не метриках, то нужно использовать решение из коробки.
И для этого уже есть простой инструмент, который называется Botan. Он основан на Yandex AppMetric и абсолютно бесплатный. Используя Botan, можно сегментировать вашу аудиторию, получать информацию о профилях пользователей, получить наиболее часто используемые команды, а так же получить красивые графики прямо в вашем мессенджере:
Для того чтобы начать, нужно зарегистрировать ваше бота в Botan и получить свой токен. И опять же это можно сделать в боте, используя BotanioBot:
Просто нажмите на "Add bot" на вашей клавиатуре в диалоговом окне, введите ник вашего бота, и получите ваш токен для трекинга. Теперь Botanio готов регистрировать события вашего бота, а вы можете получать статистику по пользователям, сессиям и событиям прямо в вашем мессенджере.
Создание и регистрация SSL Webhook
Если у вас подтвержденный SSL сертификат, то все что вам нужно, это открыть ваш URL в браузере:
Иначе необходимо сгенерировать самоподписанный сертификат. Вот пример команды в Linux для этого:
И не забудьте открыть SSL порт:
Чтобы подтвердить ваш сертификат и сделать ваш домен для webhook доверительным, необходимо загрузить свой публичный ключ:
В итоге вы получите следующий JSON ответ:
В нем сказано что webhook был установлен и мы готовы начать работу с ботом.
Создаем базу данных
Теперь нам нужно создать базу данных для наших таймеров. Что мы собираемся в ней хранить? Когда пользователь дает команду секундомеру начать отсчет, мы будем брать ID чата и сохранять строку с ID чата и текущим временем Unix. Следовательно мы сохраним строку с отметкой времени и ID чата.
Чтобы показывать текущее время секундомера, мы будем брать сохраненную метку времени и сравнивать ее с текущим временем. Разница и будет текущее время в секундах. Если пользователь останавливает секундомер, то мы просто удаляем строчку с данным ID чата.
Итак давайте создадим базу данных и таблицу для хранения информации для секундомера:
Создание класса Stopwatch
Наконец мы готовы начать писать код. Создадим класс для работы с базой данных в файле stopwatch.php и начнем с конструктора, который устанавливает два приватных свойства, где мы будем хранить ID чата и соединение с MySQL:
Когда пользователь запускает таймер, мы берем текущую временную метку Unix и сохраняем ее вместе с ID чата в методе start() :
Если таймер останавливается, то нам нужно удалить строку из базы данных:
И вот главная часть нашего класса. Когда пользователь запрашивает статус нашего таймера, нам нужно найти строку с секундомером из текущей беседы и подсчитать разницу в секундах между сохраненной временной меткой и текущим временем. К счастью временная метка Unix является целым числом, так что мы просто можем вычесть одно из другого. Чтобы отформатировать результирующее значение в виде времени, мы используем функцию gmdate .
Как видите, если в базе данных нет значения, то метод status() ничего не вернет, и мы обработаем значение null как остановленный таймер.
Выбор библиотеки PHP
Есть много PHP библиотек для работы с Telegram API, но на момент написания этой статьи лишь одна поддерживала одновременно Telegram Bot API и трекинг Botan. Она называется PHP Telegram Bot API.
Для установки библиотеки используем Composer:
Если вам не нужна аналитика, то попробуйте Bot API PHP SDK с интеграцией в Laravel или PHP Telegram Bot.
Запуск Webhook скрипта
И вот мы переходим к главной части - мы создаем скрипт для обработки обратных вызовов от Telegram Bot API. Создадим файл index.php и включим в него автозагрузчик Composer и новый класс Stopwatch. Откроем соединение MySQL, создадим нового клиента Telegram API и запустим его:
Создание команд
Для запуска секундомера, мы определим команду /go:
Она создаст объект класса Stopwatch и запустит таймер, вызывав метод start() , который мы определили ранее.
Чтобы определить команду /status , делаем аналогично. Просто вызываем метод status() и возврашаем результат. Если метод вернул null, сообщаем пользователю, что таймер не был запущен.
А если пользователь останавливает таймер, то нам нужно сначала получить статус, показать результирующее время, а затем остановить таймер, используя метод stop() .
И это все! Теперь вы можете загрузить все необходимые файлы в вашу директорию для webhook и протестировать своего бота.
Добавление клавиатуры
Теперь мы может добавлять клавиатуру к любой команде нашего бота. Я не стал включать здесь полный пример, но вы можете его увидеть в репозитории.
Добавление бота в Store
И в нем есть бот. для регистрации бота в каталоге ботов! Добавляем @storebot в свой контакт лист, пишем команду /add и следуем инструкциям. Вас попросят ввести имя бота, описание, выбрать одну из стандартных категорий, и подтвердить права на бота отправкой токена.
Через некоторое время ваш бот пройдет процесс подтверждения я появится в чартах Storebot. Теперь вы и ваши пользователи могу голосовать, находить и оценивать вашего бота в store, чтобы помочь ему подняться в каталоге.
Заключение
Мы прошли длинный путь, от создания простого бота до регистрации его в store, сделав его доступным для реальных пользователей. Как вы могли убедиться, существует много инструментов, которые сделают вашу жизнь проще при создании собственного бота, и не нужно писать много кода для создания простого бота. Теперь вы готовы к созданию собственного бота!
Если у вас есть какие-либо вопросы, не стесняйтесь задавать их в комментариях под статьей.
Возможно, кто-то о нас слышал. Мы — популярное интернет-издание по программированию. Мы не только пишем статьи на тему современной разработки, но и ищем способы, как держать аудиторию в постоянной заинтересованности к тому, что мы делаем.
Однажды мы решили, что нам нужно сделать бота. Бот должен был давать логические задачи в групповом чате в Telegram «Развиваем логику», закреплять их на то время, пока её решают, не давать новую, пока ответ кого-то из участников не наберёт десять (потом снизили до пяти) плюсов, а также вывешивать топ наиболее успешных решателей задачек.
Задача довольно простая, подумали мы, особенно учитывая волну популярности ботов и количество материала в сети по этой теме. Однако материала не очень качественного: кто-то не использует композер, а кто-то даже пишет весь код в одном файле-обработчике, полагая, очевидно, будто количество файлов влияет на скорость работы кода.
Сначала бот должен был просто давать задачи, причём их можно было пропускать, постоянно вызывая одну и ту же команду. Это первая проблема, которую мы стали решать. Выход нашёлся почти сразу: сохранение состояния бота (а точнее, текущей команды) в базе. Другими словами, получая команду /get, бот даёт задачу и сохраняет команду в базе.
После запуска бота в работу мы обнаружили ещё одну проблему: хэштеги не очень удобны для поиска. Ведь задача может уйти далеко наверх, а листать до неё или забивать в поиске — достаточно неинтересное занятие, чтобы стравливать его пользователю. Поэтому мы решили сразу же закреплять задачу, которую даёт бот. Причём закрепляет как раз он сам, а не мы (и да, делает это без уведомлений).
Ну и напоследок ещё одна проблема, которую мы с успехом решили. Некоторые задачи предполагали не точное решение, а наиболее подходящее. Как в таком случае должен поступить админ и чей ответ выбрать?
Какое решение быстрее наберёт пять плюсов, то и выбирается ботом как лучшее. Это хорошее решение не только с точки зрения справедливости, но и автоматизации: нам больше не придётся следить за чатом и читать все ответы.
Дело осталось за малым: написать бота. Мы ограничились Composer, библиотекой telegram-bot-sdk и symfony/dotenv для парсинга .env-файла. Весь код приводить не буду: он большой. Посмотреть на то, что получилось, можно по ссылке.
Composer — это стандарт при разработке на PHP. Он позволяет скачивать сторонние библиотеки на проект и предоставляет удобный механизм по автозагрузке классов. Вся работа с Composer происходит через консоль и в файле composer.json. Обычно он выглядит так:
Если вы разрабатываете не на фреймворке, то во множестве случаев создаёте composer.json самостоятельно и заполняете секцию autoload, которая загружает ваши классы по правилу psr-4, о котором можно найти много информации в интернете.
Далее вы выполняете команду composer install, и автозагрузка начинает работать. Также не забудьте про библиотеки, которые нужно установить, для этого выполните в терминале в папке с проектом следующие две команды:
composer require irazasyed/telegram-bot-sdk composer require symfony/dotenvИ тогда ваш composer.json станет похож на тот, что я показывал выше.
Сразу же продемонстрирую готовую структуру проекта:
Файл app.php является точкой входа в наше приложение, на который мы вешаем веб-хук (это значит, что бот не будет постоянно опрашивать сервер на наличие обновлений; он их будет получать только тогда, когда они будут). Вот как он выглядит:
// app.php <?php use App\Bot\CommonChatHandler; use App\Bot\PrivateChatHandler; use App\Handler; use App\Storage\DB; use Telegram\Bot\Api; require __DIR__ .'/vendor/autoload.php'; $settings = require __DIR__ . '/config/settings.php'; $api = new Api($settings['token']); $bot = new Handler($api); $db = new DB($settings['db']); if ($bot->getChatType() === "private") < (new PrivateChatHandler($bot, $db))->start(); >elseif ($bot->getChatType() === "supergroup") < (new CommonChatHandler($bot, $db))->start(); >Ничего необычного, создаём объекты всех нужных нам классов и делаем проверку на то, в каком чате мы находимся — приватном или супергруппе. Да, разделить код на достаточно независимые части является хорошей практикой. К тому же легче рефакторить и добавлять код, когда проблемы того потребуют.
Мы любим чистый код, поэтому настройки храним в файле .env, что позволит любому пользователю ввести свои, и бот будет работать (разумеется, после создания всех нужных таблиц).
// .env DB_DSN=mysql:host=changeme;dbname=changeme DB_USERNAME=changeme DB_PASSWORD=changeme BOT_ADMIN=changeme TOKEN=changemeОднако получить переменные окружения из .env можно только в том случае, если вы спарсите этот файл. Делается это крайне просто:
// config/settings.php <?php use Symfony\Component\Dotenv\Dotenv; $dotenv = new Dotenv(); $dotenv->loadEnv(__DIR__ . '/../.env'); return [ 'db' => [ 'dsn' => getenv('DB_DSN'), 'username' => getenv('DB_USERNAME'), 'password' => getenv('DB_PASSWORD') ], 'token' => getenv('TOKEN') ];Это тот самый файл, который мы включили в app.php. Там мы просто по ключу достаём нужные нам настройки:
$settings = require __DIR__ . '/config/settings.php'; $settings['token']; $settings['db'];В папках Admin и User хранятся классы по работе как с приватным чатом, так и с супергруппой. Это не только удобно, как я говорил выше, но и даёт возможность отключить деятельность бота в одном из режимов, если мы соберёмся добавлять в него функциональность.
Больше томить вас кодом не буду, повторю только, что теперь он в свободном доступе.
Так мы решили сразу несколько проблем и написали достаточно неплохой, легко поддерживаемый код для бота, который по-прежнему в добром здравии и надёжно выполняет свои функции.
Хоть и с большим запозданием, публикую шпаргалку по telegram bot api, может, будет полезна.
Прикладываю официальную документацию, и готовый набор методов для работы с telegram. Обработку тестировал на 8.3.15.1747.
В тексте я буду давать ссылки на вторую документацию т.к. для ее просмотра не нужны премудрости для обхода блокировок.
В клиенте telegram ищем бота BotFather
Далее отправляем ему команды
/start
/newbot
Представление имени моего бота
unikalnoe_imya_bot
После этого бот выдаст нам данные для подключения, а именно токен вида 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11
Скринами
Соединение
В документации написано:
Код создания соединения :
Прокси
Есть огромное количество сайтов предоставляющий список таких бесплатных прокси, я использую getMe
Я специально буду повторять блоки кода, дабы Вы копировали сразу рабочий вариант, конечно это все нужно обернуть в функции и процедуры
Метод getMe вернет в теле ответа JSON структуру
"ok":true - Означает, что авторизация прошла успешно и Ваш токен валидный.
Short polling - это классическая схема, когда отправляя запрос мы сразу получаем результат его выполнения.
т.е. вы заводите РС с обработанными update_id и каждый раз анализируете - обработан полученный id или нет. Можно завести константу с последним обработанным update_id и сравнивать ее на < или > с полученным
Для работы в такой схеме необходимо договориться с сервером - какой таймаут считать допустимым, для этого у метода
Для переключения режима обмена на вебхуки существует метод InlineKeyboardMarkup
Загрузка полученных файлов
Для этого существует GET-метод
Ответ сервиса getFile
При этом запросе сервер ответит, что все Ок
Показ привью отправленной ссылки можно отключить с помощью параметра disable_web_page_preview
Для этого нужно к запросу добавить строку &disable_web_page_preview=true
Кнопки (клавиатуры)
У метода sendMessage есть еще один очень интересный параметр - reply_markup, который отвечает за быстрые ответы.
Кнопка - это объект InlineKeyboardButton, у которого только одно обязательное поле - text
Есть еще ряд полей, основное из которых - callback_data. Это данные, которые будут отправлены после нажатия кнопки пользователем. Сюда можно записывать идентификаторы из 1С (документа или справочника), числа и т.д. для последующей обработки.
Второй полезный параметр - url, в котором указывается ссылка, которая будет открыта при нажатии на кнопку
Пример JSON-описания клавиатуры
KeyboardButton с основным полем text, данный объект можно не использовать и сразу формировать массив строк.
Еще один важный параметр клавиатуры, но не обязательным, является resize_keyboard, который отвечает за "авто высоту" кнопок.
По умолчанию данный параметр установлен в false и клавиатура растягивается на высоту основной клавиатуры, что выглядит громоздко (см. скрин в примере).
Еще один опциональный параметр - one_time_keyboard, который при установке в true скрывает клавиатуру после нажатия кнопки.
ReplyKeyboardHide - Своего рода команда управления видимостью для клавиатуры
Отправка контактов
Метод похож на sendMessage за исключением нескольких обязательных полей:
phone_number - строковое представление телефонного номера
first_name - Имя контакта
Отправка документов (файлов)
За отправку файлов отвечает POST-метод
Со строковыми значениями вопросов не возникает - делаем СтрЗаменить и все, но есть еще и содержимое файла, которое нужно в итоговый запрос подсунуть.
Для решения этой проблемы у 1С есть метод ОбъединитьФайлы, который объединяет переданный в него массив файлов в один.
Разделим шаблон на части - певая это текст до %СодержимоеФайла%, а вторая это текст после %СодержимоеФайла%. Запишем эти 2 текста в файлы и используем ОбъединитьФайлы подсунув между текстовиками отправляемый файл.
Читайте также: