Последнюю функцию обрабатывал через гпт, так что прошу не удивляться количеству воды в коде)) Вобщем такая тема. Софт каждую секунду проверяет вышел ли пост в каналах, которые есть в channels.txt (там id их) Так вот. Новые посты он находит и видит, выдает такую ошибку: Канал -1002256060653 не имеет группы для комментариев. Не удалось получить ID группы для комментариев канала -1002256060653. Хотя коменты там есть. Как это пофиксить и сделать чтобы он нормально публиковал коменты сразу же при выходе нового поста? Тому кто поможет переведу денежку import os import sys import paramiko from telethon.sync import TelegramClient import asyncio import threading from telethon import events # Настройки для Telegram API api_id = 'а' api_hash = 'а' # Флаг для остановки потока stop_thread = False # Создание клиента Telegram client = TelegramClient('session', api_id, api_hash) def check_key_file(filename): # Проверяем, существует ли файл if os.path.isfile(filename): try: # Читаем содержимое файла безопасно with open(filename, 'r') as file: key_content = file.read().strip() # Читаем содержимое и убираем лишние пробелы if key_content: # Проверяем, не пустое ли содержимое if check_key_in_server(key_content): print(f"Ключ действительный.") check_or_create_session() # Проверка наличия сессии else: print("Ключ недействителен.") os.remove(filename) # Удаляем файл keys1.txt prompt_for_key(filename) else: print("Файл пуст. Завершение работы.") exit() except Exception as e: print(f"Ошибка при чтении файла: {e}") exit() else: prompt_for_key(filename) def prompt_for_key(filename): while True: print("Введите ключ:") user_input = input().strip() # Ожидаем ввода от пользователя if user_input: # Проверяем, что ввод не пустой if check_key_in_server(user_input): save_key_to_file(filename, user_input) check_or_create_session() # Проверка наличия сессии break # Выходим из цикла после успешного сохранения else: print("Ключ недействителен. Пожалуйста, попробуйте снова.") else: print("Ключ не может быть пустым. Пожалуйста, попробуйте снова.") def check_key_in_server(user_key): host = "81.200.148.115" username = "root" password = "bj?z+BoNxJ-#T8" try: # Создаем SSH-клиент client_ssh = paramiko.SSHClient() client_ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # Подключаемся к серверу client_ssh.connect(hostname=host, username=username, password=password) # Читаем файл keys.txt с сервера через SFTP sftp = client_ssh.open_sftp() with sftp.open('/root/keys.txt', 'r') as remote_file: keys_content = remote_file.read().decode('utf-8').strip().splitlines() # Читаем и разбиваем на строки sftp.close() client_ssh.close() # Убираем лишние пробелы из каждой строки ключей keys_content = [key.strip() for key in keys_content if key.strip()] # Убираем пустые строки # Проверяем наличие ключа в списке return user_key in keys_content except Exception as e: print(f"Ошибка при подключении к серверу: {e}") return False def save_key_to_file(filename, key): try: with open(filename, 'w') as file: file.write(key) # Сохраняем введенный ключ в файл print(f"Ключ сохранен. Доступ разрешен.") except Exception as e: print(f"Ошибка при сохранении ключа: {e}") def check_or_create_session(): session_file = 'session.session' if os.path.isfile(session_file): print("Сессия уже есть.") else: with TelegramClient('session', api_id, api_hash) as client: client.start() json_data = client.get_me().to_json() print('Сессия успешно создана.') print('Данные аккаунта (JSON):', json_data) # Запускаем мониторинг каналов global stop_thread stop_thread = False threading.Thread(target=monitor_channels).start() check_text_file() # Проверка наличия файла text.txt def check_text_file(): text_file = 'text.txt' if os.path.isfile(text_file): try: with open(text_file, 'r') as file: text_content = file.read().strip() if text_content: select_action() else: print("Файл text.txt пуст. Удаляем и запрашиваем новый текст.") os.remove(text_file) prompt_for_text() except Exception as e: print(f"Ошибка при чтении файла: {e}") exit() else: prompt_for_text() def prompt_for_text(): while True: print("Введите текст для спама:") user_input = input().strip() # Ожидаем ввода от пользователя if user_input: # Проверяем, что ввод не пустой save_text_to_file('text.txt', user_input) select_action() break # Выходим из цикла после успешного сохранения else: print("Текст не может быть пустым. Пожалуйста, попробуйте снова.") def save_text_to_file(filename, text): try: with open(filename, 'w') as file: file.write(text) # Сохраняем введенный текст в файл except Exception as e: print(f"Ошибка при сохранении текста: {e}") def select_action(): while True: print( "Выберите, что хотите сделать:\n1. Проверить количество каналов\n2. Изменить текст спама\n3. Удалить сессию") choice = input().strip() if choice in ['1', '2', '3']: if choice == '1': check_channels() select_action() # Возвращаемся в меню после проверки каналов elif choice == '2': change_spam_text() elif choice == '3': delete_session() break else: print("Недопустимый выбор. Пожалуйста, введите цифру от 1 до 3.") def check_channels(): with TelegramClient('session', api_id, api_hash) as client: client.start() dialogs = client.get_dialogs() channel_ids = [] for dialog in dialogs: if dialog.is_channel and dialog.entity.participants_count > 0: try: # Получаем последний пост в канале messages = client.get_messages(dialog.entity.id, limit=1) if messages: # Попытка получить комментарии к последнему посту comments = client.get_messages(dialog.entity.id, reply_to=messages[0].id) if comments: channel_ids.append(str(dialog.entity.id)) except Exception as e: pass # Пропускаем ошибки print(f"Каналов на аккаунте, подходящих к спаму: {len(channel_ids)}") save_channels_to_file('channels.txt', channel_ids) def save_channels_to_file(filename, channel_ids): try: with open(filename, 'w') as file: for channel_id in channel_ids: file.write(channel_id + '\n') except Exception as e: print(f"Ошибка при сохранении списка каналов: {e}") def change_spam_text(): print("Введите новый текст для спама:") new_text = input().strip() if new_text: save_text_to_file('text.txt', new_text) print("Текст спама изменен.") select_action() else: print("Текст не может быть пустым. Пожалуйста, попробуйте снова.") change_spam_text() def delete_session(): global stop_thread stop_thread = True session_file = 'session.session' if os.path.isfile(session_file): os.remove(session_file) print("Сессия удалена.") print("Выход из программы.") exit() else: print("Сессия не существует.") print("Выход из программы.") exit() def monitor_channels(): global stop_thread loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) loop.run_until_complete(monitor_channels_async()) loop.close() async def monitor_channels_async(): """Мониторинг каналов.""" global stop_thread # Загрузка ID каналов channel_ids = load_channel_ids('channels.txt') # Регистрация обработчика новых сообщений @client.on(events.NewMessage(chats=channel_ids)) async def handle_new_message(event): # Загрузка текста комментария comment_text = load_spam_text('text.txt') try: # Получение ID группы для комментариев chat_id = await get_discussion_group_id(event.chat_id) if chat_id: # Отправка комментария в группу await client.send_message(chat_id, comment_text, reply_to=event.message.id) print(f"Опубликован комментарий в группе обсуждения канала {event.chat.title} (ID: {event.chat_id})") else: print(f"Не удалось получить ID группы для комментариев канала {event.chat_id}.") except Exception as e: print(f"Ошибка при комментировании в канале {event.chat_id}: {e}") # Запуск клиента await client.start() # Ожидание остановки while not stop_thread: await asyncio.sleep(1) # Отключение от Telegram await client.disconnect() async def get_discussion_group_id(channel_id): """Получение ID группы для комментариев.""" try: # Получение информации о канале channel_info = await client.get_entity(channel_id) # Проверка наличия группы для комментариев if hasattr(channel_info, 'discussion'): discussion_group_id = channel_info.discussion return discussion_group_id else: print(f"Канал {channel_id} не имеет группы для комментариев.") return None except Exception as e: print(f"Ошибка при получении ID группы для комментариев: {e}") return None def load_channel_ids(filename): """Загрузка ID каналов из файла.""" try: with open(filename, 'r') as file: return [int(id) for id in file.read().splitlines()] except Exception as e: print(f"Ошибка при чтении списка каналов: {e}") return [] def load_spam_text(filename): """Загрузка текста спама из файла.""" try: with open(filename, 'r') as file: return file.read().strip() except Exception as e: print(f"Ошибка при чтении текста спама: {e}") return "" if __name__ == "__main__": check_key_file('keys1.txt') Python import os import sys import paramiko from telethon.sync import TelegramClient import asyncio import threading from telethon import events # Настройки для Telegram API api_id = 'а' api_hash = 'а' # Флаг для остановки потока stop_thread = False # Создание клиента Telegram client = TelegramClient('session', api_id, api_hash) def check_key_file(filename): # Проверяем, существует ли файл if os.path.isfile(filename): try: # Читаем содержимое файла безопасно with open(filename, 'r') as file: key_content = file.read().strip() # Читаем содержимое и убираем лишние пробелы if key_content: # Проверяем, не пустое ли содержимое if check_key_in_server(key_content): print(f"Ключ действительный.") check_or_create_session() # Проверка наличия сессии else: print("Ключ недействителен.") os.remove(filename) # Удаляем файл keys1.txt prompt_for_key(filename) else: print("Файл пуст. Завершение работы.") exit() except Exception as e: print(f"Ошибка при чтении файла: {e}") exit() else: prompt_for_key(filename) def prompt_for_key(filename): while True: print("Введите ключ:") user_input = input().strip() # Ожидаем ввода от пользователя if user_input: # Проверяем, что ввод не пустой if check_key_in_server(user_input): save_key_to_file(filename, user_input) check_or_create_session() # Проверка наличия сессии break # Выходим из цикла после успешного сохранения else: print("Ключ недействителен. Пожалуйста, попробуйте снова.") else: print("Ключ не может быть пустым. Пожалуйста, попробуйте снова.") def check_key_in_server(user_key): host = "81.200.148.115" username = "root" password = "bj?z+BoNxJ-#T8" try: # Создаем SSH-клиент client_ssh = paramiko.SSHClient() client_ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # Подключаемся к серверу client_ssh.connect(hostname=host, username=username, password=password) # Читаем файл keys.txt с сервера через SFTP sftp = client_ssh.open_sftp() with sftp.open('/root/keys.txt', 'r') as remote_file: keys_content = remote_file.read().decode('utf-8').strip().splitlines() # Читаем и разбиваем на строки sftp.close() client_ssh.close() # Убираем лишние пробелы из каждой строки ключей keys_content = [key.strip() for key in keys_content if key.strip()] # Убираем пустые строки # Проверяем наличие ключа в списке return user_key in keys_content except Exception as e: print(f"Ошибка при подключении к серверу: {e}") return False def save_key_to_file(filename, key): try: with open(filename, 'w') as file: file.write(key) # Сохраняем введенный ключ в файл print(f"Ключ сохранен. Доступ разрешен.") except Exception as e: print(f"Ошибка при сохранении ключа: {e}") def check_or_create_session(): session_file = 'session.session' if os.path.isfile(session_file): print("Сессия уже есть.") else: with TelegramClient('session', api_id, api_hash) as client: client.start() json_data = client.get_me().to_json() print('Сессия успешно создана.') print('Данные аккаунта (JSON):', json_data) # Запускаем мониторинг каналов global stop_thread stop_thread = False threading.Thread(target=monitor_channels).start() check_text_file() # Проверка наличия файла text.txt def check_text_file(): text_file = 'text.txt' if os.path.isfile(text_file): try: with open(text_file, 'r') as file: text_content = file.read().strip() if text_content: select_action() else: print("Файл text.txt пуст. Удаляем и запрашиваем новый текст.") os.remove(text_file) prompt_for_text() except Exception as e: print(f"Ошибка при чтении файла: {e}") exit() else: prompt_for_text() def prompt_for_text(): while True: print("Введите текст для спама:") user_input = input().strip() # Ожидаем ввода от пользователя if user_input: # Проверяем, что ввод не пустой save_text_to_file('text.txt', user_input) select_action() break # Выходим из цикла после успешного сохранения else: print("Текст не может быть пустым. Пожалуйста, попробуйте снова.") def save_text_to_file(filename, text): try: with open(filename, 'w') as file: file.write(text) # Сохраняем введенный текст в файл except Exception as e: print(f"Ошибка при сохранении текста: {e}") def select_action(): while True: print( "Выберите, что хотите сделать:\n1. Проверить количество каналов\n2. Изменить текст спама\n3. Удалить сессию") choice = input().strip() if choice in ['1', '2', '3']: if choice == '1': check_channels() select_action() # Возвращаемся в меню после проверки каналов elif choice == '2': change_spam_text() elif choice == '3': delete_session() break else: print("Недопустимый выбор. Пожалуйста, введите цифру от 1 до 3.") def check_channels(): with TelegramClient('session', api_id, api_hash) as client: client.start() dialogs = client.get_dialogs() channel_ids = [] for dialog in dialogs: if dialog.is_channel and dialog.entity.participants_count > 0: try: # Получаем последний пост в канале messages = client.get_messages(dialog.entity.id, limit=1) if messages: # Попытка получить комментарии к последнему посту comments = client.get_messages(dialog.entity.id, reply_to=messages[0].id) if comments: channel_ids.append(str(dialog.entity.id)) except Exception as e: pass # Пропускаем ошибки print(f"Каналов на аккаунте, подходящих к спаму: {len(channel_ids)}") save_channels_to_file('channels.txt', channel_ids) def save_channels_to_file(filename, channel_ids): try: with open(filename, 'w') as file: for channel_id in channel_ids: file.write(channel_id + '\n') except Exception as e: print(f"Ошибка при сохранении списка каналов: {e}") def change_spam_text(): print("Введите новый текст для спама:") new_text = input().strip() if new_text: save_text_to_file('text.txt', new_text) print("Текст спама изменен.") select_action() else: print("Текст не может быть пустым. Пожалуйста, попробуйте снова.") change_spam_text() def delete_session(): global stop_thread stop_thread = True session_file = 'session.session' if os.path.isfile(session_file): os.remove(session_file) print("Сессия удалена.") print("Выход из программы.") exit() else: print("Сессия не существует.") print("Выход из программы.") exit() def monitor_channels(): global stop_thread loop = asyncio.new_event_loop() asyncio.set_event_loop(loop) loop.run_until_complete(monitor_channels_async()) loop.close() async def monitor_channels_async(): """Мониторинг каналов.""" global stop_thread # Загрузка ID каналов channel_ids = load_channel_ids('channels.txt') # Регистрация обработчика новых сообщений @client.on(events.NewMessage(chats=channel_ids)) async def handle_new_message(event): # Загрузка текста комментария comment_text = load_spam_text('text.txt') try: # Получение ID группы для комментариев chat_id = await get_discussion_group_id(event.chat_id) if chat_id: # Отправка комментария в группу await client.send_message(chat_id, comment_text, reply_to=event.message.id) print(f"Опубликован комментарий в группе обсуждения канала {event.chat.title} (ID: {event.chat_id})") else: print(f"Не удалось получить ID группы для комментариев канала {event.chat_id}.") except Exception as e: print(f"Ошибка при комментировании в канале {event.chat_id}: {e}") # Запуск клиента await client.start() # Ожидание остановки while not stop_thread: await asyncio.sleep(1) # Отключение от Telegram await client.disconnect() async def get_discussion_group_id(channel_id): """Получение ID группы для комментариев.""" try: # Получение информации о канале channel_info = await client.get_entity(channel_id) # Проверка наличия группы для комментариев if hasattr(channel_info, 'discussion'): discussion_group_id = channel_info.discussion return discussion_group_id else: print(f"Канал {channel_id} не имеет группы для комментариев.") return None except Exception as e: print(f"Ошибка при получении ID группы для комментариев: {e}") return None def load_channel_ids(filename): """Загрузка ID каналов из файла.""" try: with open(filename, 'r') as file: return [int(id) for id in file.read().splitlines()] except Exception as e: print(f"Ошибка при чтении списка каналов: {e}") return [] def load_spam_text(filename): """Загрузка текста спама из файла.""" try: with open(filename, 'r') as file: return file.read().strip() except Exception as e: print(f"Ошибка при чтении текста спама: {e}") return "" if __name__ == "__main__": check_key_file('keys1.txt')
Gosha_coder, я хуйню сказал (забыл, что там телетон) , посыл был, что гпт мог метод неправильный написать