Как отредактировать бота в телеграм
Боты: информация для разработчиков
Боты — специальные аккаунты в Telegram, созданные для того, чтобы автоматически обрабатывать и отправлять сообщения. Пользователи могут взаимодействовать с ботами при помощи сообщений, отправляемых через обычные или групповые чаты. Логика бота контролируется при помощи HTTPS запросов к нашему API для ботов.
Общие сведения
Что могут делать боты?
Вот несколько примеров использования ботов:
Как работают боты?
Как уже было сказано ранее, роботы — особые аккаунты, которые не требуют номера телефона при создании. По сути, эти аккаунты играют роль интерфейса к вашему сервису, который работает на удалённом сервере.
Самое интересное в роботах это то, что для их создания вам не нужно изучать низкоуровневые методы работы с MTProto и шифрованием — общение с роботом организовано при помощи обычного HTTPS интерфейса с упрощёнными методами Telegram API. Мы назвали его Bot API.
Рекомендуем также ознакомиться с подробным описанием Bot API.
Как создать бота?
Для этого есть. Бот. Просто напишите пользователю @BotFather и следуйте его инструкциям. Как только вы создали бота и получили свой ключ (токен) авторизации, переходите в раздел документации Bot API, чтобы начать настраивать вашего бота.
Чем бот отличается от обычного аккаунта?
Суперспособности
У роботов Telegram есть много уникальных возможностей — например, кастомизированные клавиатуры, дополнительные интерфейсы для команд по умолчанию, внешнее связывание и специальные режимы приватности для групп.
Инлайн-режим
Пользователи могут общаться с вашим ботом напрямую из поля ввода сообщения — из любого чата или группы. Для этого нужно всего лишь набрать имя пользователя вашего бота и запрос для поиска. Получив запрос, бот может возвратить какие-либо результаты. Как только пользователь нажмёт на один из них, он сразу же отправится в чат. Таким образом можно запрашивать контент от бота в чатах, группах или каналах.
С помощью ботов пользователи могут играть в HTML5-игры в группах или приватных чатах. Игровая платформа Telegram поможет составить таблицу рекордов и оповещать пользователей об изменении рейтинга.

Под капотом у игр — HTML5, поэтому вы можете создавать игры любой сложности. На данный момент командой Telegram созданы несколько демо-игр:
Клавиатуры
Одна из самых необычных возможностей Bot API — кастомизированные клавиатуры. При передаче сервером ответа есть возможность передать команду на отображение специальной клавиатуры с предустановленными вариантами ответа (см. ReplyKeyboardMarkup). Клиент Telegram, получив сообщение, отобразит пользователю вашу клавиатуру. Нажатие на клавишу сразу же отправит на сервер соответствующую команду. Таким образом можно значительно упростить взаимодействие робота с пользователем. На данный момент для отображения на клавише могут использоваться эмодзи и текст. Вот несколько примеров таких клавиатур:

За более подробной информацией обращайтесь к описанию метода sendMessage.
Команды
Команды представляют собой более гибкий способ общения с ботом. Рекомендуется следующий синтаксис:
Команда должна начинаться с символа косой черты «/» и не может быть длиннее 32 символов. Команды могут состоять из букв латинского алфавита, цифр и подчёркивания. Несколько примеров:
Сообщения, начинающиеся с косой черты, будут всегда доставляться боту (точно также, как и при ответе на его сообщения и на @упоминания бота в чате). Приложения Telegram будут:
Если в группе есть несколько ботов, вы можете дописать после команды имя бота, чтобы избежать коллизий в общих командах:
Это происходит автоматически, если вы выбираете команду из списка доступных.
Глобальные команды
Чтобы пользователям было проще работать с ботами, мы просим всех разработчиков реализовывать поддержку нескольких простых команд. В интерфейсе приложений Telegram будут ярлыки (быстрые ссылки) для этих команд.
При попытке начать общение с роботом, пользователь увидит кнопку СТАРТ. На странице профиля бота также будут доступны ссылки Помощь и Настройки.

Режим приватности
Ботов часто добавляют в группы, чтобы получать различную информацию — новости, уведомления и т.д. Однако, при добавлении бота вы наверняка спрашивали себя: «А что если этот маленький засранец пересылает всю групповую переписку куда-то “налево”?» Именно поэтому у роботов есть режимы приватности.
Робот с включенным режимом приватности не будет получать всех сообщений, а только сообщения, удовлетворяющие этим условиям:
Это хорошо со всех сторон: во первых, некоторые люди будут спать спокойно (в своих шапочках из фольги), не опасаясь, что их будут прослушивать. Во-вторых, режим приватности избавляет разработчиков от необходимости обрабатывать сотни ненужных сообщений из групповых чатов.
Мы рекомендуем отключать режим приватности только в случаях крайней необходимости. В подавляющем большинстве случаев, запроса принудительного ответа на сообщение бота будет достаточно.
Внешнее связывание
Боты имеют механизм внешнего связывания, которые позволяет передать дополнительные параметры при запуске. Например, для передачи авторизационного токена пользователя, чтобы соединить его аккаунт с каким-либо внешним сервисом.
Переход по ссылке с параметром start начнет чат с ботом, при этом в поле ввода текста будет отображаться кнопка СТАРТ. При переходе по ссылке с параметром startgroup пользователю будет предложено добавить бота в одну из доступных групп. Как только пользователь подтвердит своё действие (нажмёт на кнопку СТАРТ или выберет группу), бот получит сообщение следующего формата:
Пример реализации внешнего связывания
BotFather
BotFather — один бот, чтобы править всеми. При помощи него меняются настройки у существующих ботов и создаются новые.
Создание бота
Имя (name) будет отображаться в контактах и чатах.
Username — короткое имя на латинице, которое используется для упоминаний бота и в ссылках на профиль в telegram.me. Username должен состоять из букв латинского алфавита, подчёркиваний и цифр и быть длиной от 5 до 32 символов. Также имя пользователя обязательно должно заканчиваться на «bot», например: «tetris_bot» или «TetrisBot».
Создание токена
Настройки
Пожалуйста, имейте в виду, что для применения настроек на сервере, возможно, потребуется некоторое время.
Сайт про Telegram на русском (неофициальный).
Здесь собраны приложения на базе MTProto, переведена некоторая документация с официального сайта, а также работает Webogram.
Как создать чат-бота или бота для канала в Телеграм: учимся создавать ботов, команды, меню, отложенные посты, опросы и включаем автопостинг из социальных сетей или rss-лент
Всем привет! Сегодня я расскажу вам о том, как создать бота в Телеграм и зачем это может понадобиться владельцу популярного канала. Сразу хочу успокоить – уметь программировать не нужно. Хотя, конечно, если вы заядлый программист, то флаг вам в руки. Говорят, это достаточно просто.
Итак, зачем же нужны боты в Telegram и как их создать новичку? Как настроить меню, добавить команды или активировать автопостинг из социальных сетей? Давайте разбираться.
Зачем нужны боты
Telegram — один из самых популярных мессенджеров в России, постепенно завоёвывающий любовь и признание во всём мире. Его создателем является Павел Дуров, некогда создавший социальную сеть ВКонтакте. Мессенджер обладает множеством функций, при этом он абсолютно бесплатный. Даже стикеры вы можете подключить на халяву или сделать самостоятельно.
Одной из уникальных и очень удобных фишек приложения считаются боты. Они служат для выполнения самых разных задач:
Как видите, вариантов использования много, а ведь я назвал далеко не все. Но, могу вас заверить, без помощи бота создать по настоящему интересный и полезный канал, посты в котором будут привлекать пользователей и подталкивать их к подписке – невозможно.
Способы создания бота в Telegram
Всего существует два способа, как можно сделать помощника для чата или канала. Первый, как вы уже могли догадаться – для программистов. Добавлю только, что для работы придется воспользоваться Telegram API. Я в этом не силен, поэтому выбираю второй вариант. Он не требует никаких дополнительных навыков и вполне подходит новичкам.
Как создать
Для начала вам нужно найти @Manybot и подписаться на него, нажав кнопку «Запустить»:
Чтобы не париться с языком – выбираем «Русский»:
Нажимаем «Добавить нового бота»:
А теперь нужно следовать инструкции, которую пришлют в чат и подключить нового бота. Для этого нажимаем вот сюда:
Активируем его и щелкаем вот по этой команде:
Вводим имя (обязательно латиницей) и нажимаем отправить. Снова вводим название, но уже пользовательское (оно обязательно должно заканчиваться словом «bot»).
Рекомендую просто к уже придуманному имени добавить требуемое окончание.
Остается скопировать следующий API:
И прислать его Manybot:
Описываем назначение нашего бота или скипаем данный шаг.
Поздравляю, вы справились и сделали своего первого бота для чата или канала в Telegram! Теперь его можно подключать (добавить, как подписчика) и обучать различным командам.
Если не знаете, как подключить помощника к каналу, то вот инструкция. Вам нужно:
Для чата процедура идентичная. Ну, если разработчики ничего не изменили. А теперь давайте научимся подключать различные команды.
Прописываем команды
Я не буду особо заморачиваться и сделаю что-нибудь простенькое. Вам главное запомнить принцип, а дальше все пойдет, как по маслу.
Чтобы прописать команду нужно:
Довольно просто, правда? Теперь, когда люди активируют вашего бота и пропишут команду, получат в ответ заранее созданное сообщение.
Чтобы отредактировать уже созданную команду необходимо вернуться в главное меню и зайти в раздел «Пользовательские команды», после чего выбрать нужную:
Как создать меню в боте
Если есть время и желание довести своё творение до ума, то создание красивого меню в вашем боте – отличный выбор. Для этого нужно:
Если вам вдруг приспичило настроить внешний вид, переименовать кнопку или вовсе её удалить, нужно снова зайти в «Команды» и «Настройки меню», после чего нажать на желаемую клавишу. Дальше дело техники, а все возможные варианты настройки вам сразу же покажут:
Полезные фишки
А сейчас я продемонстрирую три крутые фишки, которыми можно воспользоваться после создания бота в Телеграме.
Как включить автопостинг из соц сетей
Первая и самая интересная – автопостинг из социальных сетей (ВК, Twitter, YouTube) или RSS ленты в канал или чат в Telegram. Она позволяет сэкономить уйму времени и упростить продвижение канала. Чтобы её включить, нужно:
Всё, теперь новые записи в соц. сетях или rss ленте будут автоматически дублироваться в чате или канале.
Для ВКонтакте нужна именно публичная страница, с личной такое не прокатит.
Учимся делать отложенные посты
Еще одна полезная функция – отложенные посты. Довольно часто бывают ситуации, когда времени на публикацию нет, а сделать это просто необходимо. Чтобы не забивать голову решением подобных проблем, в Telegram можно заранее продумать темы публикаций, подготовить материал и воспользоваться ботом, который сам все отправит в указанное время.
Итак, для начала вам нужно ввести /newpost или выбрать «Отправить новое сообщение» в меню. Придумываем текст, добавляем картинки или музыку, отправляем всё это боту и нажимаем «Отложить».
Выскочит оповещение, после чего нужно указать текущее время (настраиваем часовой пояс – это делается один раз):
Теперь нужно указать время публикации. Для этого выбираем день и отправляем точное время, нажимаем «Сохранить»:
Готово! В нужный час публикация отобразится у всех пользователей.
Как создать опрос
Последняя важная функция, которую я сейчас разберу – опросы. Ну, тут без комментариев, сами должны понимать, зачем они нужны и как ими воспользоваться для продвижения канала. Моё дело рассказать, как их создать.
Для начала нажмите «Пользовательские команды» и «Создать». Введите и отправьте название:
Нажмите «Добавить вопрос» и выберете его тип (я выбрал обычный):
Введите и отправьте вопрос:
Нажмите сохранить и всё, готово. Кстати, чтобы проверить ответы, вернитесь в главное меню и нажмите «Ответы на формы», после чего найдите и выберете нужную:
Заключение
Как видите, создать бота в Телеграм достаточно просто и быстро. Они полезные, а когда дело доходит до украшения публикаций, проведения опросов и улучшения администрирования – становятся просто незаменимой палочкой выручалочкой в руках админа.
На этом всё. Подписывайтесь и до встречи в следующих статьях. Пока-пока!
TelegramBot. Базовый функционал. Мухи отдельно, котлеты отдельно. (Часть 2)
Продолжаем разрабатывать базовый функционал для бота в телеграм. В предыдущих частях обсуждался момент, что работу бота по получению сообщений, обработке и отправке нужно разделять. Давайте попробуем с помощью базовых инструментов Java Core сделать нашего бота многопоточным и асинхронным. Придумаем ему такое задание, которое занимает очень много времени на обработку. Рассмотрим как работают команды в телеграмме и как их нужно обрабатывать.
Это продолжение первой части статьи по программированию ботов для телеграмм на Java
TelegramBot инструкция по созданию базового функционала для бота. (Часть 1)
Кому интересно дальше, милости прошу под кат…
Сразу скажу, в этой части добавлено сразу много всего и по-тихоньку мы с вами разберем всю ту функциональность, что позволила боту суметь в многопоточность и зачем она ему вообще нужна.
Как обычно с главного:
Весь готовый код по этой статье вы можете найти в ветке Part2-Handlers в гит-репозитории.
Код полностью рабочий, достаточно склонироваться, изменить данные для авторизации бота(имя и токен) и запустить метод main в классе App.class.
Обратите внимание, данный класс при старте бота отправляет уведомление админу бота о том, что бот стартовал. ID админа бота также указывается в классе App.class и если вы его не измените — ваш бот будет пытаться слать сообщения мне 🙂
А дальше по пунктам разберем те изменения, которые появились после выхода первой части.
Обработка команд
Давайте для начала разберемся с таким понятием, что такое вообще команда в системе общения с телеграм ботом. В зависимости от настроек бота, он может либо видеть любые сообщения любого формата либо только специально оформленные команды. В чем отличие и
где можно встретить эти варианты сообщений.
Вызвав команду /myBots выберите вашего бота и дальше кнопка «Edit Bot»
Вы получите такое окно, где будут показаны все параметры бота и дальше можно настроить весь его интерфейс и указать с какими командами ваш бот умеет работать.
Задаются они вот в таком формате:
И после этого при начале ввода команды вашему боту — он будет показывать помощь со списком перечисленных команд:
И есть еще один нюанс. В группе может присутствовать несколько ботов и если у них есть общие команды(а общие команды обязательно будут, те же start и help реализованы у большей части ботов), то к самой команде обязательно будет добавлена часть, сообщающая к какому боту эта команда относится. И выглядеть команда полностью будет вот так:
/start@test_habr_bot
И вот зная все эти нюансы, давайте создадим с вами такой вариант обработки, который должен понимать команды, начинающиеся с наклонной черты и умеющий отличать адресована ли команда именно вашему боту или какому-то другому.
Создадим package, который у нас будет содержать классы, ответственные за обработку команд.
package com.example.telegrambot.command
В классе Command мы перечислим все команды, которые должен уметь понимать наш бот.
Как вы видели ранее, я у @BotFather указал, что бот у меня должен уметь понимать 4 команды. Это будут стандартные start и help. Одну добавим полезную — id. И еще одну, notify, про которую я расскажу чуть позже. И две команды NONE и NOTFORME, которые будут говорить нам, что текст сообщение либо вообще не является командой, либо это команда не для нашего бота.
Еще добавим один вспомогательный класс ParsedCommand
Основное его назначение — в объектах этого класса мы будет хранить результат парсинга текста. Содержаться в нем будет только сама команда и весь текст, который идет после команды.
И напишем отдельный класс, который будет нам парсить команды. Класс Parser
Вкратце. При инициализации парсера мы обязательно передаем в конструкторе имя нашего бота, чтобы парсер умел отличать свои команды от чужих.
Ну и дальше мы просто вызываем публичный метод
Которому в аргументах передаем текст сообщения, а он нам в ответ должен вернуть команду и текст сообщения идущий после команды.
Как работает парсер вы можете увидеть в тестовом классе.
Мухи отдельно, котлеты отдельно
Теперь нам нужно научить нашего бота раздельно получать сообщения, обрабатывать и отправлять ответы. После ряда проб и ошибок я пришел вот к такой логике работы приложения.
Основной класс Bot будет работать в основном потоке приложения и будет занят только тем, что все полученные сообщения будет складывать в специальную очередь и так же будет контейнером для сообщений, которые мы планируем отправить пользователю в ответ.
Изменения в этом классе очень незначительные. Мы добавили две очереди:
и немного переписали код функции public void onUpdateReceived(Update update)
Почему так? Опять таки я перепробовал разные варианты. И основная проблема многопоточности — это работа с общими данными. И мне больше всего понравилось как с этим справляется реализация многопоточных очередей ConcurrentLinkedQueue<>()
И как вы видите, в обоих очередях у нас будут хранится типы данных Object. Это еще одна закладка на будущее. Таким образом мы не привязываемся к типам полученных сообщений. Во входящую очередь сможем складывать не только объекты типа Update а и какие-то другие, нужные нам.
Тоже самое и с очередью на отправку. Так как мы можем отправлять самые разные типы сообщений и у них нет общего родителя — мы также используем общий тип данных — Object.
Если в таком виде запустить бота, то он будет работать, но не будет делать ничего. Все полученные сообщения он будет фиксировать в логе и складывать в очередь.
Следовательно нам нужен какой-то поток, который займется тем, что будет забирать из очереди принятые сообщения и совершать над ними какие-то действия и складывать в очередь sendQueue результаты своей работы.
Создадим отдельный package: service и в нем у нас будет всего 2 класса:
MessageReciever — обработчик полученных сообщений
MessageSender — обработчик очереди сообщений, которые нужно отправить пользователю.
Их работу мы рассмотрим чуть ниже, а пока пропишем их использование в нашем стартовом классе App
После того, как наш бот приконнектился — мы стартует наши обработчики в отдельных потоках:
Для обоих потоков мы указываем режим Daemon. Это нужно для того, чтобы потоки работали до тех пор, пока работает основной поток и сами завершались, как только он свою работу прекращает.
Как бы не хотелось разобраться в первую очередь с обработчиком входящих сообщений — давайте разберем работу класса MessageSender.
Разберем по пунктам, что он умеет и что делает:
Тут мы запускам бесконечный цикл, который занят только тем, что он проверяет очередь на отправку и вызывает команду send
Он, как и MessageSender, должен быть многопоточным, в конструкторе получать объект класса Bot, в котором он в бесконечном цикле будет брать принятые сообщения, обрабатывать их и складывать ему же в очередь для отправки результаты своей работы.
Тут мы используем созданный ранее парсер команд. И тут же мы добавим возможность использовать различные типы обработчиков для наших команд и некоторые из них сделаем многопоточными.
Цикл работы очень простой:
Проверяем очередь. Если что-то есть — запускаем анализатор:
Если ничего нет — ждем.
Анализатор проверяет тип объекта. Если он умеет с ним работать — запускает следующий анализатор. Если не умеет — ругается 🙂
Почему так? Опять таки это закладка на будущее и, надеюсь, я её раскрою в следующих частях этого цикла статей. Такая реализация позволит нам потом формировать свои какие-то задания для бота, делать списки рассылок, дневные задания. Для этого ресивер должен уметь обрабатывать не только объекты типа Update а и что-то наше. Но об этом потом 🙂
Рассмотрим подробнее анализатор для типа Update:
Он определяет ID чата. Получает текст сообщения. С помощью парсера определяет, является ли сообщение командой и определяет каким хендлером данную команду нужно обрабатывать. Запускает обработку команды и если обработка команды вернула какой-то непустой текст — формирует сообщение для отправки пользователю и складывает его в очередь.
И тут у вас должен возникнуть вопрос: «Что еще за хендлер?». Речи про него раньше не шло и в коде он не упоминался. Все верно. Сейчас мы этот функционал и разберем.
Для этого создадим отдельный package, который и будет хранить все наши хендлеры. Назовем его handler
Создадим абстрактный класс AbstractHandler
У него будет базовый конструктор, в котором мы передаем с каким именно объектом Bot ему нужно будет взаимодествовать. И объявлена абстрактная функция operate реализацию которой мы должны будем прописать в наследниках нашего класса.
И сразу же реализуем самый простой хендлер, который не будет делать ничего и использовать мы его будем тогда, когда не сможем понять что за тип команды нам передали и от бота никакой реакции не требуется.
Как мы его применим и где мы получим результаты его работы — разберем чуть позже.
Следующий на очереди — SystemHandler
Он у нас займется обработкой базовых команд, таких как start, help и мы поручим ему еще и выполнение команды id
Основа его выглядит так:
Как реализовано формирование ответа на команду start и help вы можете посмотреть в коде 🙂
Формируем текстовые сообщения и складываем их в очередь на отправку. На этом работа хендлера прекращается. Кто и как отправит эти сообщения — его совершенно не волнует.
И помните чуть выше я упоминал, что в результате работы хендлера он возвращает какие-то текстовые данные. И если эта строка не пустая — мы этот текст должны отправить пользователю. Вот именно этот функционал мы и использовали при отработке команды ID:
Хендлер вернет текст с ID пользователя тому, кто его вызвал и уже там сформируется сообщение на отправку, которое и уйдет потом в очередь.
И в начале статьи я упомянул, что мы реализуем такой вариант обработки сообщения пользователя, которому на работу нужно время. И чтобы он не мешал нашим обработчикам — мы его выделим в отдельный поток и пусть он занимается своим делами, не отвлекая остальных.
В качестве такого «тяжеловесного» потока я придумал команду notify. Принцип её работы такой.
Передав боту команду вида:
/notify 300
Бот должен вам сообщить, что команду понял и через 300 секунд он пришлет вам какое-то уведомление, что 300 секунд прошли. У этой команды может быть даже практическое применение 🙂
Например вы поставили пельмешки на огонь и вам их нужно снять через 5 минут. Бот с этим отлично справится и кинет вам в чат уведомление о том, что время вышло.
Или возьмем задачу более серьезную. Вы идете на важную встречу и вы знаете, что при общении с собеседником вам нужно будет прервать разговор. Для этого обычно просят друзей или позвонить или написать сообщение, что и будет являться мотивом не на долго отвлечься от беседы и сделать какие-то действия. Но зачем мучать друзей, когда у вас есть бот? Задав ему заранее задание и указав время — вы получите нужное уведомление в телеграм. Но это все лирика. Задание и эта команда придуманы лишь для того, чтобы показать вам как выделить в отдельный поток что-то, чья работа может занимать очень большой промежуток времени.
Проверяем, передали ли нам в тексте время задержки. Если нет — ругаемся. Если да — стартуем новый поток, куда мы передаем вводные по нашему заданию. Выполнением этого задания займется отдельный класс Notify.
Функционал предельно простой. Он спит указанное колличество секунд. Но в процессе его сна ваш бот умеет принимать любые другие сообщения, общаться с вами, запускать еще дополнительные уведомления. И все это работает отдельно друг от друга.
И чтобы логично завершить всю эту связку с вызовом хендлеров, вернемся в наш класс MessageReciever и посмотрим как мы понимаем какой хендлер нам нужен и как мы их запускаем.
Нужный хендлер нам возвращает команда
Теперь, если вы захотите добавить еще какие-то команды, нужно будет сделать следующее:
О чем мы поговорим в следующих частях?
Нам нужно понять как формировать разные типы сообщений. Как работать с клавиатурой и кнопками. Как редактировать свои старые сообщения. Как работать с колбеками. Как давать задания боту на выполнение каких-то действий. Как формировать интерактивное сообщение с ботом и многое другое. Все дальнейшие части зависят от вас и вашей активности.
Жду в комментариях ваши отзывы и направления, которые мы рассмотрим в приоритете.
Не стесняйтесь, задавайте вопросы. Если в статье что-то не указано или какой-то момент не ясен — напишите мне об этом. Я обязательно поправлю, отредактирую или уточню спорные моменты.
Программируйте в удовольствие и да прибудет с вами сила и красивый код 🙂
Бот, написанный в этой части статьи, работает. Помучать его можно тут: @test_habr_bot
Так же можно помучать моего планировщика: @EventCheckPlanner_Bot
И Дерзкого киномана: @FilmFanAmateurBot.



































