parser_version5
/
osnovaTG.py
144 строки · 6.9 Кб
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()22waiting_for_keyword = State() # Для добавления ключевого слова23
24# Файлы для хранения ссылок и ключевых слов
25LINKS_FILE = "links.txt"26KEYWORDS_FILE = "keywords.txt"27NAME_CHANNEL = "name.txt"28DAYS_FILE = "days.txt" # Файл для хранения дней29
30# Сохраняем дни в файл
31def save_days_to_file(days: int):32with open(DAYS_FILE, 'w', encoding='utf-8') as file:33file.write(str(days))34
35# Читаем дни из файла
36def read_days_from_file():37try:38with open(DAYS_FILE, 'r', encoding='utf-8') as file:39return int(file.read())40except (FileNotFoundError, ValueError):41return 7 # Значение по умолчанию, если файл не существует или ошибка чтения42
43# Чтение данных из файлов
44def read_file(file_path):45try:46with open(file_path, 'r', encoding='utf-8') as file:47return [line.strip() for line in file.readlines() if line.strip()]48except FileNotFoundError:49return []50
51# Функция для записи ключевого слова в файл
52def write_to_file(file_path, text):53try:54with open(file_path, 'a', encoding='utf-8') as file:55file.write(text + '\n')56except Exception as e:57print(f"Ошибка при записи в файл {file_path}: {e}")58
59# Парсинг и отправка данных в Telegram
60async def send_parsed_data(days):61try:62a = read_file(LINKS_FILE)63poisk = read_file(KEYWORDS_FILE)64nazvanie = ["Бойлерная", "Кремлёвский безБашенник", "Силовики", "НЕЗЫГАРЬ", "ОПЕР Слил", "SHOT", "Mash", "Baza", "ВЧК-ОГПУ", "КОНТЕКСТ"]65
66start_date = date.today() - timedelta(days=days)67file_path = parse_and_save(a, nazvanie, poisk, start_date)68document = FSInputFile(file_path)69await bot.send_document(CHANNEL_ID, document)70except Exception as e:71print(f"Произошла ошибка: {e}")72
73# Фоновая задача для парсинга каждые 15 минут
74async def scheduled_parsing():75while True:76try:77days = read_days_from_file() # Читаем количество дней из файла78await send_parsed_data(days)79except Exception as e:80print(f"Ошибка в фоновом парсинге: {e}")81await asyncio.sleep(900) # 15 минут (900 секунд)82
83# Команда start - первый запрос дней
84@dp.message(Command(commands=["start"]))85async def start_handler(message: types.Message, state: FSMContext):86await message.answer("""Здравствуйте, вас привествует бот по Парсеру данных из разных каналов.87Основные команды в боте:
88
89/start - запуск бота.
90/change_days - изменить время для парсера данных.
91/add_keyword - добавить новое ключевое слово""")92
93await message.answer("Введите количество дней, за которые нужно парсить данные:")94await state.set_state(ParserState.waiting_for_days) # Переводим в состояние ожидания ввода дней95
96# Сохраняем количество дней, введенное пользователем
97@dp.message(ParserState.waiting_for_days)98async def days_input_handler(message: types.Message, state: FSMContext):99try:100days = int(message.text)101save_days_to_file(days) # Сохраняем в файл102await message.answer(f"Начинаем парсинг за последние {days} дней.")103asyncio.create_task(scheduled_parsing()) # Запускаем фоновый парсер104await send_parsed_data(days) # Запускаем парсинг сразу после ввода105await state.clear() # Очищаем состояние106except ValueError:107await message.answer("Пожалуйста, введите корректное число.")108
109# Команда для изменения количества дней
110@dp.message(Command(commands=["change_days"]))111async def change_days_handler(message: types.Message, state: FSMContext):112await message.answer("Введите новое количество дней для парсинга:")113await state.set_state(ParserState.waiting_for_days) # Вновь запрашиваем ввод дней114
115# Команда для добавления ключевого слова
116@dp.message(Command(commands=["add_keyword"]))117async def add_keyword(message: types.Message, state: FSMContext):118await message.answer("Введите ключевое слово для добавления в поиск.")119await state.set_state(ParserState.waiting_for_keyword) # Устанавливаем состояние ожидания ключевого слова120
121# Обработка произвольного текста для добавления ключевых слов
122@dp.message(ParserState.waiting_for_keyword)123async def process_keyword(message: types.Message, state: FSMContext):124try:125keyword = message.text.strip()126poisk = read_file(KEYWORDS_FILE)127
128if keyword not in poisk:129write_to_file(KEYWORDS_FILE, keyword + '\n') # Добавляем в файл с новой строки130await message.answer(f"Ключевое слово '{keyword}' успешно добавлено!")131else:132await message.answer(f"Ключевое слово '{keyword}' уже существует.")133
134await state.clear() # Очищаем состояние после добавления ключевого слова135except Exception as e:136await message.answer(f"Произошла ошибка: {e}")137
138# Запуск бота
139async def main():140await bot.delete_webhook(drop_pending_updates=True)141await dp.start_polling(bot)142
143if __name__ == "__main__":144asyncio.run(main())145