Бот для действий в Телеграмме

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

Александр Волков
Руководитель отдела разработки программного обеспечения компании «Синимекс»

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

Возможности бота

Через бота можно будет:

  • получить полную информацию о канале;
  • получить демо-доступ на канал. Пользователь в автоматическом режиме получит ссылку на вступление в приватный канал. Через n дней демо-доступа пользователь будет удалён из канала;
  • выдать полный доступ для пользователей. Пользователь сможет отправить данные для получения полного доступа. Данные могут быть проверены как в автоматическом режиме, так и в ручном — самим администратором. По итогам пользователю выдаётся полный доступ.

Дополнительно к этому мы создадим интерфейс на React для управления подписками и сбором аналитики по каналу. Особенность этого решения — простота. Время на его создание — около 4 часов. Все компоненты решения для удобства будут развёрнуты в docker-контейнерах. Схема нашего решения будет выглядеть так:

Создание бота

Начнём с самого простого шага — создания бота в Telegram. Для этого достаточно написать команду /newbot боту по созданию других ботов BotFather и следовать инструкциям:

После успешного создания бота вы получите сообщение:

Также появится токен, который мы будем использовать для подключения к боту из своего приложения.

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

Создание базы данных

Для простоты решения поднимем PostgreSQLв docker-контейнере:

docker network create buns-net docker run -d —network=»buns-net» —name bot-postgres -e POSTGRES_PASSWORD=Pass2020! -p 5432:5432 postgres

Контейнер запущен, БД готова к работе.

Для минимальной аналитики и контроля подписок нам хватит одной таблицы. Заполним её модель и далее в миграции lequibase создадим:

Создание бэкенда

Перейдём на Spring Initializr и сгенерируем каркас бэкенд-приложения. Достаточно выбрать следующие библиотеки:

Развернём сгенерированный проект в среде разработки и добавим туда зависимость для работы с Telegram:

compile «org.telegram:telegrambots-spring-boot-starter:5.0.1»

Также добавим библиотеку для мапинга, которая нам пригодится при мапинге сущностей БД в REST-модели:

compile(«net.rakugakibox.spring.boot:orika-spring-boot-starter:1.9.0»)

Создадим миграцию для таблицы, добавим описание подключения к БД и запустим приложение:

1-add-tables.yaml databaseChangeLog: — changeSet: id: 1-add-tables author: avolkov changes: — createTable: tableName: subscriber columns: — column: name: id type: bigint autoIncrement: true constraints: primaryKey: true nullable: false — column: name: name type: varchar(255) constraints: nullable: true — column: name: login type: varchar(255) constraints: nullable: true — column: name: telegram_id type: varchar(100) constraints: nullable: false — column: name: start_subscribe type: timestamp constraints: nullable: false — column: name: end_subscribe type: timestamp constraints: nullable: false — column: name: type_subscribe type: varchar(50) constraints: nullable: false — column: name: enable type: boolean constraints: nullable: false db.changelog-master.yaml databaseChangeLog: — include: file: db/changelog/1-add-tables.yaml
application.yaml server: servlet: context-path: /api spring: datasource: driver-class-name: org.postgresql.Driver url: jdbc:postgresql://bot-postgres:5432/postgres — при локальной разработке поменять на localhost username: postgres password: Pass2020! jpa: properties: hibernate.dialect: org.hibernate.dialect.PostgreSQLDialect hibernate.globally_quoted_identifiers: true

Еще по теме:  Какмв ВК указать ссылку на Телеграмм

После успешного запуска приложения накатится миграция и создастся таблица:

Таблица создана, приложение успешно запустилось. Теперь можно приступить к описанию Data Access Layer. Для этого опишем сущность, репозиторий и сервис:

Подключение к API Telegram

Чтобы можно было получать данные из бота в наше приложение, достаточно унаследовать от абстрактного класса org.telegram.telegrambots.bots.TelegramLongPollingBot и реализовать три метода:

public String getBotUsername(); // логин бота, который устанавливался при создании бота public String getBotToken(); // токен, полученный при создании от BotFather public void onUpdateReceived(Update update); // метод срабатывает каждый раз, когда боту отправляется сообщение

Добавим в application.yaml данные бота, которые получили от BotFather:

telegram: name: bot_login token: 164024384:AAFHwer2342pVF3zm_wZ45454554JVr_I chanel-id: -1001415979632 — id приватного канала, куда будет даваться доступ

Реализуем поддержку 5 команд:·

  • /info — запрос информации о боте и канале;
  • /start — такая же, как и info. Нужна для первого сообщения с ботом;
  • /demo — получение демо-доступа на канал;
  • /access — запрос на получение информации о полном доступе;
  • /success — запрос на получение полного доступа.

Чтобы всеми этими командами было удобно пользоваться, реализуем их в виде кнопок, используя org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMarkup.

Готово! Теперь бот умеет обрабатывать следующие команды.

Как получить доступ?

Хочу демо-доступ на 3 дня.

После получения демо-доступа информация об этом сохраняется в БД. При повторном запросе на демо-доступ пользователю отобразится ошибка:

Если пользователи могут получать временный доступ, то появляется задача проверки истечения этого доступа. К сожалению, не получится создать планировщик, который будет раз в день отписывать пользователей с истекшим доступом. Поэтому надо реализовать поддержку ещё одной команды для чистки подписчиков.

Чтобы этой командой мог пользоваться только администратор, его Chat ID надо добавить в application.yaml. Далее этот идентификатор будет использоваться при проверке, от кого пришла команда и имеет ли этот пользователь права на выполнение этой команды.

telegram: name: bot_login token: 164024384:AAFHwer2342pVF3zm_wZ45454554JVr_I chanel-id: -1001415979632 — id приватного канала, куда будет выдаваться доступ support: chat-id: 14334538544

Дополнительно к этому требуется реализовать команду выдачи полного доступа. Класс поменяется следующим образом:

Появилась обработка команд от администратора.

Если пользователь отправит сообщение message please, то администратору от бота придет сообщение:

После этого администратор может отправить боту команду на выдачу прав пользователю:

И пользователю от бота придет сообщение:

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

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

В свою очередь, у администратора канала появились следующие возможности:

  • проверить предоставляемые пользователем данные для полного доступа и выдать полный доступ;
  • очистить канал от пользователей с истекшим доступом.

Для удобства развёртывания упакуем наше приложение в Docker и развернём. Добавим в build.gradle:

bootJar
FROM openjdk:8-jdk-alpine COPY build/libs/buns.jar buns.jar EXPOSE 8081 ENTRYPOINT [«java»,»-jar»,»/buns.jar»]

Далее выполним следующие команды для создания образа и запуска его в докере:

Создание фронтенда

После того, как мы создали handler для обработки команд бота, хочется визуально контролировать подписки и смотреть графики по приросту подписок в разрезе месяца. Для этого создадим отдельное приложение на React с использованием Ant Design. Выполним команду:

npx create-react-app my-app

После этого у нас будет сгенерировано приложение с минимальной функциональностью. Однако требуется установить ещё несколько библиотек:

Еще по теме:  Telegram connection not inited на телефоне

После этого основной компонент надо изменить на:

App.js import ‘./App.css’; import < QueryClient, QueryClientProvider >from ‘react-query’ import SubscriberTable from «./SubscriberTable»; import React from «react»; import ‘antd/dist/antd.css’; const queryClient = new QueryClient(); function App() < return > ; > export default App;

И добавить новый компонент:

Дополнительно к этому добавить функции для выполнения запросов:

axiosInstance.js import axios from ‘axios’; const host = process.env.REACT_APP_API_ENDPOINT; export const baseUrl = `http://localhost:8080/api/`; const instance = axios.create(< baseURL: `$`, withCredentials: true, headers: < ‘Cache-Control’: ‘no-store, no-cache, must-revalidate’, Pragma: ‘no-cache’, >, >); instance.defaults.headers.common[‘Accept-Language’] = ‘ru-RU, ru’; instance.interceptors.request.use(config => < return < . config, url: encodeURI(config.url), >; >); export default instance;
subscribersApi.js import * as log from ‘loglevel’; import instance from ‘./axiosInstance’; const SUBSCRIBER_PATH = ‘/subscribers’; const SubscribersApi = < name: ‘SubscribersApi’, async getAll() < return instance .get(`$`, < auth: < username: ‘admin’, password: ‘admin’ >>) .then(response => < log.info(`All Lines`, response); return response.data; >) .catch([]); >, async getStatistic() < return instance .get(`$/stat`) .then(response => < return response.data; >) .catch([]); >, >; export default SubscribersApi;

Это личный проект, аутентификация зашита, можно с ней особо не заморачиваться. Также в бэкенд требуется добавить конфигурацию Spring Security:

В итоге после выполнения команды npm start откроется http://localhost:3000/ с отображением списка подписок и статистикой. Статистику можно выводить в любом разрезе. В текущей реализации показывается, в каком месяце сколько полных подписок было оформлено.

А теперь для удобства упакуем и развернём UI в docker-контейнере. Для этого создадим DockerFile:

Dockerfile FROM nginx:1.19.5 COPY build /usr/share/nginx/html/ COPY nginx.conf /etc/nginx/ RUN chown -R nginx:nginx /var/cache/nginx /etc/nginx/ /var/run/ USER nginx EXPOSE 80 ENTRYPOINT [«nginx», «-g», «daemon off;»]
nginx.conf worker_processes 1; pid /tmp/nginx.pid; events < worker_connections 1024; >http < proxy_temp_path /tmp/proxy_temp; client_body_temp_path /tmp/client_temp; fastcgi_temp_path /tmp/fastcgi_temp; uwsgi_temp_path /tmp/uwsgi_temp; scgi_temp_path /tmp/scgi_temp; include /etc/nginx/mime.types; default_type application/octet-stream; log_format main ‘$remote_addr — $remote_user [$time_local] ‘ ‘$server_name to: $proxy_host [$upstream_addr] «$request» ‘ ‘$status $body_bytes_sent «$http_referer» ‘ ‘»$http_user_agent» «$http_x_forwarded_for»‘; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; >

И выполним команды для сборки и развертывания:

Вывод

Используя Spring Вoot, React и Docker, можно быстро создать небольшую систему для контроля подписок и подписчиков на канале в Telegram. Исходный код двух приложений можно посмотреть здесь и здесь.

Следите за новыми постами по любимым темам

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

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

12 лучших и незаменимых Telegram-ботов для каждого

12 лучших и незаменимых Telegram-ботов для каждого12 лучших и незаменимых Telegram-ботов для каждого

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

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

Здесь достаточно простой функционал: бот поддерживает 12 языков, среди которых: русский, английский, немецкий, французский, турецкий или даже иврит. Команда /setmylang позволяет выбрать язык, с которого переводить, а /tolang — язык, на который необходимо перевести.

Gmail Bot

Официальный почтовый клиент Gmail

Еще по теме:  Бот для ТГ канала с ответами на ключевые слова

Как часто вы пользуетесь почтой? Я только по работе. Честно говоря, особого желания посещать приложение почтового клиента у меня нет, поэтому выбрал официальный бот от Gmail, в котором вся почта переносится в Telegram. Это вполне удобный инструмент, однако для стабильной работы потребуется посетить настройки аккаунта Google.

Искать нужный пункт не нужно — при первом запуске бот предложит перейти по ссылке для

Разработчики мессенджера Телеграмм прикладывают немало усилий, чтобы сделать его особенно полезным. Именно поэтому были разработаны чат-бота, которые являются автоматизированными аккаунтами выполняющие различные задачи. Таким образом, бот – это помогающая «программа», которая будет выполнять Ваши поручения. Команды в Телеграмм для управления ботами помогут Вам в этой задаче.

Как показывает практика, нередко у новых пользователей возникают вопросы с существующими командами. Многие считают, что для использования данных помощников необходимо обладать какими-то сакральными знаниями. На самом деле, Вам требуется всего лишь несколько минут, чтобы разобраться с управлением бота, и после этого он сможет помочь Вам в выполнении ежедневной рутины или давать советы в абсолютно разных сферах жизни.

Если Вы только решаетесь скачать Телеграмм для компьютера, то боты – это огромное преимущество перед альтернативными мессенджерами, так как никто не может похвастаться подобным функционалом.

komandy-v-telegramme-dlya-upravleniya-botami

Правила ведения общения с ботами

Для того, чтобы Ваш персональный помощник смог Вам помочь, потребуется выполнить несколько необходимых шагов:

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

Большинство ботов имеют стандартизированные команды для облегчения взаимодействия с конечным пользователем, однако каждый разработчик имеет возможность добавить уникальные команды. Все они имеют общую структуру следующего вида: /функция>

Первый символ «/» необходим для инициализации команды и является обязательным. Предусмотрено, что общая длина команды не может быть длиннее, чем 32 символа. Как упоминалось ранее, каждый разработчик бота может использовать различные команды. Если Вы желаете получить их полный перечень, то введите символ «/» и ожидайте несколько секунд — список команд появится над полем ввода сообщения.

Для работы с роботом в Телеграмм Вам следует использовать только задокументированные команды. Если Вы введете стороннюю фразу, то программа Вас попросту не поймет. Если Вы только что решили скачать Telegram на iPhone, то, возможно, Вам будет непросто разобраться в данном вопросе, однако вскоре Вам удастся понять принцип работы.

Пример взаимодействия с ботом Sberometer

komandy-v-telegramme-dlya-upravleniya-botami

Так, например, разработчики данного инструмента предусмотрели следующий список команд, которыми пользуются миллионы профессионалов своего дела:

  • /kurs – показывает соотношение российского рубля и доллара/евро;
  • /gold – демонстрирует актуальную биржевую стоимость золота;
  • /oil – актуальная биржевая стоимость нефти;
  • /news [тема] – показывает три новостные ссылки на выбранную тему;

komandy-v-telegramme-dlya-upravleniya-botami

Главные команды при создании ботов в Телеграмм

Таким образом, после инициализации общения с данным ботом Вы можете использовать следующие команды для общения с ним:

  • /newbot – команда для создания нового бота;
  • /setname – изменение имени бота;
  • /setdescription – изменение описания для бота, которое будет доступно каждому пользователю;
  • /setabouttext – изменение краткой информации о текущем аккаунте;
  • /setuserpic – изменить основное изображение бота;
  • /setcommands – ввести перечень поддерживаемых команд при использовании символа «/»;
  • /setjoingroups – возможность «включать» бота в пользователей сторонней группы;
  • /deletebot – удалить существующий бот;

Часто используемые команды

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