Telegram-бот, осуществляющий мониторинг доступности выбранных iOS приложений в App Store по URL и информирует пользователей о любых изменениях в их доступности.
Возможности администратора:
- добавление приложений в бота, с указанием url, названия и ссылки для запуска(
/add
) - удаление приложений из бота(
/remove
) - установка интервала(
/setinterval
) - генерация ключа доступа для пользователей(
/generatekey
) - отправка сообщения всем пользователям бота(
/broadcast
)
Возможности пользователя:
- получение доступа к боту с помощью кода доступа, полученного у администратора(
/start
) - получение статуса приложений, на обновления которых он подписан(
/status
) - возможность подписки на приложения(
/subscribe
) - получение ссылки для запуска приложения(
/getlaunchlinks
)
Возможности бота:
- бот периодически (интервал проверки задается администратором) отправляет запросы к страницам приложений в App Store. Приложение считается недоступным только после трех последовательных неуспешных запросов, каждый успешный запрос сбрасывает счетчик неуспешных попыток на ноль
- в случае обнаружения недоступности приложения, бот отправляет уведомление всем подписанным пользователям о данном событии
- Сохраняем проект в выбранную директорию:
git clone https://github.com/daniil-orlovv/appstore_bot.git
- Устанавливаем виртуальное окружение, находясь в корне проекта:
python -m venv venv
- Активируем виртуальное окружение:
source venv/scripts/activate
- Устанавливаем зависимости из файла requirements.txt:
pip install -r requirements.txt
- Создаем файл .env и заполняем его по подобию .env.exapmle, указав:
- BOT_TOKEN(можно получить в телеграм-боте
Bot Father
, создав своего бота) - INTERVAL_MINUTES(предварительная настройка интервала проверки доступа приложений в минутах)
- ADMIN_IDS(Список админов приложения, необходимо указать свой TELEGRAM_ID или пользователя, которого нужно назначить админом)
- BOT_TOKEN(можно получить в телеграм-боте
- Создаем и выполняем миграции с помощью
alembic
:- Переходим в корень и инициализируем
alembic
:alembic init alembic
- В файле alembic.ini указываем путь до файла базы данных sqlite3:
sqlalchemy.url = sqlite:///sqlite3.db
- По пути
alembic/
находимenv.py
и меняем строкуtarget_metadata = None
на:где# Импорт вышестоящего каталога import os import sys sys.path.insert(0, '/'.join(os.path.dirname(os.path.abspath(__file__)).split('/')[:-1])) from myapp.mymodel import Base target_metadata = Base.metadata
myapp.mymodel
путь до моделей БД ->models.models
- Создаем миграции:
alembic revision --message="Initial" --autogenerate
- Применяем миграции:
alembic upgrade head
- Переходим в корень и инициализируем
- Запускаем бота с помощью
python main.py
- Сохраняем проект в выбранную директорию:
git clone https://github.com/daniil-orlovv/appstore_bot.git
- Создаем файл .env и заполняем его по подобию .env.exapmle, указав:
- BOT_TOKEN(можно получить в телеграм-боте
Bot Father
, создав своего бота) - INTERVAL_MINUTES(предварительная настройка интервала проверки доступа приложений в минутах)
- ADMIN_IDS(Список админов приложения, необходимо указать свой TELEGRAM_ID или пользователя, которого нужно назначить админом)
- BOT_TOKEN(можно получить в телеграм-боте
- Создаем docker volume:
docker volume create sqlite_data
- Создаем образ:
docker build -t appstore_bot .
, находясь в корне проекта - Запускаем контейнер:
docker run --rm -it -p 8000:8000 --name appstore_bot -v sqlite_data:/data appstore_bot
- Сохраняем проект в выбранную директорию:
git clone https://github.com/daniil-orlovv/appstore_bot.git
- Создаем файл .env и заполняем его по подобию .env.exapmle, указав:
- BOT_TOKEN(можно получить в телеграм-боте
Bot Father
, создав своего бота) - INTERVAL_MINUTES(предварительная настройка интервала проверки доступа приложений в минутах)
- ADMIN_IDS(Список админов приложения, необходимо указать свой TELEGRAM_ID или пользователя, которого нужно назначить админом)
- BOT_TOKEN(можно получить в телеграм-боте
- Создаем файл
sqlite3.db
в папке `data - Запускаем проект одной командой:
docker compose up
- Копируем проект с github на удаленный сервер:
git clone https://github.com/daniil-orlovv/appstore_bot.git
, находясь в домашней директории на сервере - Копируем файл .env с локальной машины:
scp /<путь_до_папки_с_файлом_.env>/.env mike@188.124.51.136:/home/mike/FSM_example_bot
Пример:scp /Users/daniil/Desktop/Bots/appstore_bot/.env user@198.123.55.116:/home/user/appstore_bot
- Устанавливаем виртуальное окружение, находясь в корне проекта:
python3 -m venv venv
- Активируем виртуальное окружение:
source venv/bin/activate
- Устанавливаем необходимые зависимости:
pip install -r requirements.txt
- Запускаем бота:
python3 main.py
Для бесперебойной работы, при выключенном терминале:
- Переходим в директорию
cd /etc/systemd/system/
- Запускаем редактор:
sudo nano FSM_example_bot.service
илиnano FSM_example_bot.service
- Вставляем необходимые строки:
[Unit] Description=appstore_bot After=syslog.target After=network.target [Service] Type=simple User=<имя_пользователя> WorkingDirectory=<путь_к_директории_с_ботом> ExecStart=<путь_к_интерпретатору_python_в_виртуальном_окружении> <путь_к_исполняемому_файлу_бота> Restart=always [Install] WantedBy=multi-user.target
Пример файла:
[Unit]
Description=appstore_bot
After=syslog.target
After=network.target
[Service]
Type=simple
User=daniil_orlovv
WorkingDirectory=/home/daniil_orlovv/appstore_bot
ExecStart=/home/daniil_orlovv/appstore_bot/venv/bin/python3 /home/daniil_orlovv/appstore_bot/main.py
Restart=always
[Install]
WantedBy=multi-user.target
- Сохраняем файл, нажав следующую последовательность
CTRL + X
->y
->Enter
- Перезапускаем Systemd:
sudo systemctl daemon-reload
- Запускаем юнит:
sudo systemctl enable appstore_bot
->sudo systemctl start appstore_bot
Дополнительные возможности:
sudo systemctl status appstore_bot
- проверка статуса юнита(выход::q
)sudo systemctl restart appstore_bot
- перезапуск юнитаsudo systemctl stop appstore_bot
- остановка юнитаsudo systemctl disable appstore_bot
- отключение юнита
Обновление бота:
Из директории бота на сервере cd /home/daniil_orlovv/appstore_bot
выполняем команду git pull
и перезапускаем юнит: sudo systemctl restart appstore_bot
- Создаем на сервер папку проекта, например
appstore_bot
. - Создаем в папке файл
docker-compose.production.yml
- Заполняем файл:
version: '3' volumes: sqlite: services: bot: image: daniilorlovv/appstore_bot env_file: .env volumes: - sqlite:/data/
- Копируем файл
.env
в папку с проектом на сервере с локальной машины или создаем новый:BOT_TOKEN='1082480872:AAHMmOo8SjnYM67Ikr2glRqXZEp6FZkFeLQ' INTERVAL_MINUTES='1' ADMIN_IDS='242043626'
- Запускаем проект с помощью команды:
docker compose -f docker-compose.production.yml up
- Копируем файл
Администратор:
/add [урл приложения] [название приложения] [ссылка запуска]
: Администратор добавляет приложение с помощью этой команды, указывая обязательно через пробел урл, название и ссылку запуска. Все приложения сохраняются в БД./remove
: Администратор удаляет приложение. При нажатии на кнопку возвращается список кнопок с приложениями, при нажатии на которые, выбранное приложение удаляется./setinterval [значение в минутах]
: Администратор устанавливает интервал для проверки ботом доступности приложений, отправляю команду со значением в минутах, обязательно через пробел./generatekey [значение]
: Администратор генерирует код доступа для пользователей, отправляя команду вместе со значением кода, обязательно через пробел. Далее, сообщает код пользователю для его дальнейшей авторизации. После авторизации пользователя код автоматически удаляется.broadcast [сообщение]
: Администратор с помощью этой команды отправляет сообщение всем пользователям бота, указав через пробел сообщение, которое нужно всем отправить.
Пользователь:
/start [код доступа]
: Пользователь активирует бота с помощью кода, полученного у администратора, обязательно через пробел после команды./subscribe
: Пользователь отправляет команду, в ответ ботом отправляется список приложений, на которые можно создать подписку. Пользователь выбирает приложение - создается подписка./status
: При отправке команды возвращаются статусы приложений, на которые подписан пользователь./getlaunchlinks
: Команда позволяет пользователю получить ссылки для запуска выбранных приложений. При отправке команды - бот отправляет список приложений. Пользователь выбирает приложение, в ответ приходит ссылка для запуска приложения.
Все команды для пользователя продублированы кнопками в телеграм-боте.
config_data/config.py
- предназначен для хранения конфигов проекта, а именно токен бота, список админов, интервал проверки. Также, для загрузки конфигов при запуске и обновлении интервала проверкиdata/
: директория для хранения БДfilters/
:filters.py
- фильтр для проверки приложения в БДpermissions.py
- фильтры для проверки прав(Админ, Авторизованный)
handlers/
:admin_handlers.py
- обработчики, предназначенные для команд администратораuser_handlers.py
- обработчики, предназначенные для команд пользователя
keyboards/keyboards_builder.py
- билдер для создания обычных и инлайн-клавиатурlexicon/
:admin_handlers.py
- словарь для подстановки текста в обработчики команд админаuser_handlers.py
- словарь для подстановки текста в обработчики команд пользователя
middlewares/middleware.py
- мидлварь, отвечающий за создание сессии БД перед фильтрами и передачу ее в обработчикиmodels/models.py
- модели БДstates/state.py
- состояния FSMutils/
:utils_db.py
- утилиты(функции) для взаимодействия с БДutils.py
- утилиты(функции) для проверки доступности приложений
main.py
- точка входа в бота
- aiogram
- aiohttp
- SQLAlchemy
- alembic
- APScheduler
- environs
- python-dotenv
- logging
- docker
- docker-compose
- Ubuntu 22.04 LTS
- VPS