Dima Kit · Травень 22, 2018 в 6:19 pm
Почти всегда хочется иметь возможность видеть список всех пользователей бота, чтобы собирать статистику. Также было бы круто иметь возможность делать рассылки пользователям бота, к примеру уведомление о технических работах, что бот не будет корректно работать несколько часов, или рекламную рассылку, если вашим ботом пользуется много людей.
Для получения списка всех пользователей бота, к сожалению у телеграмма нет api и нам придется решать это своими усилиями. Для этого будем использовать базу данных. Часто для ботов используют реляционные базы данных: SQLite, PostgreSQL. Но чтобы разобраться с ними и научится работать корректно нужен не один час, а большинство фич их широкого функционала вы не будете использовать в процессе разработки ботов.
По этому в свое время я решил использовать нереляционную MongoDB. Чтобы установить ее на свой линукс и разобраться с ней я потратил минут 30, при том что до этого я не работал вообще ни с какими базами данных.
Спустя несколько лет и перепробовав несколько разных БД я только убедился что мое решение в свое время было правильным. Единственной БД, которую я использовал на продакшне в боте помимо MongoDB был Redis. У него есть преимущество – он значительно быстрее любых других баз данных (данные хранятся в оперативной памяти, а не в статической, как во остальных БД), но его минус – отсутствие некоторых привычных контейнеров и данные приходится декодировать ибо они хранятся в байтах.
Открываем консоль как в первом уроке. (Win+R -> “cmd” -> enter).
1 2 |
wmic os get caption wmic os get osarchitecture |
Так мы узнаем какая у нас ОС и архитектура. Зависимо от этих данных качаем отсюда .msi установщик. Кликаем на установщик и ставим себе MongoDB.
Для последних релизов Ubuntu/Debian есть очень простое решение как установить и добавить в автозапуск MongoDB. Открываем терминал и пишем:
1 |
sudo apt-get install mongodb |
Готово.
Для других дистрибутивов переходим по ссылке.
Качаем бинарь отсюда.
Разархивируем через терминал:
1 |
tar -zxvf mongodb-osx-ssl-x86_64-3.6.4.tgz |
Создаем папку и копируем:
1 2 |
mkdir -p mongodb cp -R -n mongodb-osx-ssl-x86_64-3.6.4/ mongodb |
Добавляем ее в PATH:
1 |
export PATH=<mongodb-install-directory>/bin:$PATH |
Если есть brew:
1 2 |
brew update brew install mongodb |
Надеюсь у вас корректная структура проекта, и/или вы прошли этот урок.
Открываем проект и добавляем в requirements.txt
1 |
pymongo |
После этого вводим:
1 |
sudo pip3 install -r requirements.txt |
Все. Мы установили пакет для python для работы с нашей базой данных.
Создаем файл db.py
. Пишем в него такой код:
1 2 3 4 |
import pymongo client = pymongo.MongoClient('mongodb://localhost/tutorial_bot') users_db = client.get_database()["users_db"] |
Таким образом мы создали базу “tutorial_bot”, подключились к ней и создадим коллекцию “users_db” как только запишем в нее первого юзера.
Чтобы сделать добавление пользователя в базу данных после того как он впервые написал боту (нажал Start) добавим такой код в bot_handlers.py:
Импорт:
1 |
from db import users_db |
В функцию def send_welcome(message)
:
1 2 |
if not users_db.find_one({"chat_id": message.chat.id}): users_db.insert_one({"chat_id" : message.chat.id}) |
Проверили, есть ли пользователь в базе и если его там нет, то добавляем. Для рассылок достаточно знать chat id
.
Можем сделать интереснее – если пользователь нажал /start впервые – говорить “Добро пожаловать в бота”, а если не впервые – говорить ему “Снова привет!)” Так мы применим нашу базу данных и сможем ее протестировать.
Добавим новое сообщение в messages.py
:
1 2 |
HELLO_MESSAGE = 'Добро пожаловать в нашего бота!' HELLO_AGAIN_MESSAGE = 'Снова привет!)' |
В bot_andlers.py
добавим нашу логику:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
from bot import bot # Импортируем объект бота from messages import * # Инмпортируем все с файла сообщений from db import users_db # Импортируем базу данных @bot.message_handler(commands=['start']) def send_welcome(message): # Если пользователя нет в базе if not users_db.find_one({"chat_id": message.chat.id}): users_db.insert_one({"chat_id" : message.chat.id}) bot.send_message(message.chat.id, HELLO_MESSAGE) # Если пользователь есть в базе else: bot.send_message(message.chat.id, HELLO_AGAIN_MESSAGE) @bot.message_handler(content_types=["text"]) # Любой текст def repeat_all_messages(message): bot.send_message(message.chat.id, message.text) if __name__ == '__main__': bot.polling(none_stop=True) |
Вот и все, запускаем бота и проверяем. Должно получится вот так:
На всякий случай вот код урока на github.
Спасибо за внимание!
<- Вторая часть | Четвертая часть ->
Excellent, what a blog it is! This webpage presents useful information to us, keep it up.
whoah this weblog is magnificent i love reading your posts.
Keep up the good work! You know, a lot of persons are searching round for this information, you can help them greatly.