Директор шоп Телеграмм бот не работает

В этой серии статей мы напишем телеграм бота на python. Он работает с внешним API, запрашивает результаты футбольных матчей и выводить их в сообщении.

Когда локальная версия будет готова, разместим бота на сервере. Вместо Heroku, я выбрал отдельную виртуальную машину, что бы бот не засыпал. Это ближе к реальности.

Вся разработка разбита на этапы:

  1. Локальная установка библиотек и Redis.
  2. Регистрация и получение токена.
  3. Настройка , подключение к базам данных.
  4. Написание основной функциональности бота.
  5. Регистрации, выбор и настройка внешнего апи футбольных матчей.
  6. Добавление сбора результатов матчей и интеграция в бота.
  7. Деплой, публикация на сервере:
  1. Регистрация дешевого или бесплатного VPS.
  2. Запуск Редис-клиента.
  3. Запуск и настройка бота на сервере.

Вводные данные

Материал рассчитан на уровень Начинающий+, нужно понимать как работают классы и функции, знать основы базы данных и async/await. Если знаний мало, крайне желательно писать код в Pycharm, бесплатная версия подходит.

Telegram Shop Bot для МойСклад. Магазин в Телеграм

Используйте указанные версии библиотек, что бы проект работал без изменений. При установке иных версий вы можете получать ошибки, связанные с совместимостью.

Версия Python — 3.8+ aiogram==2.11.2 emoji==1.1.0 redis==3.5.3 ujson==4.0.1 uvloop==0.14.0 # не работает и не требуется на Windows

Локальная установка библиотек для бота и Redis

Для начала нужно создать проект «fonlinebot» с виртуальным окружение. В Pycharm это делается так:

pycharm new project

Затем установить библиотеки в виртуальном окружении. Сразу понадобятся 4: для бота, работы с redis, ускорения и emoji в сообщениях.

pip install aiogram==2.11.2 redis==3.5.3 ujson==4.0.1 emoji==1.1.0

Установка Redis локально

Redis — это резидентная база данных (такая, которая хранит записи прямо в оперативной памяти) в виде пар ключ-значение. Чтение и запись в память происходит намного быстрее, чем в случае с дисками, поэтому такой подход отлично подходит для хранения второстепенных данных.

Из недавней статьи — Redis для приложений на Python

Для установки Redis на Linux/Mac следуйте этим инструкциям: https://redis.io/download#from-source-code. Для запуска достаточно ввести src/redis-server .

Что бы установить на Windows скачайте и распакуйте архив отсюда. Для запуска откройте «redis-server.exe».

Теперь нужно убедиться, что все работает. Создайте файл «main.py» в корне проекта и выполните этот код:

# fonlinebot/main.py import redis r = redis.StrictRedis() print(r.ping())

Вывод будет True , в другом случае ошибка.

Регистрация бота и получение токена

Для регистрации напишем https://t.me/botfather команду /newbot . Далее он просит ввести имя и адрес бота. Если данные корректны, выдает токен. Учтите, что адрес должен быть уникальным, нельзя использовать «fonlinebot» снова.

Футбольный телеграм бот на Python (1/4): Подготовка и настройка бота

На время разработки сохраним токен в файл. Создайте «config.py» в папке проекта для хранения настроек и запишите токен TOKEN = «ВАШ ТОКЕН»

Настройка бота

Теперь нужно связать бота с redis и базой данных, проверить работоспособность.

Создадим необходимые модули и файлы. В папке «fonlinebot» к созданным ранее «main.py» и «config.py» добавим: «database.py», «requirements.txt» и папку «app». В папку «app» добавьте: «bot.py», «dialogs.py», «service.py». Вот такая структура получится:

Футбольный телеграм бот на Python (1/4): Подготовка и настройка бота

Разделив бот на модули, его удобнее поддерживать и дорабатывать.

  • «main.py» — для запуска бота.
  • «config.py» — хранит настройки, ключи доступов и другую статическую информацию.
  • «database.py» — для работы с базой данных и кешем(redis).
  • «requirements.txt» — хранит зависимости проекта, для запуска на сервере.
  • «app» — папка самого бота.
  • «bot.py» — для взаимодействия бота с юзерами, ответы на сообщения.
  • «dialogs.py» — все текстовые ответы бота.
  • «service.py» — бизнес логика, получение и обработка данных о матчах.
Еще по теме:  Mute Telegram что это

Пришло время перейти к программированию. Запишем в «requirements.txt» наши зависимости:

aiogram==2.11.2 emoji==1.1.0 redis==3.5.3 ujson==4.0.1 uvloop==0.14.0

Так как большая часть программирует на Windows, uvloop мы не устанавливали локально. Установим его на сервере.

В «config.py» к токену добавим данные бота и подключения к redis.

# fonlinebot/config.py import ujson import logging logging.basicConfig(level=logging.INFO) TOKEN = «здесь должен быть токен» BOT_VERSION = 0.1 # База данных хранит выбранные юзером лиги BOT_DB_NAME = «users_leagues» # Тестовые данные поддерживаемых лиг BOT_LEAGUES = < «1»: «Бундеслига», «2»: «Серия А», «3»: «Ла Лига», «4»: «Турецкая Суперлига», «5»: «Чемпионат Нидерландов», «6»: «Про-лига Бельгии», «7»: «Английская Премьер-лига», «8»: «Лига 1», ># Флаги для сообщений, emoji-код BOT_LEAGUE_FLAGS = < «1»: «:Germany:», «2»: «:Italy:», «3»: «:Spain:», «4»: «:Turkey:», «5»: «:Netherlands:», «6»: «:Belgium:», «7»: «:England:», «8»: «:France:», ># Данные redis-клиента REDIS_HOST = ‘localhost’ REDIS_PORT = 6379 # По умолчанию пароля нет. Он будет на сервере REDIS_PASSWORD = None

Информацию о лигах в будущем можно будет вынести в отдельный json файл. Эта версия бота будет поддерживать не более 10 вариантов, я явно их записал.

Добавление базы данных

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

Юзер будет выбирать 3 чемпионата для отслеживания, бот сохранит их в БД и использует для запроса результатов.

Кеш(redis) будет сохранять результаты матчей, что бы уменьшить количество запросов к API и ускорить время ответов. Как правило, бесплатные API лимитирует запросы.

# fonlinebot/database.py import os import logging import sqlite3 import redis import ujson import config # класс наследуется от redis.StrictRedis class Cache(redis.StrictRedis): def __init__(self, host, port, password, charset=»utf-8″, decode_responses=True): super(Cache, self).__init__(host, port, password=password, charset=charset, decode_responses=decode_responses) logging.info(«Redis start») def jset(self, name, value, ex=0): «»»функция конвертирует python-объект в Json и сохранит»»» r = self.get(name) if r is None: return r return ujson.loads(r) def jget(self, name): «»»функция возвращает Json и конвертирует в python-объект»»» return ujson.loads(self.get(name))

Класс Cache наследуется от StrictRedis . Мы добавляем 2 метода jset , jget для сохранения списков и словарей python в хранилище redis. Изначально он не работает с ними.

Теперь добавим класс, который будет создавать базы данных и выполнять функции CRUD.

# fonlinebot/database.py #. class Database: «»» Класс работы с базой данных «»» def __init__(self, name): self.name = name self._conn = self.connection() logging.info(«Database connection established») def create_db(self): connection = sqlite3.connect(f».db») logging.info(«Database created») cursor = connection.cursor() cursor.execute(»’CREATE TABLE users (id INTEGER PRIMARY KEY, leagues VARCHAR NOT NULL);»’) connection.commit() cursor.close() def connection(self): db_path = os.path.join(os.getcwd(), f».db») if not os.path.exists(db_path): self.create_db() return sqlite3.connect(f».db») def _execute_query(self, query, select=False): cursor = self._conn.cursor() cursor.execute(query) if select: records = cursor.fetchone() cursor.close() return records else: self._conn.commit() cursor.close() async def insert_users(self, user_id: int, leagues: str): insert_query = f»»»INSERT INTO users (id, leagues) VALUES (, «»)»»» self._execute_query(insert_query) logging.info(f»Leagues for user added») async def select_users(self, user_id: int): select_query = f»»»SELECT leagues from leagues where record = self._execute_query(select_query, select=True) return record async def update_users(self, user_id: int, leagues: str): update_query = f»»»Update leagues set leagues = «» where self._execute_query(update_query) logging.info(f»Leagues for user updated») async def delete_users(self, user_id: int): delete_query = f»»»DELETE FROM users WHERE self._execute_query(delete_query) logging.info(f»User deleted»)

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

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

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

Простые боты для Telegram на Python в Google Colab

Рассмотрим разработку и запуск ботов для мессенджера Телеграм. В качестве языка разработки будет использоваться Python. Запускать код на выполнение будем в рабочих тетрадках (блокнотах) замечательной среды разработки Colab компании Google. Код бота, размещенный в Colab, будет взаимодействовать c сервером Telegram через API.

Еще по теме:  Трансляция в Телеграмме что это такое

Telegram (от др.-греч. τῆλε «далеко» + др.-греч. γράμμα «запись») — кроссплатформенная система мгновенного обмена сообщениями (мессенджер) с функциями VoIP, позволяющая обмениваться текстовыми, голосовыми и видео- сообщениями, стикерами и фотографиями, файлами многих форматов. Также можно совершать видео- и аудио- звонки и трансляции в каналах и группах, организовывать конференции, многопользовательские группы и каналы. Клиентские приложения Telegram доступны для Android, iOS, Windows Phone, Windows, macOS и Linux.

API (МФА [ˌeɪ.piˈaɪ]; аббр. от англ. Application Programming Interface — «программный интерфейс приложения») — описание способов (набор классов, процедур, функций, структур или констант), которыми одна компьютерная программа может взаимодействовать с другой программой. Обычно входит в описание какого-либо интернет-протокола, программного каркаса (фреймворка) или стандарта вызовов функций операционной системы. Часто реализуется отдельной программной библиотекой или сервисом операционной системы. Используется программистами при написании всевозможных приложений.

Бот (англ. bot, сокращение от чеш. robot) — виртуальный робот, который функционирует на основе специальной программы, выполняющий автоматически и/или по заданному расписанию какие-либо действия через интерфейсы, предназначенные для людей. Боты находят также применение в условиях, когда требуется лучшая реакция по сравнению с возможностями человека (например, игровые боты, боты для интернет-аукционов и тому подобное) или, реже, для имитации действий человека (например, боты для чатов и тому подобное). Чат-бот может выдать достаточно адекватный ответ на вопрос, сформулированный на правильном русском языке (или любом другом, работа с которым поддерживается). Такие боты часто применяются для сообщения прогноза погоды, результатов спортивных соревнований, курсов валют, биржевых котировок и тому подобное.

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

C точки зрения прикладной информатики (и прикладной информатики в экономике в частности), создание чат-бота — это не только следование последним тенденциям. Прежде всего, речь идёт о сокращении затрат, увеличении конверсии и улучшении качества обслуживания клиентов. Сотни компаний делают всё возможное, чтобы достичь вышеупомянутых целей. И для их достижения необходимы боты как первостепенный инструмент.

Согласно текущей статистике за 2022 год, недвижимость является ведущей отраслью по прибылям от чат-ботов (28 %). Затем идут путешествия (16 %), образование (14 %), здравоохранение (10 %) и финансы (5 %).

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

Чат-боты можно использовать для поиска информации. Например, прогноз погоды, афиша мероприятий.

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

Практическая часть

Чтобы создать бота, нам нужно дать ему название, адрес и получить токен — цифро-символьную строку, которая будет однозначно идентифицировать бота.

Необходимо найти бота, нажать кнопку «Запустить» (или написать /start), в ответ BotFather пришлет список доступных команд.

Отправим боту команду /newbot, чтобы создать нового бота. В ответ он попросит ввести имя будущего бота, его можно писать на русском. После ввода имени нужно будет изобрести адрес бота, причем он должен заканчиваться на слово bot. Например, drach_pro_bot. Если адрес уже кем‑то занят, придётся придумывать новый.

Еще по теме:  В Телеграмме грузится соединение

Когда бот будет создан, мы получим сообщение, в котором будет исчерпывающая техническая информация о боте. Обратите внимание, что после фразы Use this token to access the HTTP API будет написана строка из букв и цифр — это токен.

Реализуем бота для Telegram, воспользовавшись возможностями языка Python. Понятно, что чтобы бот всегда работал, его код должен быть запущен и выполняться 24 часа в сутки. Значит, потребуется сервер (для надежности под операционной системой Linux), на котором установлен Python. Если такого сервера нет, можно запускать код на собственной домашней машине, но тогда придётся повозиться с настройками роутера. Но есть ещё один интересный вариант, который очень подходит для тестирования и изучения ботов — это Colab.

Работать будем в рабочей тетради Colab, так как это нам даёт замечательные преимущества: не надо устанавливать собственный сервер в Интернет и не надо перенастраивать домашний роутер.

Далее в рабочей тетради Colab проверяем версию Python. Чтобы операция выполнялась на уровне операционной системы (а не языка программирования), перед командой ставим восклицательный знак:

!python3 —version

Должны получить ответ вида:

Python 3.7.13

Для взаимодействия с Telegram API средствами языка Python разработаны несколько модулей. Самый простой из них — Telebot. Устанавливаем необходимый пакет:

!pip3 install pytelegrambotapi

В редчайших случаях, возможно, понадобится написать просто pip вместо pip3.

Задача 1. ЭХО

Сначала реализуем простейшего бота – для понимания процесса. Он будет получать от пользователя текстовое сообщение и возвращать его же. Используем код:

Для запуска бота в Colab нажимаем Ctrl+F9.

Если всё запустилось без ошибок, переходим в Telegram – проверять работу бота. Ищем бота по придуманному ранее адресу. Запускаем бота кнопкой «Запустить» (Start) или командой /start. При правильной работе бот возвращает сообщения отправителю один-в-один.

Задача 2. Бот-всезнайка

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

!pip3 install wikipedia

Используем следующий код и запустим его.

Задача 3. БОТ С ДВУМЯ ВИРТУАЛЬНЫМИ КНОПКАМИ

Во многих ботах для выбора каких‑то действий применяются так называемые виртуальные кнопки. Реализуем ветвление. Пользователь будет выбирать, что он хочет прочитать (например, афоризмы или новости).

Потребуется создать два файла: thinks.txt и facts.txt, которые содержат список сегодняшних новостей и афоризмы. Одна строка – одно утверждение. Лучше создать хотя бы три строки в каждом.

На данном этапе куда удобнее будет привязать Google drive (Гугл-диск) к Colab и загрузить туда текстовые документы.

Команда для привязки Гугл-диска:

from google.colab import drive
drive.mount(‘/content/drive’)

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

Подключение к боту

Находим бота в поиске по названию
После перехода в окно диалога с ботом нужно его запустить кнопкой внизу окна диалога.

Запускаем бота

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

Выберите, что вы хотите от бота

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

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

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