Загрузка...

Кто поможет пофиксить код?

Тема в разделе Python создана пользователем Chasterr_Wr 26 янв 2025. 170 просмотров

  1. Chasterr_Wr
    Chasterr_Wr Автор темы 26 янв 2025 0 7 янв 2025
    Последнюю функцию обрабатывал через гпт, так что прошу не удивляться количеству воды в коде))
    Вобщем такая тема. Софт каждую секунду проверяет вышел ли пост в каналах, которые есть в channels.txt (там id их)
    Так вот. Новые посты он находит и видит, выдает такую ошибку:

    Канал -1002256060653 не имеет группы для комментариев.
    Не удалось получить ID группы для комментариев канала -1002256060653.

    Хотя коменты там есть. Как это пофиксить и сделать чтобы он нормально публиковал коменты сразу же при выходе нового поста?
    Тому кто поможет переведу денежку



    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')
     
    26 янв 2025 Изменено
    1. REDKLAUS
      Chasterr_Wr, всё что можно спалил емае
    2. Chasterr_Wr Автор темы
    3. akkaunt310
      Chasterr_Wr, лучше теперь обновить api id и hash, потому что это самое главное :falling:
      26 янв 2025 Изменено
  2. детектив
    детектив 27 янв 2025 elvis has left the building 277 19 ноя 2019
    твоя проблема в том, что телеграм не всегда явно связывает каналы с их группами для комментов, особенно если комменты были включены не с самого начала. get_discussion_group_id может не находить группу, если она не связана с каналом "по-правильному".

    чекни discussion, get_discussion_group_id исправь чтобы в случае отсутствия поля discussion в channel_info он сначала искал сообщения с комментом именно в канале, а потом уже брал id из reply_to_msg_id если нет группы, но есть комменты в канале, попробуй получить id канала, куда коммент был отправлен.

    переведи эти правки в код и проверь, если всё заведётся, то готов выслать тебе свои реквизиты
     
Top
Загрузка...