Как решить проблему глобальных переменных при написании телеграмм бота
Я написал такую оболочку для парсера в виде телеграмм бота(прошу прощения за отступы, при вставке текста не получилось их отладить).
import asyncio import logging import sys from os import getenv from aiogram import Dispatcher, html, Bot, F from aiogram.client.default import DefaultBotProperties from aiogram.enums import ParseMode from aiogram.filters import CommandStart, Command from aiogram.types import Message from aiogram.fsm.state import State, StatesGroup from aiogram.fsm.context import FSMContext import time import random
from keyboards import reply from main import find_items
TOKEN = getenv("BOT_TOKEN")
bot = Bot(token=TOKEN)
dp = Dispatcher()
cont = True
class parameter(StatesGroup):
max_price = State()
min_price = State()
show_broken = State()
#Получаем нужную информацию с помощью машины состояний
@dp.message(CommandStart()) async def command_start_handler(message: Message, state: FSMContext):
"""
This handler receives messages with `/start` command
"""
await message.answer(f"""Привет, {message.from_user.full_name}!\n Для начала отправки обьявлений укажите максимальную цену. """)
await state.set_state(parameter.max_price)
@dp.message(lambda message: message.text.isdigit(), parameter.max_price)
async def set_max_price(message: Message, state: FSMContext):
await state.update_data(max_price=message.text)
await message.answer(f"Установлена максимальная цена: {message.text}")
await message.answer("Напишите минимальную цену...")
await state.set_state(parameter.min_price)
@dp.message(lambda message: message.text.isdigit(), parameter.min_price)
async def set_min_price(message: Message, state: FSMContext):
await state.update_data(min_price=message.text)
await message.answer(f"Установлена минимальная цена: {message.text}")
await message.answer("Показывать обьявления с предположительно нерабочими компьютерами?", reply_markup=reply.show_kb)
await state.set_state(parameter.show_broken)
@dp.message(F.text == "Да" or "Нет", parameter.show_broken)
async def set_show_broken(message: Message, state: FSMContext):
if message.text == "Да":
await state.update_data(show_broken=True)
elif message.text == "Нет":
await state.update_data(show_broken=False)
data = await state.get_data()
await message.answer(f"Установлены настройки:\nМаксимальная цена:{data['max_price']}\nМинимальная цена:{data['min_price']}\nПоказывать предположительно сломаннае ПК:{data['show_broken']}")
await state.clear()
await message.answer("Принято. Бот начал анализ обьявлений, обычно это занимает около 5-ти минут...")
#Теперь с полученной информацией, по одной странице, анализируем объявления и отправляем подходящие под требования.
startP = 1
global cont
while cont == True:
founded_items = find_items(max_price=int(data["max_price"]), min_price=int(data["min_price"]), show_broken=data["show_broken"], finish_page=startP+1, start_page=startP)
for item in founded_items:
time.sleep(0.1)
await message.answer(f"""
Ссылка: {item["Link"]}\nНазвание: {item["Tittle"]}\nЦена:{item["Prise"]}\nОписание:{item["Description"]}\nДоставка:{item["Delivery"]}\nДата публикации: {item["Date of application"]}\nМесто: {item["Geoposition"]}\nСтраница на которой найден: {item["Page"]}
""")
startP += 1
if startP == 100:
time.sleep(random.randint(300, 900))
@dp.message(Command("/stop"))
async def stop(message: Message, state: FSMContext):
global cont
cont = False
print("Отправка обьявлений приостановлена")
async def main():
await bot.delete_webhook(drop_pending_updates=True)
await dp.start_polling(bot)
asyncio.run(main())
Проблема в том что прекращение рассылки осуществлено через глобальную переменную cont(типа continue), по умолчанию она всегда равна True, по команде /stop ей задаётся значение False и цикл заканчивается. Во 1-х само использование глобальных переменных не рекомендуется. И если ботом будет пользоваться более одного человека, получается команда /stop от одного пользователя будет останавливать рассылки вообще всех пользователей? Могу ли я как-нибудь сделать так чтоб у каждого пользователя эта переменная была своя? Или какие есть другие способы прерывания отсылки сообщений?