Как сделать счетчик пользователей телеграм боте python
Перейти к содержимому

Как сделать счетчик пользователей телеграм боте python

  • автор:

Как реализовать счетчик заказов в телеграм боте?

Я только начала изучать Python и создание чат ботов, нужна помощь опытных. Подскажите, пожалуйста, как оформить код, чтобы при нажатии кнопки «Шаурма 1» срабатывал счётчик заказов и на кнопке возле названия появлялось (1), тоесть «Шаурма 1 (1)», и при каждом последующем нажатии кнопки количество увеличивалось на +1, а товар был добавлен в корзину. Использую библиотеку pyTelegramBotAPI и БД MySQL.

@bot.message_handler(commands=['start']) def send_welcome(message): key = types.InlineKeyboardMarkup() area1 = types.InlineKeyboardButton(text='Шаурма 1', callback_data='1') area2 = types.InlineKeyboardButton(text='Шаурма 2', callback_data='2') area3 = types.InlineKeyboardButton(text='Шаурма 3', callback_data='3') key.add(area1, area2, area3) bot.send_message(message.chat.id, text="Воспользуйтесь кнопками ниже ⬇️, чтобы сделать свой заказ", reply_markup=key) k=0 @bot.callback_query_handler(func=lambda c: True) def inlin(c): global k k=k+1 if c.data == '1': bot.answer_callback_query(callback_query_id=c.id, text='Добавлено в корзину') if c.data == '2': bot.answer_callback_query(callback_query_id=c.id, text='Добавлено в корзину') if c.data == '3': bot.answer_callback_query(callback_query_id=c.id, text='Добавлено в корзину') 

Отслеживать
77k 6 6 золотых знаков 57 57 серебряных знаков 123 123 бронзовых знака
задан 1 авг 2020 в 8:44
111 3 3 серебряных знака 13 13 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Накидал примерный алгоритм.

Использовал метод edit_message_reply_markup, чтобы поменять только кнопки под сообщением.

import threading . # Для синхронизации потоков lock = threading.Lock() # Кэш подготавливаемых заказов. По хорошему, нужно сделать еще один ключ -- chat_id и хранить в нем состояние: текст, счетчик и т.п. ORDER_CACHE = < "1": 0, "2": 0, "3": 0, >def get_order_text_counter(data: str) -> str: return f' ()' if ORDER_CACHE[c.data] else '' @bot.callback_query_handler(func=lambda c: True) def inlin(c): if c.data not in ORDER_CACHE: return # Только один поток в один момент может обращаться к коду with lock: # Обновление счетчика заказа ORDER_CACHE[c.data] += 1 # Подготовка встроенных кнопок с обновленным текстом key = types.InlineKeyboardMarkup() area1 = types.InlineKeyboardButton(text='Шаурма 1' + get_order_text_counter("1"), callback_data='1') area2 = types.InlineKeyboardButton(text='Шаурма 2' + get_order_text_counter("2"), callback_data='2') area3 = types.InlineKeyboardButton(text='Шаурма 3' + get_order_text_counter("3"), callback_data='3') key.add(area1, area2, area3) # Меняем кнопки под сообщением bot.edit_message_reply_markup(c.message.chat_id, c.message.message_id, reply_markup=key) bot.answer_callback_query(callback_query_id=c.id, text='Добавлено в корзину') 

UPD.

А так я бы описал структуру подготовленных заказов. Но чтобы эти заказы не было общими для всех клиентов, нужно создавать отдельные для отдельных чатов. Получится словарь, у которого ключом будет chat_id , а значением словарь вида ORDER_CACHE

from dataclasses import dataclass import threading . # Для синхронизации потоков lock = threading.Lock() @dataclass class Order: title: str number: int = 0 def get_total_title(self) -> str: return self.title + f' ()' if self.number else '' ORDER_CACHE = < "1": Order('Шаурма 1'), "2": Order('Шаурма 2'), "3": Order('Шаурма 3'), >def get_inline_keyboard_markup() -> types.InlineKeyboardMarkup: markup = types.InlineKeyboardMarkup() for data, order in ORDER_CACHE.items(): button = types.InlineKeyboardButton(text=order.get_total_title(), callback_data=data) markup.add(button) return markup @bot.message_handler(commands=['start']) def send_welcome(message): markup = get_inline_keyboard_markup() bot.send_message(message.chat.id, text="Воспользуйтесь кнопками ниже ⬇️, чтобы сделать свой заказ", reply_markup=markup) @bot.callback_query_handler(func=lambda c: True) def inlin(c): # Если заказ с указанной data не поддерживается if c.data not in ORDER_CACHE: return # Обновление счетчика заказа if lock: ORDER_CACHE[c.data] += 1 # Подготовка встроенных кнопок с обновленным текстом markup = get_inline_keyboard_markup() # Меняем кнопки под сообщением bot.edit_message_reply_markup(c.message.chat_id, c.message.message_id, reply_markup=markup) bot.answer_callback_query(callback_query_id=c.id, text='Добавлено в корзину') 

PS.

Накидал пару примеров на python-telegram-bot :

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

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

Например, при увеличении числа на 1:

  • Нужно сначала взять значение из переменной
  • После к этому значению прибавить 1
  • И новое значение положить в переменную

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

Как узнать количество пользователей Телеграм-бота на Python?

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

import pyowm import telebot owm=pyowm.OWM('df1. 51', language = 'ru') bot = telebot.TeleBot('106. ilQ') @bot.message_handler(content_types=['text']) def send_echo(message): try: observation = owm.weather_at_place(message.text) w = observation.get_weather() temp=w.get_temperature('celsius')['temp'] answer = f"В городе сейчас \n" answer += f"Температура в районе градусов\n\n" if temp
  • Вопрос задан более трёх лет назад
  • 1140 просмотров

Создаём Telegram-бота на Python с помощью pyTelegramBotAPI (telebot)

Создаём Telegram-бота на Python с помощью pyTelegramBotAPI (telebot)

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

Нам потребуется:

  1. Компьютер или ноутбук (При должном усердии можно попробовать на телефоне).
  2. Python 3 (Мы будем работать на версии 3.10).
  3. Редактор кода (Я использую PyCharm).
  4. Соединение с интернетом.

У всех на слуху две библиотеки для разработки telegram-ботов, это:
- telebot (он же pyTelegramBotAPI),
- aiogram.

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

Как и aiogram, telebot является адаптацией API telegram для взаимодействия с ответами от сайта. Со справкой API telegram можно ознакомиться тут https://core.telegram.org/. Там же вы сможете узнать подробнее об ответах API.

Получение токена для Telegram-бота

Чтобы создать нашего первого бота на Python надо обратиться к официальному боту от Telegram - BotFather. Там можно создать бота и получить его токен. Токен – это аналог пароля, который позволит нам управлять ботом изнутри и программировать его ответы.

Переходим в BotFather - https://t.me/BotFather и нажимаем «Запустить»:

Дальше выбираем команду /newbot и следуем всем указанием, и в конце мы получаем токен нашего бота:

Установка библиотеки telebot и знакомство с pyTelegramBotAPI

После получения токена нужно скачать библиотеку telebot:

pip install pyTelegramBotAPI 

если вы на macOS, то:

pip3 install pyTelegramBotAPI

Мы не будем раскладывать проект по модулям, поэтому у нас будет один исполнимый файл main.py. После создания файла надо импортировать библиотеку и наш токен:

import telebot api_token = 'Ваш токен вставлять сюда'

Первым делом следует инициализировать бота, передав в него токен, полученный от BotFather:

bot = telebot.TeleBot(api_token)

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

@bot.message_handler(content_types=['text']) def echo(message): bot.send_message(message.chat.id, text=f"")

Бот работает за cчёт декораторов, которые указывают, что мы хотим от него. Message handler – это обработчик всех сообщений, которые отправляет пользователь. В списке content_types перечисляем типы сообщений, которые хотим принимать. Можно указать text, audio, image и document.

У объекта bot есть множество методов, частью которых мы будем пользоваться. Основной из них - send message.

Чтобы заставить бота принимать сообщение, в конце файла пропишем:

bot.polling(none_stop=True)

Параметр none_stop указывает, что мы хотим принимать сообщения постоянно.
В стандартном положении параметр равен False, но мы ставим True.

После всех манипуляций получаем свое же сообщение:

Работа с API Яндекс Погоды

Перейдем к добавлению нужных функций - получению данных о погоде.

Для погоды мы будем пользоваться услугами бесплатного API от Яндекс Погоды:
https://yandex.ru/dev/weather/. Следует отметить, что бесплатный API от Яндекса ограничен 50 запросам в сутки. Если вас такое количество не устраивает, можно воспользоваться OpenWeather.

Запрос будет выглядеть так:

https://api.weather.yandex.ru/v2/informers?lat=55.75222&lon=37.61556

Запрос состоит из местоположения - в данном случае указаны координаты Москвы. Далее можно просить у пользователя геолокацию и присылать ему погоду по его координатам.

Для отправки GET-запроса к API Яндекс.Погоды нам поможет библиотека requests, а для обработки ответа - библиотека json.

pip install requests
pip3 install requests 

Библиотека requests предназначена для работы с GET и POST запросами, которые обычный пользователь делает через браузер. Теперь же мы можем общаться с сервером через python оставляя браузер за скобками. Часто используют requests вместе с BS4 (beautiful soup 4), чтобы удобно получать и анализировать информацию из html кода. Но в наш случае другая задача.

API Яндекс.Погоды отдаёт данные в формате JSON, поэтому библиотека json подойдёт лучше всего. JSON основан на JavaScript объекте и часто используется при обмене данными. Раньше он использовался только на сайтаx для работы с текстовыми данными. Сейчас его используют почти везде для удобного обмена данными. JSON принимают все языки программирования, что является его большим плюсом. В python библиотека json уже установлена и не требует отдельной команды.

Добавляем импорт нужных библиотек:

import requests import json

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

@bot.message_handler(commands=['get_weather', 'weather', 'pogoda']): def get_weather(message): pass

Для удобства выносим токен Яндекс.Погоды и ссылку в отдельные переменные:

url = "https://api.weather.yandex.ru/v2/informers?lat=55.75222&lon=37.61556" headers =

Отправим себе в Telegram полный ответ от API Яндекс.Погоды и проверим что все работает:

@bot.message_handler(commands=['get_weather', 'weather', 'pogoda']) def get_weather(message): r = requests.get(url=url, headers=headers) bot.send_message(message.chat.id, r.text)

После получения ответа сформируем нормальный ответ для пользователя. Сразу сделаем проверку на status_code, чтобы оповестить пользователя, если проблемы на стороне API. После получения ответа от API в текстовом формате, надо перевести его в словарь. Для этого подключаем библиотеку json - в функцию loads мы передаем текст ответа, а на выходе получаем объект типа dict (словарь):

@bot.message_handler(commands=['get_weather', 'weather', 'pogoda']) def get_weather(message): r = requests.get(url=url, headers=headers) bot.send_message(message.chat.id, r.text) if r.status_code == 200: data = json.loads(r.text) fact = data["fact"] bot.send_message(message.chat.id, text=f'Now in Moscow °, feels like °. Now on the street ') else: bot.send_message(message.chat.id, 'Problems on weather API')

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

Настройка команд для telegram-бота

Нам осталось сделать реакцию на команду /start. Она будет выводить команду для получения данных о погоде:

@bot.message_handler(commands=['start']) def get_weather(message): bot.send_message(message.chat.id, text=f'Hello, ! \n\nI can show you the weather with: \n/weather\n/pogoda\n/get_weather')

Мы обращаемся к информации, которая приходит нам в сообщении пользователя, чтобы получить из нее имя пользователя. Подробнее узнать о сообщениях пользователей можно тут https://core.telegram.org/constructor/message.

Теперь создадим подсказки для пользователей. Библиотека pyTElegramBotAPI не позволяет из кода редактировать подсказки для написания команды. Чтобы это сделать нам потребуется несколько операций в BotFather:

  1. кликаем на меню
  2. выбираем команду /mybots
  3. ищем нашего бота
  4. edit bot
  5. и выбираем edit commands
  6. дальше вводим нашу команду (Пример: команда – описание)

После всех манипуляций у нас появится всплывающая менюшка с командами:

Финальный код Telegram-бота на Python

Мы с вами затронули лишь малу часть того, что можно сделать с помощью python и Telegram. Telebot - не самая лучшая библиотека для создания ботов под большую аудитории. Если вы хотите писать бот для магазинов, вам потребуется более сильные инструменты разработки, которые есть в aiogram.

Если вам хочется потренироваться самостоятельно - попробуйте написать бота со следующими функциями: конвертор валюты, сводка по курсу валюты.

Весь код из урока:

import telebot import requests import json api_token = '5347819163:********lZu1qWQc5f55DPk' url = "https://api.weather.yandex.ru/v2/informers?lat=55.75222&lon=37.61556" headers = bot = telebot.TeleBot(api_token) @bot.message_handler(commands=['start']) def get_weather(message): bot.send_message(message.chat.id, text=f'Hello, ! \n\nI can show you the weather with: \n/weather\n/pogoda\n/get_weather') @bot.message_handler(commands=['get_weather', 'weather', 'pogoda']) def get_weather(message): r = requests.get(url=url, headers=headers) bot.send_message(message.chat.id, r.text) if r.status_code == 200: data = json.loads(r.text) fact = data["fact"] bot.send_message(message.chat.id, text=f'Now in Moscow °, feels like °. Now on the street ') else: bot.send_message(message.chat.id, 'Problems on weather API') bot.polling(none_stop=True)

Добавляем веб-интерфейс к телеграм-боту

Продолжаем показывать, как работают вместе бэкенд и фронтенд. У нас уже вышло про это две статьи — как сделать простой проект телеграм-бота и как запустить с ним полноценный бэкенд. Вот краткое содержание:

  • У нас есть скрипт на Python, который играет роль бэкенда — он записывает некие данные в базу и потом их выводит.
  • Скрипт получает данные из фронтенда — Телеграма. В Телеграме для этого работает бот, а мостиком между Телеграмом и нашим скриптом служит специальная библиотека Python.
  • На фронтенде пользователь отчитывается, что он сделал за сегодня. Эти отчёты прилетают на бэкенд, наш скрипт их принимает и записывает в базу данных.
  • По специальной команде скрипт выплёвывает то, что у него сейчас есть в базе данных. Выплёвывает в бота.

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

Что делаем

  1. Веб-страницу, внутри которой будет работать второй фронтенд.
  2. Внутри неё — PHP-скрипт, который будет получать данные из бэкенда.

Почему PHP? Потому что он подходит для этой простой задачи: вывести все данные из базы один раз.

Если бы нам нужно было закрыть эту страницу паролем, выдавать разные ключи разным людям, выводить данные по разным пользователям и т. д. — нужно было бы использовать Python и фреймворк Django. Но это большой труд: развернуть всё это хозяйство на сервере, а потом изучить конструкции и паттерны Django. Это имеет смысл для большого долгоиграющего проекта и не имеет для одноразовой странички.

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

Исходный Python-код телеграм-бота

# подключаем модуль для Телеграма import telebot # модуль работы со временем from datetime import datetime, timezone, timedelta # модуль для работы с базой данных import sqlite3 as sl # указываем токен для доступа к боту bot = telebot.TeleBot('6285051364:AAGG2iZ77NIeWj0YjqIs791qxPhvcS3Yu0s') # приветственный текст start_txt = 'Привет! Это журнал «Код». \n\nТеперь у бота появился бэкенд.' # подключаемся к файлу с базой данных con = sl.connect('reports.db') # открываем файл with con: # получаем количество таблиц с нужным нам именем data = con.execute("select count(*) from sqlite_master where type='table' and name='reports'") for row in data: # если таких таблиц нет if row[0] == 0: # создаём таблицу для отчётов with con: con.execute(""" CREATE TABLE reports ( datetime VARCHAR(40) PRIMARY KEY, date VARCHAR(20), id VARCHAR(200), name VARCHAR(200), text VARCHAR(500) ); """) # обрабатываем старт бота @bot.message_handler(commands=['start']) def start(message): # выводим приветственное сообщение bot.send_message(message.from_user.id, start_txt, parse_mode='Markdown') # обрабатываем команду /now @bot.message_handler(commands=['now']) def start(message): # подключаемся к базе con = sl.connect('reports.db') # получаем сегодняшнюю дату now = datetime.now(timezone.utc) date = now.date() # пустая строка для будущих отчётов s = '' # работаем с базой with con: # выполняем запрос к базе data = con.execute('SELECT * FROM reports WHERE date = :Date;',) # перебираем все результаты for row in data: # формируем строку в общем отчёте s = s + '*' + row[3] + '*' + ' → ' + row[4] + '\n\n' # если отчётов не было за сегодня if s == '': # формируем новое сообщение s = 'За сегодня ещё нет записей' # отправляем общий отчёт обратно в телеграм bot.send_message(message.from_user.id, s, parse_mode='Markdown') # обрабатываем команду /yesterday @bot.message_handler(commands=['yesterday']) def start(message): # подключаемся к базе con = sl.connect('reports.db') # получаем вчерашнюю дату yesterday = datetime.today() - timedelta(days=1) y_date = yesterday.date() # пустая строка для будущих отчётов s = '' # работаем с базой with con: # выполняем запрос data = con.execute('SELECT * FROM reports WHERE date = :Date;',) # смотрим на результат for row in data: # если результат пустой — ничего не делаем if row[0] == 0: pass # если вчера были какие-то отчёты else: # добавляем их в общий список отчётов s = s + '*' + row[3] + '*' + ' → ' + row[4] + '\n\n' # если отчётов не было за вчера if s == '': # формируем новое сообщение s = 'За вчерашний день нет записей' # отправляем пользователю это новое сообщение bot.send_message(message.from_user.id, s, parse_mode='Markdown') # обрабатываем входящий отчёт пользователя @bot.message_handler(content_types=['text']) def func(message): # подключаемся к базе con = sl.connect('reports.db') # подготавливаем запрос sql = 'INSERT INTO reports (datetime, date, id, name, text) values(?, ?, ?, ?, ?)' # получаем дату и время now = datetime.now(timezone.utc) # и просто дату date = now.date() # формируем данные для запроса data = [ (str(now), str(date), str(message.from_user.id), str(message.from_user.username), str(message.text[:500])) ] # добавляем с помощью запроса данные with con: con.executemany(sql, data) # отправляем пользователю сообщение о том, что отчёт принят bot.send_message(message.from_user.id, 'Принято, спасибо!', parse_mode='Markdown') # запускаем бота if __name__ == '__main__': while True: # в бесконечном цикле постоянно опрашиваем бота — есть ли новые сообщения try: bot.polling(none_stop=True, interval=0) # если возникла ошибка — сообщаем про исключение и продолжаем работу except Exception as e: print('❌❌❌❌❌ Сработало исключение! ❌❌❌❌❌')

Запускаем скрипт бэкенда на сервере

Сейчас наш скрипт работает локально на компьютере. Если компьютер выключить или пропадёт интернет, скрипт и бот перестанут работать. Это плохо для бэкенда — он должен работать всё время и без перебоев.

Мы можем запустить скрипт на сервере — то есть на чужом компьютере, который мы арендуем за деньги. Разница в том, что сервер всё время работает и редко перезагружается.

Для запуска скрипта на сервере нам потребуется собственно арендованный виртуальный сервис. А дальше воспользуемся рецептом из нашей старой статьи про запуск бота:

  1. Запускаем SSH-клиент и входим на наш сервер как администраторы.
  2. В SSH-терминале пишем по очереди такие команды (вместо .thecode можно написать название каталога, которое вам по душе):
    virtualenv .thecode
    source .thecode/bin/activate
  3. Установим Python-модуль для работы с Телеграмом:
    pip install pytelegrambotapi
  4. Когда установка закончится, пишем такую команду (не забывайте поменять путь к файлу на свой):
    python3 osebe/public_html/projects/front/backend.py
  5. Если хотите, чтобы после закрытия SSH-клиента или терминала бот продолжал работать, в последней команде в начале напишите nohup

Проверим работу бота после запуска на сервере:

Добавляем веб-интерфейс к телеграм-боту

Бот реагирует на команды и запоминает то, что мы ему пишем, значит, бот на сервере работает как нужно.

По идее нам нужно было отправить бота в защищённую папку, например cgi-bin, чтобы никто не мог получить доступ к базе. Но для простоты проекта мы не стали тратить на это время — сделаем это отдельно и расскажем, как это работает.

Создаём страницу

Наш новый фронт — это веб-страница, поэтому напишем простой код, который создаст обычную страницу с заголовком. Создадим новый файл front.php (не HTML, это важно!) и запишем в него такой код. Это весь HTML-код, который нам понадобится, — всё остальное будем делать на PHP. Если не знаете, что такое PHP, — вот подборка для начала:

А вот код страницы:

      Простой фронтенд к базе данных   

Отчёты

Теперь кладём этот файл на сервер в ту же папку, где и python-скрипт, чтобы всё было в одном месте, и открываем страницу в браузере.

Добавляем веб-интерфейс к телеграм-боту

Подключаемся к базе данных

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

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

// подключаемся к базе данных $connection = new SQLite3('reports.db'); // если подключились if($connection)< // выводим сообщение echo "

✅ Подключились к базе данных

"; >

Добавляем веб-интерфейс к телеграм-боту

Выводим отчёты

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

  1. Получить дату в нужном формате.
  2. Выгрузить все сегодняшние отчёты.
  3. Посмотреть, есть ли они вообще, если нет — выдать сообщение, что их нет.
  4. Если есть — вывести даты и отчёты.
  5. То же самое сделать для отчётов за остальные дни.

Запишем это всё на PHP — мы добавили комментарий к каждой строчке, чтобы было понятнее, как это всё работает:

// получаем дату в нужном формате $date = date('Y-m-d'); // выводим подзаголовок echo '

За сегодня

'; // получаем сегодняшние отчёты из базы $results = $connection->query("SELECT * FROM 'reports' WHERE 'date' == $date"); // получаем количество отчётов $row=$results->fetchArray(SQLITE3_ASSOC); // если они есть if ($row != false) < // заново получаем отчёты из базы $results = $connection->query("SELECT * FROM 'reports' WHERE 'date' == $date"); // пока есть записи в результатах поиска — выводим их while($row=$results->fetchArray(SQLITE3_ASSOC))< echo '' . $row['date'] . '
'; echo 'Ник: ' . $row['name'] . '
'; echo 'Отчёт: ' . $row['text'] . '
'; echo '
'; > // если отчётов нет > else < echo "

За сегодня записей нет

"; > // выводим подзаголовок echo '

Остальные отчёты

'; // выгружаем остальные отчёты из базы $results = $connection->query("SELECT * FROM 'reports' WHERE 'date' != $date"); // пока есть записи в результатах поиска — выводим их while($row=$results->fetchArray(SQLITE3_ASSOC))< echo '' . $row['date'] . '
'; echo 'Ник: ' . $row['name'] . '
'; echo 'Отчёт: ' . $row['text'] . '
'; echo '
'; >

Добавляем этот код в PHP-блок после подключения к базе, заливаем файл front.php на сервер и обновляем страницу:

Добавляем веб-интерфейс к телеграм-боту

Получается, что у нашего телеграм-бота появился второй фронтенд, который берёт те же данные, что и бот, но отображает их в другом месте и в другом формате.

Что дальше

Технически у нас всё сделано:

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

Но внутри много шероховатостей: всё ещё неоптимизированный код, небезопасное расположение базы, нет кнопок выбора дня на странице и так далее. Это можно исправлять в будущем.

Ещё один шаг в Python

Мы сделали проект с фронтом на PHP, а бэкенд работает на Python и SQLite. Если вам интересно делать такое, возможно, это ваше призвание. Приходите в Практикум: нам нужны такие, как вы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *