Лайфхаки

Маленькие, полезные хитрости

Простой Telegram-бот на python за 30 минут. Ша. Пишем основу бота

01.07.2023 в 23:24

Простой Telegram-бот на python за 30 минут. Ша. Пишем основу бота


Создаём папку Bot, в которой потом создаём файл bot.py. Здесь будет код нашего бота.Открываем консоль и переходим в директорию с файлом, устанавливаем python-telegram-bot .

pip install python-telegram-bot --upgrade

После установки мы уже можем написать «основу», которая пока что будет просто отвечать однотипными сообщениями. Импортируем необходимые модули и прописываем наш токен API:

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

# Настройки from telegram.ext import Updater, CommandHandler, MessageHandler, Filters updater = Updater(token='ВАШ API КЛЮЧ') # Токен API к Telegram dispatcher = updater.dispatcher

Далее напишем 2 обработчика команд. Это callback-функции, которые будут вызываться тогда, когда будет получено обновление. Напишем две таких функции для команды /start и для обычного любого текстового сообщения. В качестве аргументов туда передаются два параметра: bot и update . Bot содержит необходимые методы для взаимодействия с API, а update содержит данные о пришедшем сообщении.

Телеграм бот для приема заказов python. Зачем нужна оплата?


В жизни каждого разработчика телеграм ботов наступает момент, когда необходимо реализовать оплату в вашем боте. И тут у вас есть два пути. Первый — зарегистрировать ИНН, ИП/Юридическое лицо и подключить официальную оплату от телеграма или просто использовать сторонний сервис по типу Free-Kassa, QIWI и т.д. Думаю выбор очевиден, в этой статье я буду использовать QIWI, потому что так хочу.Для начала давайте подумаем как бот будет проверять что пришло, от кого и какая сумма. Капитан очевидность подсказывает мне, что необходимо будет получить всю историю переводов на аккаунт, который мы будем использовать в качестве нашего счета для приема платежей. Давайте это сделаем:

import requests import json QIWI_TOKEN = '' QIWI_ACCOUNT = '' s = requests.Session() s.headers = 'Bearer ' + QIWI_TOKEN parameters = {'rows': '50'} h = s.get('https://edge.qiwi.com/payment-history/v1/persons/'+ QIWI_ACCOUNT +'/payments', params = parameters) req = json.loads(h.text)

В константуQIWI_TOKENмы записываем api ключ для работы с QIWI, получить его можно. А вQIWI_ACCOUNTмы записываем номер телефона вашего главного счета. Если вы все сделали правильно, ошибок не будет. Данные находятся в словареreq, включающем в себя списки с данными. А точнее (не читать) переменную req включающую словарь data, в котором находится список из нумерованных словарей включающих в себя списки.Тут мы должны получить номер телефона, комментарий(позже поймете зачем) и сумму транзакции. Для того, чтобы продолжить писать код, вы должны будете уметь использовать базы данных, если вы не ничего не умеете или даже не знаете, что это такое —, в которой достаточно понятно описана работа с. Теперь давайте продумаем алгоритм, который будет использован в нашем боте.
  1. Генерируем рандомное число от 100000 до 999999.
  2. Временно заносим данные в таблицу (id пользователя, номер телефона, сумма, сгенерированное ранее рандомное число)
  3. req.
  4. Добавляем свой функционал после оплаты…
Сейчас вы наверное задумались, а зачем нужно проверять этот комментарий и генерировать рандомное число? А все гениальное — просто. Дело в том, что если мы просто проверим сумму и телефон, то бот сможет найти ранее отправленную транзакцию и засчитать её. Проще говоря, это сделано для безопасности и минимизации багов. Продолжим писать код:Создаем таблицу:

import sqlite3 c.execute("CREATE TABLE IF NOT EXISTS payment_query(user_id INTEGER, phone TEXT, sum INTEGER, code INTEGER)")

Заносим данные в таблицу, как только пользователь захочет что-то оплатить в вашем боте.

from random import randint # создаем иссуственные данные, которые хотим проверить phone = '+79999999999' sum = 100 random_code = randint(100000, 999999) c.execute(f"INSERT INTO payment_query VALUES({message.from_user.id}, {phone}, {sum}, {random_code})") conn.commit()

Далее необходимо сделать какую-то проверку оплаты, в моем случае — это будет инлайн клавиатура: Вот пример из моего недавнего бота Как только пользователь нажмет на кнопку оплаты, бот получит историю переводов с QIWI. Теперь нам нужно сделать самое главное — проверку оплаты.

Python-telegram-bot примеры. Самый простой бот


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

# -*- coding: utf-8 -*- from telegram.ext import Updater # пакет называется python-telegram-bot, но Python- from telegram.ext import CommandHandler # модуль почему-то просто telegram ¯\_(ツ)_/¯ def start(bot, update): # подробнее об объекте update: https://core.telegram.org/bots/api#update bot.sendMessage(chat_id=update.message.chat_id, text="Здравствуйте.") updater = Updater(token='TOKEN') # тут токен, который выдал вам Ботский Отец! start_handler = CommandHandler('start', start) # этот обработчик реагирует # только на команду /start updater.dispatcher.add_handler(start_handler) # регистрируем в госреестре обработчиков updater.start_polling() # поехали!

создаёт бота, который сухо отвечает «Здравствуйте.» при нажатии на кнопку Start (или ручном вводе команды/start) и многозначительно молчит при любых последующих действиях с вашей стороны.Соответственно, если мы захотим повесить обработчики любых текстовых сообщений или любых команд, нам нужно будет написать

from telegram.ext import Filters, MessageHandler def handle_text(bot, update): # … def handle_command(bot, update): # … # MessageHandler -- более универсальный обработчик, который берёт на вход фильтр text_handler = MessageHandler(Filters.text, self.handle_text) command_handler = MessageHandler(Filters.command, self.handle_command) # регистрируем свеженькие обработчики в диспетчере updater.dispatcher.add_handler(text_handler) # без регистрации будет работать, updater.dispatcher.add_handler(command_handler) # но не больше трёх месяцев (шутка)

(За дальнейшими подробностями с чистой совестью отсылаю к.)Нагруженные этим теоретическим минимумом, мы можем наконец подумать, как нам писать своего нетривиального бота. Для начала давайте вернёмся к постановке задачи. Под диалоговым ботом я подразумеваю бота, который главным образом ведёт обычный текстовый диалог с пользователем — с вопросами, ответами, нелинейным сюжетом, разочаровывающими концовками и всем в таком духе (играли в «»?) Напротив, не попадают в сферу наших текущих интересов боты, разным образом расширяющие функционал Telegram (вроде); соответственно, мы опустим добавление всяких плюшек вроде,,и всего такого прочего.Проблема сложных диалоговых ботов в том, что нетривиальный диалог требует хранения состояния. Работа асинхронных диалогов требует постоянных прерываний на ожидание сообщения от пользователя; состояние нужно сохранять, потом восстанавливать, прыгать к коду, ответственному за обработку очередного сообщения, и так далее; в общем, организация кода становится проблемой довольно угнетающей. Прервать, продолжить… ничего не напоминает? Что ж, посмотрим, как обозначенную проблему можно изящнейше обойти с помощью магииyield.

Запуск телеграм-бота на сервере python. Запуск бота


На сервере создаем файл bot.py:nano bot.pyИ вставляем в него код:

from subprocess import check_output import telebot import time bot = telebot.TeleBot("XXXXXXXXX:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")#токен бота user_id = 0 #id вашего аккаунта @bot.message_handler(content_types=) def main(message): if (user_id == message.chat.id): #проверяем, что пишет именно владелец comand = message.text #текст сообщения try: #если команда невыполняемая - check_output выдаст exception bot.send_message(message.chat.id, check_output(comand, shell = True)) except: bot.send_message(message.chat.id, "Invalid input") #если команда некорректна if __name__ == '__main__': while True: try:#добавляем try для бесперебойной работы bot.polling(none_stop=True)#запуск бота except: time.sleep(10)#в случае падения

Заменяем в нём токен бота на тот, который выдал, и user_id — на значение id вашего аккаунта. Проверка id юзера нужна для того, чтобы бот предоставлял доступ к вашему серверу только вам. Функцияcheck_output()выполняет переданную команду и возвращает результат.Осталось только запустить бота. Для запуска процессов на сервере я предпочитаю использоватьscreen(sudo apt-get install screen):

screen -dmS ServerBot python3 bot.py

(где «ServerBot» — идентификатор процесса)Процесс автоматически запустится в фоном режиме. Перейдем в диалог с ботом и проверим, что всё работает, как надо:Сongratulations! Бот выполняет присылаемые ему команды. Теперь, чтобы получить доступ к серверу, вам достаточно открыть диалог с ботом.

Готовый чат-бот на python. Поиск ближайших соседей


В предыдущих разделах мы закачали в python корпус диалогов, векторизовали его, и сократили размерность, а теперь хотим наконец научиться искать в нашем 300-мерном пространстве ближайших соседей и наконец-то осмысленно отвечать на вопросы.Поскольку научились отображать вопросы в Евклидово пространство не очень высокой размерности, поиск соседей в нём можно осуществлять довольно быстро. Мы воспользуемся уже готовым алгоритмом поиска соседей. Но мы напишем свою модель-обёртку, которая выбирала бы одного из k ближайших соседей, причём чем ближе сосед, тем выше вероятность его выбора. Ибо брать всегда одного самого близкого соседа — скучно, но не завязываться на сходство совсем — опасно.Поэтому мы хотим превратить найденные расстояния от запроса до текстов-эталонов в вероятности выбора этих текстов. Для этого можно использовать функцию softmax, которая ещё часто стоит на выходе из нейросетей. Она превращает свои аргументы в набор неотрицательных чисел, сумма которых равна 1 — как раз то, что нам нужно. Дальше полученные «вероятности» мы можем использовать для случайного выбора ответа.Фразы, которые будет вводить пользователь, надо пропускать через все три алгоритма — векторизатор, метод главных компонент, и алгоритм выбора ответа. Чтобы писать меньше кода, можно связать их в единую цепочку (pipeline), применяющую алгоритмы последовательно.В результате мы получили алгоритм, который по вопросу пользователя способен найти похожий на него вопрос и выдать ответ на него. И иногда это ответы даже звучат почти осмысленно.

Как написать бота для телеграм python. Почему webhook

Чат‑бот в Telegram может работать в одном из двух режимов.

Один из них называется polling  — это когда код, непосредственно реализующий механику бота, опрашивает сервера Telegram с определенной периодичностью («не появилось ли чего новенького»). А если обнаружена активность в чате — реализуется определенная механика взаимодействия (общения).

Большинство материалов в интернете посвящено описанию того, как создавать ботов именно на этой механике, но мне (частное мнение без претензии на истину в последней инстанции) такой подход не очень нравится. Вот почему:

    не вижу смысла постоянно «дергать» сервера Telegram почем зря;

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

Второй режим работы ботов, webhook , подразумевает, что Telegram сам вызывает обработчик события/сообщения, когда в боте происходит какая‑то активность. Другими словами, код, реализующий механику бота, срабатывает по инициативе человека, который «общается» с ботом. Самый главный плюс от такого режима работы — ответ бота на действие человека происходит мгновенно: человек написал что‑то боту, Telegram тут же вызвал webhook, написанный код сразу «ответил» человеку.

Лирическое отступление: на тему «что лучше — polling или webhook» спорить можно бесконечно долго. Критерий истины: все зависит от решаемой задачи и от user‑story.

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

Как написать бота для Telegram на Python

Чат-бот в Telegram может работать в одном из двух режимов.

Механика polling

Один из них называется polling — это когда код, непосредственно реализующий механику бота, опрашивает сервера Telegram с определенной периодичностью («не появилось ли что новенького»). А если обнаружена активность в чате — реализуется определенная механика взаимодействия (общения).

Большинство материалов в интернете посвящено описанию того, как создавать ботов именно на этой механике, но мне (частное мнение без претензий на истину в последней инстанции) такой подход не очень нравится. Вот почему:

  • не вижу смысла постоянно «дергать» сервера Telegram потому что зря;
  • таймаут, установленный для опроса всех чатов, в которых «общается» бот — это суть задержка в коммуникациях с человеком, который «общается» с ботом.

Механика webhook

Второй режим работы ботов, webhook, подразумевает, что Telegram сам вызывает обработчик события/сообщения, когда в боте происходит какая-либо активность. Другими словами, код, реализующий механику бота, срабатывает по инициативе человека, который «общается» с ботом.

Самый главный плюс от такого режима работы — ответ бота на действие человека происходит мгновенно: человек написал что-то боту, Telegram тут же вызвал webhook, написанный код сразу «ответил» человеку.

Выбор между polling и webhook

Лирическое отступление: на тему «что лучше — polling или webhook» спорить можно бесконечно долго. Критерий истины: все зависит от решаемой задачи и от user-story.

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

Как создать бота в телеграмм с телефона. Botman — бесплатный сервис

Теперь не обязательно знать языки программирования и обладать специальными навыками. С Botman.pro вы сделаете своего первого чат-бота за 5 минут и совершенно бесплатно. При этом для тех, кто не хочет разбираться сам, в сервисе есть очень хорошо продуманная поддержка. Можно посмотреть обучающие

Перед созданием бота вам потребуется Токен. Вот как его получить .

1) Находим в Телеграм аккаунт @BotFather . Делайте процедуру через свой аккаунт, так как владельцем будет тот, кто зарегистрирует токен.

2) Жмём команду /newbot или прописываем её в чате.

3) Выбираем имя для вашего бота. Я делаю такое: sozdanie_bota_TG .

4) Следующим шагом необходимо придумать ник. Он должен заканчиваться на bot, поэтому я пишу такой: sozdanie_bota_TG_bot .

5) Готово, вы получили Токен. Сохраните его, он нам потребуется для создания чат-бота.

Следуйте инструкции по созданию Бота .

Переходим на официальный сайт Botman.pro и проходим простейшую регистрацию.

Жмём в боковом меню — Чат-Боты — Создать бота.

Добавляем новый канал (маленькая кнопочка под полем для выбора канала).

В предыдущей инструкции мы получали токен, теперь его нужно вставить в поле и выбрать тип канала Telegram.

Далее снова жмём создать бота и видим, что у нас подтянулся канал. Внизу вводим название бота в сервисе Botman, у меня это «Обучение созданию чат ботов».

Теперь чат-бот добавлен в сервис и с ним можно начать работать. Жмите на него.

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