parser_version4

Форк
0
/
osnovaTG.py 
111 строк · 5.0 Кб
1
import asyncio
2
from aiogram import Bot, Dispatcher, types
3
from aiogram.fsm.storage.memory import MemoryStorage
4
from aiogram.fsm.context import FSMContext
5
from aiogram.fsm.state import State, StatesGroup
6
from aiogram.filters import Command
7
from aiogram.types import FSInputFile
8
from test2 import parse_and_save
9
from datetime import date, timedelta
10

11
TOKEN = "7032031280:AAEjXQh-WNlqfY2el6a7cj0PtUvJNh-vLM0"
12
CHANNEL_ID = "-1002157028324"
13

14
# Инициализация бота и диспетчера с FSM (сохранение состояний)
15
bot = Bot(token=TOKEN, timeout=60)
16
storage = MemoryStorage()
17
dp = Dispatcher(storage=storage)
18

19
# Классы для сохранения состояния
20
class ParserState(StatesGroup):
21
    waiting_for_days = State()
22

23
# Файлы для хранения ссылок и ключевых слов
24
LINKS_FILE = "links.txt"
25
KEYWORDS_FILE = "keywords.txt"
26
NAME_CHANNEL = "name.txt"
27
DAYS_FILE = "days.txt"  # Файл для хранения дней
28

29
# Сохраняем дни в файл
30
def save_days_to_file(days: int):
31
    with open(DAYS_FILE, 'w', encoding='utf-8') as file:
32
        file.write(str(days))
33

34
# Читаем дни из файла
35
def read_days_from_file():
36
    try:
37
        with open(DAYS_FILE, 'r', encoding='utf-8') as file:
38
            return int(file.read())
39
    except (FileNotFoundError, ValueError):
40
        return 7  # Значение по умолчанию, если файл не существует или ошибка чтения
41

42
# Чтение данных из файлов
43
def read_file(file_path):
44
    try:
45
        with open(file_path, 'r', encoding='utf-8') as file:
46
            return [line.strip() for line in file.readlines() if line.strip()]
47
    except FileNotFoundError:
48
        return []
49

50
# Парсинг и отправка данных в Telegram
51
async def send_parsed_data(days):
52
    try:
53
        a = read_file(LINKS_FILE)
54
        poisk = read_file(KEYWORDS_FILE)
55
        nazvanie = ["Бойлерная", "Кремлёвский безБашенник", "Силовики", "НЕЗЫГАРЬ", "ОПЕР Слил", "SHOT", "Mash", "Baza", "ВЧК-ОГПУ", "КОНТЕКСТ"]
56

57
        start_date = date.today() - timedelta(days=days)
58
        file_path = parse_and_save(a, nazvanie, poisk, start_date)
59
        document = FSInputFile(file_path)
60
        await bot.send_document(CHANNEL_ID, document)
61
    except Exception as e:
62
        print(f"Произошла ошибка: {e}")
63

64
# Фоновая задача для парсинга каждые 15 минут
65
async def scheduled_parsing():
66
    while True:
67
        try:
68
            days = read_days_from_file()  # Читаем количество дней из файла
69
            await send_parsed_data(days)
70
        except Exception as e:
71
            print(f"Ошибка в фоновом парсинге: {e}")
72
        await asyncio.sleep(900)  # 15 минут (900 секунд)
73

74
# Команда start - первый запрос дней
75
@dp.message(Command(commands=["start"]))
76
async def start_handler(message: types.Message, state: FSMContext):
77
    await message.answer("""Здравствуйте, вас привествует бот по Парсеру данных из разных каналов.
78
    Основные команды в боте:
79
    
80
    /start - запуск бота.
81
    /change_days - изменить время для парсера данных.""")
82
    
83
    await message.answer("Введите количество дней, за которые нужно парсить данные:")
84
    await state.set_state(ParserState.waiting_for_days)  # Переводим в состояние ожидания ввода дней
85

86
# Сохраняем количество дней, введенное пользователем
87
@dp.message(ParserState.waiting_for_days)
88
async def days_input_handler(message: types.Message, state: FSMContext):
89
    try:
90
        days = int(message.text)
91
        save_days_to_file(days)  # Сохраняем в файл
92
        await message.answer(f"Начинаем парсинг за последние {days} дней.")
93
        asyncio.create_task(scheduled_parsing())  # Запускаем фоновый парсер
94
        await send_parsed_data(days)  # Запускаем парсинг сразу после ввода
95
        await state.clear()  # Очищаем состояние
96
    except ValueError:
97
        await message.answer("Пожалуйста, введите корректное число.")
98

99
# Команда для изменения количества дней
100
@dp.message(Command(commands=["change_days"]))
101
async def change_days_handler(message: types.Message, state: FSMContext):
102
    await message.answer("Введите новое количество дней для парсинга:")
103
    await state.set_state(ParserState.waiting_for_days)  # Вновь запрашиваем ввод дней
104

105
# Запуск бота
106
async def main():
107
    await bot.delete_webhook(drop_pending_updates=True)
108
    await dp.start_polling(bot)
109

110
if __name__ == "__main__":
111
    asyncio.run(main())
112

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.