parser_version5

Форк
0
/
osnovaTG.py 
144 строки · 6.9 Кб
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
    waiting_for_keyword = State()  # Для добавления ключевого слова
23

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

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

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

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

51
# Функция для записи ключевого слова в файл
52
def write_to_file(file_path, text):
53
    try:
54
        with open(file_path, 'a', encoding='utf-8') as file:
55
            file.write(text + '\n')
56
    except Exception as e:
57
        print(f"Ошибка при записи в файл {file_path}: {e}")
58

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

66
        start_date = date.today() - timedelta(days=days)
67
        file_path = parse_and_save(a, nazvanie, poisk, start_date)
68
        document = FSInputFile(file_path)
69
        await bot.send_document(CHANNEL_ID, document)
70
    except Exception as e:
71
        print(f"Произошла ошибка: {e}")
72

73
# Фоновая задача для парсинга каждые 15 минут
74
async def scheduled_parsing():
75
    while True:
76
        try:
77
            days = read_days_from_file()  # Читаем количество дней из файла
78
            await send_parsed_data(days)
79
        except Exception as e:
80
            print(f"Ошибка в фоновом парсинге: {e}")
81
        await asyncio.sleep(900)  # 15 минут (900 секунд)
82

83
# Команда start - первый запрос дней
84
@dp.message(Command(commands=["start"]))
85
async def start_handler(message: types.Message, state: FSMContext):
86
    await message.answer("""Здравствуйте, вас привествует бот по Парсеру данных из разных каналов.
87
    Основные команды в боте:
88
    
89
    /start - запуск бота.
90
    /change_days - изменить время для парсера данных.
91
    /add_keyword - добавить новое ключевое слово""")
92
    
93
    await message.answer("Введите количество дней, за которые нужно парсить данные:")
94
    await state.set_state(ParserState.waiting_for_days)  # Переводим в состояние ожидания ввода дней
95

96
# Сохраняем количество дней, введенное пользователем
97
@dp.message(ParserState.waiting_for_days)
98
async def days_input_handler(message: types.Message, state: FSMContext):
99
    try:
100
        days = int(message.text)
101
        save_days_to_file(days)  # Сохраняем в файл
102
        await message.answer(f"Начинаем парсинг за последние {days} дней.")
103
        asyncio.create_task(scheduled_parsing())  # Запускаем фоновый парсер
104
        await send_parsed_data(days)  # Запускаем парсинг сразу после ввода
105
        await state.clear()  # Очищаем состояние
106
    except ValueError:
107
        await message.answer("Пожалуйста, введите корректное число.")
108

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

115
# Команда для добавления ключевого слова
116
@dp.message(Command(commands=["add_keyword"]))
117
async def add_keyword(message: types.Message, state: FSMContext):
118
    await message.answer("Введите ключевое слово для добавления в поиск.")
119
    await state.set_state(ParserState.waiting_for_keyword)  # Устанавливаем состояние ожидания ключевого слова
120

121
# Обработка произвольного текста для добавления ключевых слов
122
@dp.message(ParserState.waiting_for_keyword)
123
async def process_keyword(message: types.Message, state: FSMContext):
124
    try:
125
        keyword = message.text.strip()
126
        poisk = read_file(KEYWORDS_FILE)
127

128
        if keyword not in poisk:
129
            write_to_file(KEYWORDS_FILE, keyword + '\n')  # Добавляем в файл с новой строки
130
            await message.answer(f"Ключевое слово '{keyword}' успешно добавлено!")
131
        else:
132
            await message.answer(f"Ключевое слово '{keyword}' уже существует.")
133
        
134
        await state.clear()  # Очищаем состояние после добавления ключевого слова
135
    except Exception as e:
136
        await message.answer(f"Произошла ошибка: {e}")
137

138
# Запуск бота
139
async def main():
140
    await bot.delete_webhook(drop_pending_updates=True)
141
    await dp.start_polling(bot)
142

143
if __name__ == "__main__":
144
    asyncio.run(main())
145

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

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

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

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