Skip to content

Commit 66cd800

Browse files
committed
Добавлен экспорт базы по типам чатов и улучшена структура кода
- Добавлены отдельные экспорт-кнопки для каналов, супергрупп и обычных чатов - Улучшен нейминг функций и обновлена документация - Чёткая привязка хендлеров к тексту кнопок - Повышена читаемость и поддерживаемость модуля AI-поиска
1 parent 8751bdc commit 66cd800

2 files changed

Lines changed: 208 additions & 19 deletions

File tree

handlers/user/pars_ai.py

Lines changed: 205 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ def format_summary_message(groups_count):
218218

219219

220220
@router.message(F.text == "📥 Получить всю базу")
221-
async def get_all_database(message: Message, state: FSMContext):
221+
async def export_all_groups(message: Message, state: FSMContext):
222222
"""Выдаёт CSV-файл со всей базой данных групп и каналов."""
223223
await state.clear() # Завершаем текущее состояние машины состояния
224224
# Путь к временному CSV-файлу
@@ -228,6 +228,11 @@ async def get_all_database(message: Message, state: FSMContext):
228228
# Получаем все записи из базы
229229
groups = TelegramGroup.select()
230230

231+
count = groups.count()
232+
if count == 0:
233+
await message.answer("📭 База данных пуста.")
234+
return
235+
231236
# Записываем данные в CSV
232237
with open(csv_file_path, mode="w", encoding="utf-8", newline="") as f:
233238
writer = csv.writer(f)
@@ -250,8 +255,183 @@ async def get_all_database(message: Message, state: FSMContext):
250255
])
251256

252257
# Отправляем файл пользователю
253-
document = FSInputFile(csv_file_path, filename="База_групп_и_каналов.csv")
254-
await message.answer_document(document=document, caption="📦 Вот вся база данных Telegram-групп и каналов.")
258+
document = FSInputFile(csv_file_path, filename="База_всех_групп.csv")
259+
await message.answer_document(
260+
document=document,
261+
caption=f"📦 Вся база данных Telegram-групп и каналов.\n\n"
262+
f"📊 Всего записей: {count}"
263+
)
264+
265+
except Exception as e:
266+
await message.answer("❌ Произошла ошибка при создании файла.")
267+
print(f"Error generating CSV: {e}")
268+
269+
finally:
270+
# Удаляем временный файл после отправки
271+
if os.path.exists(csv_file_path):
272+
os.remove(csv_file_path)
273+
274+
275+
@router.message(F.text == "📥 Получить всю базу Каналов")
276+
async def export_channels(message: Message, state: FSMContext):
277+
"""Выдаёт CSV-файл со всей базой данных групп и каналов."""
278+
await state.clear() # Завершаем текущее состояние машины состояния
279+
# Путь к временному CSV-файлу
280+
csv_file_path = "telegram_channels_export.csv"
281+
282+
try:
283+
# Получаем только КАНАЛЫ
284+
groups = TelegramGroup.select().where(
285+
TelegramGroup.group_type == 'Канал'
286+
)
287+
288+
count = groups.count()
289+
if count == 0:
290+
await message.answer("📭 В базе данных нет каналов.")
291+
return
292+
293+
# Записываем данные в CSV
294+
with open(csv_file_path, mode="w", encoding="utf-8", newline="") as f:
295+
writer = csv.writer(f)
296+
# Заголовки
297+
writer.writerow([
298+
"Название", "Юзернейм", "Описание", "Участники",
299+
"Категория", "Тип", "Ссылка", "Дата добавления"
300+
])
301+
# Данные
302+
for group in groups:
303+
writer.writerow([
304+
group.name,
305+
group.username or "",
306+
group.description or "",
307+
group.participants,
308+
group.category or "",
309+
group.group_type,
310+
group.link,
311+
group.date_added.strftime("%Y-%m-%d %H:%M:%S")
312+
])
313+
314+
# Отправляем файл
315+
document = FSInputFile(csv_file_path, filename="База_каналов.csv")
316+
await message.answer_document(
317+
document=document,
318+
caption=f"📺 База данных Telegram-каналов.\n\n"
319+
f"📊 Всего каналов: {count}"
320+
)
321+
322+
except Exception as e:
323+
await message.answer("❌ Произошла ошибка при создании файла.")
324+
print(f"Error generating CSV: {e}")
325+
326+
finally:
327+
# Удаляем временный файл после отправки
328+
if os.path.exists(csv_file_path):
329+
os.remove(csv_file_path)
330+
331+
332+
@router.message(F.text == "📥 Получить всю базу Групп (супергрупп)")
333+
async def export_supergroups(message: Message, state: FSMContext):
334+
"""Выдаёт CSV-файл со всей базой данных групп и каналов."""
335+
await state.clear() # Завершаем текущее состояние машины состояния
336+
# Путь к временному CSV-файлу
337+
csv_file_path = "telegram_supergroups_export.csv"
338+
339+
try:
340+
# Получаем только СУПЕРГРУППЫ
341+
groups = TelegramGroup.select().where(
342+
TelegramGroup.group_type == 'Группа (супергруппа)'
343+
)
344+
345+
count = groups.count()
346+
if count == 0:
347+
await message.answer("📭 В базе данных нет супергрупп.")
348+
return
349+
350+
# Записываем данные в CSV
351+
with open(csv_file_path, mode="w", encoding="utf-8", newline="") as f:
352+
writer = csv.writer(f)
353+
# Заголовки
354+
writer.writerow([
355+
"Название", "Юзернейм", "Описание", "Участники",
356+
"Категория", "Тип", "Ссылка", "Дата добавления"
357+
])
358+
# Данные
359+
for group in groups:
360+
writer.writerow([
361+
group.name,
362+
group.username or "",
363+
group.description or "",
364+
group.participants,
365+
group.category or "",
366+
group.group_type,
367+
group.link,
368+
group.date_added.strftime("%Y-%m-%d %H:%M:%S")
369+
])
370+
371+
# Отправляем файл
372+
document = FSInputFile(csv_file_path, filename="База_супергрупп.csv")
373+
await message.answer_document(
374+
document=document,
375+
caption=f"👥 База данных Telegram-супергрупп.\n\n"
376+
f"📊 Всего супергрупп: {count}"
377+
)
378+
379+
except Exception as e:
380+
await message.answer("❌ Произошла ошибка при создании файла.")
381+
print(f"Error generating CSV: {e}")
382+
383+
finally:
384+
# Удаляем временный файл после отправки
385+
if os.path.exists(csv_file_path):
386+
os.remove(csv_file_path)
387+
388+
389+
@router.message(F.text == "📥 Получить всю базу Обычных чатов (группы старого типа)")
390+
async def export_legacy_groups(message: Message, state: FSMContext):
391+
"""Выдаёт CSV-файл со всей базой данных групп и каналов."""
392+
await state.clear() # Завершаем текущее состояние машины состояния
393+
# Путь к временному CSV-файлу
394+
csv_file_path = "telegram_oldgroups_export.csv"
395+
396+
try:
397+
# Получаем только ОБЫЧНЫЕ ЧАТЫ (группы старого типа)
398+
groups = TelegramGroup.select().where(
399+
TelegramGroup.group_type == 'Обычный чат (группа старого типа)'
400+
)
401+
402+
count = groups.count()
403+
if count == 0:
404+
await message.answer("📭 В базе данных нет обычных чатов.")
405+
return
406+
407+
# Записываем данные в CSV
408+
with open(csv_file_path, mode="w", encoding="utf-8", newline="") as f:
409+
writer = csv.writer(f)
410+
# Заголовки
411+
writer.writerow([
412+
"Название", "Юзернейм", "Описание", "Участники",
413+
"Категория", "Тип", "Ссылка", "Дата добавления"
414+
])
415+
# Данные
416+
for group in groups:
417+
writer.writerow([
418+
group.name,
419+
group.username or "",
420+
group.description or "",
421+
group.participants,
422+
group.category or "",
423+
group.group_type,
424+
group.link,
425+
group.date_added.strftime("%Y-%m-%d %H:%M:%S")
426+
])
427+
428+
# Отправляем файл
429+
document = FSInputFile(csv_file_path, filename="База_обычных_чатов.csv")
430+
await message.answer_document(
431+
document=document,
432+
caption=f"💬 База данных обычных чатов (группы старого типа).\n\n"
433+
f"📊 Всего чатов: {count}"
434+
)
255435

256436
except Exception as e:
257437
await message.answer("❌ Произошла ошибка при создании файла.")
@@ -415,21 +595,27 @@ async def handle_enter_keyword(message: Message, state: FSMContext):
415595

416596
def register_handlers_pars_ai():
417597
"""
418-
Регистрирует обработчики для AI-поиска групп и каналов.
419-
420-
Добавляет в маршрутизатор (router) два обработчика:
421-
1. handle_enter_keyword_menu — реагирует на кнопку "🔎 Поиск групп / каналов".
422-
2. handle_enter_keyword — обрабатывает 🔍 Ввод ключевого слова в состоянии MyStates.entering_keyword_ai_search.
423-
3. get_all_database - выдает всю базу с найденными группами / каналами
598+
Регистрирует обработчики для AI-поиска и экспорта Telegram-групп и каналов.
599+
600+
Добавляет в маршрутизатор (router) следующие обработчики:
601+
1. search_menu — отображает меню поиска по нажатию кнопки "🔎 Поиск групп / каналов".
602+
2. start_ai_search — запускает процесс AI-поиска по нажатию "🤖 AI поиск".
603+
3. process_ai_search_keyword — обрабатывает ввод ключевого слова в состоянии MyStates.entering_keyword_ai_search.
604+
4. export_all_groups — экспортирует всю базу групп и каналов в CSV.
605+
5. export_channels — экспортирует только каналы.
606+
6. export_supergroups — экспортирует только супергруппы.
607+
7. export_legacy_groups — экспортирует обычные чаты (группы старого типа).
608+
609+
Эти обработчики позволяют пользователю:
610+
- Использовать ИИ для поиска релевантных Telegram-чats по ключевому слову.
611+
- Получать результаты в виде CSV-файла.
612+
- Экспортировать всю или часть базы данных по типам чатов.
424613
425-
Эти обработчики позволяют пользователю найти публичные Telegram-группы и каналы
426-
по тематике с помощью искусственного интеллекта (Groq API), сохранить их в базу
427-
и получить результаты в виде CSV-файла.
428-
429-
Returns:
430-
None
614+
:return: None
431615
"""
432-
router.message.register(handle_enter_keyword_menu)
433-
router.message.register(handle_enter_keyword)
434-
router.message.register(get_all_database)
435-
router.message.register(ai_search)
616+
router.message.register(handle_enter_keyword_menu, F.text == "🔎 Поиск групп / каналов")
617+
router.message.register(ai_search, F.text == "🤖 AI поиск")
618+
router.message.register(export_all_groups, F.text == "📥 Получить всю базу")
619+
router.message.register(export_channels, F.text == "📥 Получить всю базу Каналов")
620+
router.message.register(export_supergroups, F.text == "📥 Получить всю базу Групп (супергрупп)")
621+
router.message.register(export_legacy_groups, F.text == "📥 Получить всю базу Обычных чатов (группы старого типа)")

keyboards/keyboards.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,9 @@ def search_group_ai():
123123
return ReplyKeyboardMarkup(
124124
keyboard=[
125125
[KeyboardButton(text="📥 Получить всю базу")],
126+
[KeyboardButton(text="📥 Получить всю базу Каналов")],
127+
[KeyboardButton(text="📥 Получить всю базу Групп (супергрупп)")],
128+
[KeyboardButton(text="📥 Получить всю базу Обычных чатов (группы старого типа)")],
126129
[KeyboardButton(text="🤖 AI поиск")],
127130
[KeyboardButton(text="🔙 Назад")],
128131
],

0 commit comments

Comments
 (0)