parser_version4
/
osnovaTG.py
111 строк · 5.0 Кб
1import asyncio2from aiogram import Bot, Dispatcher, types3from aiogram.fsm.storage.memory import MemoryStorage4from aiogram.fsm.context import FSMContext5from aiogram.fsm.state import State, StatesGroup6from aiogram.filters import Command7from aiogram.types import FSInputFile8from test2 import parse_and_save9from datetime import date, timedelta10
11TOKEN = "7032031280:AAEjXQh-WNlqfY2el6a7cj0PtUvJNh-vLM0"12CHANNEL_ID = "-1002157028324"13
14# Инициализация бота и диспетчера с FSM (сохранение состояний)
15bot = Bot(token=TOKEN, timeout=60)16storage = MemoryStorage()17dp = Dispatcher(storage=storage)18
19# Классы для сохранения состояния
20class ParserState(StatesGroup):21waiting_for_days = State()22
23# Файлы для хранения ссылок и ключевых слов
24LINKS_FILE = "links.txt"25KEYWORDS_FILE = "keywords.txt"26NAME_CHANNEL = "name.txt"27DAYS_FILE = "days.txt" # Файл для хранения дней28
29# Сохраняем дни в файл
30def save_days_to_file(days: int):31with open(DAYS_FILE, 'w', encoding='utf-8') as file:32file.write(str(days))33
34# Читаем дни из файла
35def read_days_from_file():36try:37with open(DAYS_FILE, 'r', encoding='utf-8') as file:38return int(file.read())39except (FileNotFoundError, ValueError):40return 7 # Значение по умолчанию, если файл не существует или ошибка чтения41
42# Чтение данных из файлов
43def read_file(file_path):44try:45with open(file_path, 'r', encoding='utf-8') as file:46return [line.strip() for line in file.readlines() if line.strip()]47except FileNotFoundError:48return []49
50# Парсинг и отправка данных в Telegram
51async def send_parsed_data(days):52try:53a = read_file(LINKS_FILE)54poisk = read_file(KEYWORDS_FILE)55nazvanie = ["Бойлерная", "Кремлёвский безБашенник", "Силовики", "НЕЗЫГАРЬ", "ОПЕР Слил", "SHOT", "Mash", "Baza", "ВЧК-ОГПУ", "КОНТЕКСТ"]56
57start_date = date.today() - timedelta(days=days)58file_path = parse_and_save(a, nazvanie, poisk, start_date)59document = FSInputFile(file_path)60await bot.send_document(CHANNEL_ID, document)61except Exception as e:62print(f"Произошла ошибка: {e}")63
64# Фоновая задача для парсинга каждые 15 минут
65async def scheduled_parsing():66while True:67try:68days = read_days_from_file() # Читаем количество дней из файла69await send_parsed_data(days)70except Exception as e:71print(f"Ошибка в фоновом парсинге: {e}")72await asyncio.sleep(900) # 15 минут (900 секунд)73
74# Команда start - первый запрос дней
75@dp.message(Command(commands=["start"]))76async def start_handler(message: types.Message, state: FSMContext):77await message.answer("""Здравствуйте, вас привествует бот по Парсеру данных из разных каналов.78Основные команды в боте:
79
80/start - запуск бота.
81/change_days - изменить время для парсера данных.""")82
83await message.answer("Введите количество дней, за которые нужно парсить данные:")84await state.set_state(ParserState.waiting_for_days) # Переводим в состояние ожидания ввода дней85
86# Сохраняем количество дней, введенное пользователем
87@dp.message(ParserState.waiting_for_days)88async def days_input_handler(message: types.Message, state: FSMContext):89try:90days = int(message.text)91save_days_to_file(days) # Сохраняем в файл92await message.answer(f"Начинаем парсинг за последние {days} дней.")93asyncio.create_task(scheduled_parsing()) # Запускаем фоновый парсер94await send_parsed_data(days) # Запускаем парсинг сразу после ввода95await state.clear() # Очищаем состояние96except ValueError:97await message.answer("Пожалуйста, введите корректное число.")98
99# Команда для изменения количества дней
100@dp.message(Command(commands=["change_days"]))101async def change_days_handler(message: types.Message, state: FSMContext):102await message.answer("Введите новое количество дней для парсинга:")103await state.set_state(ParserState.waiting_for_days) # Вновь запрашиваем ввод дней104
105# Запуск бота
106async def main():107await bot.delete_webhook(drop_pending_updates=True)108await dp.start_polling(bot)109
110if __name__ == "__main__":111asyncio.run(main())112