@@ -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
416596def 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 == "📥 Получить всю базу Обычных чатов (группы старого типа)" )
0 commit comments