Как создать бота обратной связи Telegram

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

Предисловие

Чтобы бот работал, необходимо установить библиотеку PyTelegramBotAPI (с предварительно установленным на ПК Python-ом ) на свой компьютер. Зайдите в командую строку и выполните следующее:

cd . Далее пишем pip install pytelegrambotapi. Начнется установка.

Пишем код

Писать код буду в Sublime Text . Чтобы не заливать постоянно бота на сервер, для теста буду локально запускать его у себя на ПК.

Если вы живете в России , надо установить VPN. Для себя выбрал WindScribe , так как там дают большое количество трафика, которое обновляется каждый месяц. (Для этого надо подтвердить почту).

В папке создадим файл config.py , чтобы не захламлять наш основной файл. В config мы вынесем все значение, например токен бота и ID хозяина . Код:

Бот обратной связи Телеграм | Как сделать бота обратной связи в Телеграм

token = ‘680628223:AAHf-k32Uoas41uLj1i_mznUa1wKzCJviRI’ # Даже не пытайтесь, токен сбросил ;D

owner = 468437664 # Ваш ID

Предлагаю сделать для начала очень простую команду — /ping. Она будет показывать, жив ли бот. Код:

def start(message):

try: #Заворачиваем все в try

bot.send_message(message.chat.id, «PONG!» , parse_mode=»HTML») # Будет отсылать ответ

bot.send_message(config.owner, ‘Что-то пошло не так!’) #Данная система (оборачивание в try и except позволит продолжить выполнение кода, даже если будут ошибки)

Обратная связь

Обратную связь решил сделать с командой /send . Для этого, нам понадобится написать код приема и для ответа на сообщения.

Принимаем сообщения

Потребуется написать немного кода:

def messages(message):

if int(message.chat.id) == config.owner:

bot.forward_message(config.owner, message.chat.id, message.message_id)

bot.send_message(message.chat.id, str(message.from_user.first_name) + ‘,’ +’ я получил сообщение и очень скоро на него отвечу :)’)

bot.send_message(config.owner, ‘Что-то пошло не так! Бот продолжил свою работу.’)

Давайте разберем это. Первый блок кода (до else) смотрит, кто ему пишет: если ID совпадает с ID, который указан в файле config , то сообщение будет присылать этому человеку (owner).

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

Отправка

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

def process_start(message):

if int(message.chat.id) == config.owner:

bot.send_message(message.chat.id, ‘Для отправки сообщения сделай реплей’)

bot.forward_message(config.owner, message.chat.id, message.message_id)

Бот обратной связи Livegrambot в Telegram

bot.register_next_step_handler(message, process_mind)

Еще по теме:  Бот визитка в Телеграм пример

bot.send_message(message.chat.id, ‘Вы не являетесь администратором для выполнения этой команды!’)

def process_mind(message):

if int(message.chat.id) == config.owner:

text = ‘Сообщение было отправлено пользователю ‘ + str(message.reply_to_message.forward_from.first_name)

bot.forward_message(message.reply_to_message.forward_from.id, config.owner, message.message_id)

bot.send_message(config.owner, text)

bot.send_message(message.chat.id, ‘Что-то пошло не так! Бот продолжил свою работу.’ + ‘ Ошибка произошла в блоке кода:nn def process_mind(message)’, parse_mode=’HTML’)

bot.send_message(message.chat.id, ‘Вы не являетесь администратором для выполнения этой команды!’)

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

Если тебе понравилась статья, обязательно подпишись и поставь лайк. Остались вопросы? Смело спрашивай о них в комментариях – обязательно отвечу. 🙂

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

MasterGroosha/telegram-feedback-bot

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Switch branches/tags
Branches Tags
Could not load branches
Nothing to show
Could not load tags

Nothing to show

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Cancel Create

  • Local
  • Codespaces

HTTPS GitHub CLI
Use Git or checkout with SVN using the web URL.
Work fast with our official CLI. Learn more about the CLI.

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

5a0b4df Mar 22, 2023

Git stats

Files

Failed to load latest commit information.

Latest commit message
Commit time

README.md

Когда-то давно в Telegram все пересланные сообщения содержали информацию об авторе, в частности, ID. Благодаря этому можно было легко делать ботов для обратной связи, когда юзер пишет боту, а автор бота через него отвечает. К сожалению, в марте 2019 года всё изменилось и пересланные сообщения от некоторых людей потеряли информацию об отправителях.

Для решения этой проблемы разработчики ботов стали сохранять ID авторов сообщений на стороне бота, а затем провязывать эти айдишники, но я лично считаю такой подход избыточным, т.к. такие данные, по сути, должны храниться вечно (мало ли, на какое сообщение вы решите ответить). В результате появился этот бот. Из плюсов: элементарно контейнеризируется, поскольку хранит всё в оперативной памяти (например, списки блокировок). Из минусов: поддерживает только те сообщения от пользователей, где можно добавлять подпись или редактировать текст, не поддерживает возможность сделать «ответ» (reply) на сообщение (в теории, решаемо) и не позволяет корректно реагировать на редактирование сообщений. Лично меня устраивает такой расклад.

Еще по теме:  Как посмотреть архив Телеграмм с телефона

Сообщения от пользователей копируются методом copyMessage в чат к админу (или админам) с добавлением ID пользователя в виде хэштега, например, #id1234567, к тексту или подписи к медиафайлу. Когда администратор отвечает на сообщение, этот хэштег извлекается, парсится и используется в качестве получателя.

Как переписку видит пользователь:

Как переписку видит пользователь

В свою очередь, администратор видит так (и может пользоваться расширенным набором команд):

Как переписку видит администратор

  1. Python 3.9 и выше (не нужно при запуске с Docker);
  2. Linux (должно работать на Windows, но могут быть сложности с установкой);
  3. Systemd (для запуска через systemd);
  4. Docker (для запуска с Docker). Старые версии Docker требуют отдельно docker-compose.

Просто потестировать (не рекомендуется)

  1. Клонируйте репозиторий;
  2. Перейдите ( cd ) в склонированный каталог и создайте виртуальное окружение Python (Virtual environment, venv);
  3. Активируйте venv и установите все зависимости из requirements.txt ;
  4. Скопируйте env_example под именем .env (с точкой в начале), откройте его и заполните переменные;
  5. Внутри активированного venv: python -m bot .
  1. Выполните шаги 1-4 из раздела «просто потестировать» выше;
  2. Скопируйте feedback-bot.example.service в feedback-bot.service , откройте и отредактируйте переменные WorkingDirectory и ExecStart ;
  3. Скопируйте (или создайте симлинк) файла службы в каталог /etc/systemd/system/ ;
  4. Активируйте сервис и запустите его: sudo systemctl enable feedback-bot —now ;
  5. Проверьте, что сервис запустился: systemctcl status feedback-bot (можно без root-прав).

Docker + Docker Compose

  1. Возьмите файл docker-compose.example.yml из репозитория и переименуйте как docker-compose.yml ;
  2. Возьмите файл env_example там же, переименуйте как .env (с точкой в начале), откройте и заполните переменные;
  3. Запустите бота: docker compose up -d (или docker-compose up -d на старых версиях Docker);
  4. Проверьте, что контейнер поднялся: docker compose ps

Если вы хотите изменить тексты в боте, ознакомьтесь с информацией в Wiki. В настоящий момент поддерживается только изменение текстов сообщений, но не описаний в меню команд

Папку bot/locales в случае с развертыванием бота в Docker можно переопределить, подсунув её снаружи как volume.

Источник: github.com

Форма обратной связи в React Native при помощи AWS + Telegram

image

Перед тем как я начал интеграцию формы обратной связи в одном из моих последний проектов, я пытался найти нестандартный подход для решения задачи. Электронная почта нуждается в некого рода сервера SMTP, да и это просто скучно, особенно для старт-апа при низком потоке сообщений.

Мессенджеры, это отличная альтернатива, и это путь, который я выбрал. Telegram предоставляет один самых простых способов создания ботов (если не самый простой). На его месте может быть что угодно — другие мессенджеры, телефонные звонки (Amazon Connect) или Яндекс Диалоги.

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

Еще по теме:  Чат недоступен в Телеграмме

Шаг 1-й: бот в Telegram, проще быть не может

В итоге, мы имеем токен, который мы будем использовать для «разговора» с нашим ботом, а chat_id будет использован для отправки сообщения лично вам. Теперь можете отправить нашему боту команду /start и можем идти дальше.

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

Шаг 2-й: Lambda как посредник

Один из вариантов настройки Telegram, это внедрить весь код запроса и «разговора» с API Telegram в сам код приложения React Native — хороший вариант для теста. В моем случае уже был настроен API с несколькими активными функциями Lambda, поэтому мой вариант включает Lambda как слой-посредник между приложением и API Telegram. Код и инструкции ниже могут быть использованы в самом проекте React Native.

Я использовал фреймворк Serverless для создания новой функции с параметрами ниже (формат yaml ).

sendTelegramMessage: description: used for contact form ($) handler: lib/additional/sendMessageTelegram.handler environment: $ events: — http: path: contact method: POST private: false package: include: — lib/additional/sendMessageTelegram.js

Помним, что токен и chat_id должны быть строго скрыты. В данном случае я использую файл переменных среды, который будет использован в Lambda. Как можно заметить из строк выше, Serverless настроит API Gateway для запросов POST. Также заметьте, что в данном случае API открыт для всех без каких-либо ограничений.

А вот часть кода Lambda, которая примет наш запрос. Наш фронт-энд всего-лишь соберет информацию — электронную почту и сообщение, и отравит запрос в нашу функцию, которая обработает запрос в API Telegram.

exports.handler = async (event) => < if (!event.body) < return createResponse(400, «запрос пуст»); >const data = JSON.parse(event.body); if (!data.email || !data.message) < return createResponse(400, «поля ’email’ и ‘message’ обязательны»); >try < const telegram = getTelegramConfig(); await fetch(`$/bot$/sendMessage?$`) return createResponse(200, «сообщение отправлено»); > catch (e) < return createResponse(500, e.message); >>;

Две функции-помощники, getTelegramConfig для создания URL запроса и createResponse для генерации стандартного ответа с кодом статуса и сообщением.

qp.encode используется для конвертации объекта в строку вроде ?param1=value keyboardType=»email-address» autoCapitalize=»none» autoCompleteType=»email» style= onChangeText= selectionColor=»#555″ placeholder=»Ваша почта» placeholderTextColor=»#CCC» clearButtonMode=»always» returnKeyType=»done» disableFullscreenUI /> style=> onChangeText= selectionColor=»#555″ placeholder=»Ваше сообщение. » placeholderTextColor=»#CCC» clearButtonMode=»always» returnKeyType=»done» multiline textAlignVertical=»top» disableFullscreenUI /> disabled= onPress= />

Кнопка «Отправить» будет неактивна пока пользователь не введет правильный адрес электронной почты и, как минимум, 10-знаковое сообщение. Помним, что в данном примере API открыт.

image

Чего не хватает

  • Я не затрагивал часть API, это отдельная тема, об этом можно найти много других статей. Также рекомендую ознакомиться с фреймворком Serverless.
  • В этом примере мы получаем сообщение в Telegram, но отвечать придется на электронную почту. Здесь много разных вариантов и это только пример.

Источник: habr.com

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