Загрузка...

Как сделать авторизацию клиента telethon для нейрокомментинга?

Тема в разделе Python создана пользователем Ларензик 9 фев 2025. 95 просмотров

  1. Ларензик
    Ларензик Автор темы 9 фев 2025 0 27 дек 2022
    ПРивет, есть код:


    Python
    import asyncio
    import logging
    import random
    import os
    from telethon import TelegramClient
    from telethon.sessions import StringSession
    from openai import OpenAI
    from config import API_ID, API_HASH, OPENAI_API_KEY
    from database import Database

    # Настройка логирования
    logging.basicConfig(level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    filename='commentator.log',
    filemode='a')
    logger = logging.getLogger(__name__)

    # Добавляем вывод ***** в консоль
    console = logging.StreamHandler()
    console.setLevel(logging.INFO)
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    console.setFormatter(formatter)
    logger.addHandler(console)

    client = OpenAI(api_key=OPENAI_API_KEY)

    class TelegramCommentator:
    def __init__(self):
    self.db = Database()
    self.main_client = None
    logger.info("TelegramCommentator инициализирован")

    async def start(self):
    logger.info("Начало авторизации основного клиента")
    self.main_client = TelegramClient('main_session', API_ID, API_HASH)
    await self.main_client.start()
    logger.info("Основной клиент успешно авторизован")

    async def stop(self):
    if self.main_client:
    await self.main_client.disconnect()
    logger.info("Отключен основной клиент")
    logger.info("Скрипт завершен")

    async def generate_comment(self, post_text, user_settings):
    logger.info("Начало генерации комментария")
    try:
    tone = user_settings.get('tone', 'нейтральный')
    length = user_settings.get('length', 'средний')
    themes = ', '.join(user_settings.get('themes', [])) or "любая тема"

    prompt = f"Вы {tone} комментатор. Напишите {length} комментарий на тему {themes} к следующему посту: {post_text}. Внимание! Вы должны общаться как живой человек, не иметь банальных, странных ответов, ваша цель - чтобы люди не поняли что вы робот."

    response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
    {"role": "system", "content": prompt},
    {"role": "user", "content": post_text}
    ],
    max_tokens=170,
    temperature=0.7,
    n=1
    )

    if response.choices and response.choices[0].message.content.strip():
    comment = response.choices[0].message.content.strip()

    # Проверка на стоп-слова
    if any(word in comment.lower() for word in user_settings.get('stop_words', [])):
    logger.warning(f"Комментарий содержит стоп-слово: {comment}")
    return None

    logger.info(f"Сгенерирован комментарий: {comment}")
    return comment

    logger.warning("Не удалось сгенерировать комментарий")
    return None
    except Exception as e:
    logger.error(f"Ошибка при генерации комментария: {e}")
    return None

    async def get_user_client(self, account_data):
    if isinstance(account_data, str):
    if os.path.isdir(account_data):
    logger.info(f"Создание клиента из tdata директории: {account_data}")
    try:
    # Проверяем наличие tdata.session
    session_path = os.path.join(account_data, 'tdata.session')
    if os.path.exists(session_path):
    logger.info(f"Найден файл tdata.session, пробуем использовать его")
    client = TelegramClient(session_path, API_ID, API_HASH)
    else:
    logger.info(f"Файл tdata.session не найден, используем стандартный путь к tdata")
    client = TelegramClient(os.path.join(account_data), API_ID, API_HASH)

    await client.connect()

    try:
    if await client.is_user_authorized():
    logger.info(f"Клиент успешно авторизован из директории: {account_data}")
    me = await client.get_me()
    logger.info(f"Авторизован как: {me.username if me else 'Неизвестный пользователь'}")
    return client
    else:
    logger.warning(f"Клиент не авторизован из директории: {account_data}")
    await client.disconnect()
    return None
    except Exception as e:
    logger.error(f"Ошибка при проверке авторизации: {str(e)}")
    await client.disconnect()
    return None

    except Exception as e:
    logger.error(f"Ошибка при создании клиента из директории {account_data}: {str(e)}")
    return None


    async def write_comments_in_telegram(self):
    logger.info("Начало процесса написания комментариев")
    users = self.db.get_all_active_users()
    logger.info(f"Найдено активных пользователей: {len(users)}")
    for user in users:
    user_id, telegram_id, sub_type, max_comments, exp_date = user
    logger.info(f"Обработка пользователя: {user_id}, telegram_id: {telegram_id}")
    user_settings = self.db.get_user_settings(telegram_id)
    logger.info(f"Настройки пользователя: {user_settings}")
    safety_settings = self.db.get_safety_settings(telegram_id)
    logger.info(f"Настройки безопасности: {safety_settings}")

    accounts = self.db.get_user_accounts(telegram_id)
    if not accounts:
    logger.warning(f"Нет доступных аккаунтов для пользователя {user_id}")
    continue

    logger.info(f"Найдено аккаунтов для пользователя {user_id}: {len(accounts)}")

    channels = self.db.get_user_channels(telegram_id)
    logger.info(f"Найдено каналов для пользователя {user_id}: {len(channels)}")
    for channel_name, last_message_id in channels:
    try:
    logger.info(f"Обработка канала {channel_name} для пользователя {user_id}")
    channel_entity = await self.main_client.get_entity(channel_name)
    messages = await self.main_client.get_messages(channel_entity, limit=1)
    if messages and messages[0].id != last_message_id:
    post = messages[0]

    comment_count = self.db.get_comment_count_for_post(channel_name, post.id)
    if comment_count >= max_comments:
    logger.info(f"Достигнут лимит комментариев для поста {post.id} в канале {channel_name}")
    continue

    existing_comment = self.db.get_user_comment_for_post(user_id, channel_name, post.id)
    if existing_comment:
    logger.info(f"Пользователь {telegram_id} уже оставил комментарий к посту {post.id} в канале {channel_name}")
    continue

    comment = await self.generate_comment(post.raw_text, user_settings)
    if comment:
    delay = random.randint(user_settings.get('delay', [5, 30])[0], user_settings.get('delay', [5, 30])[1])
    logger.info(f"Ожидание {delay} секунд перед отправкой комментария")
    await asyncio.sleep(delay)

    # Перебираем все аккаунты пользователя, пока не найдем работающий
    for account_data in accounts:
    user_client = await self.get_user_client(account_data)
    try:
    await user_client.connect()
    if await user_client.is_user_authorized():
    await user_client.send_message(entity=channel_entity, message=comment, comment_to=post.id)
    logger.info(f"Комментарий отправлен в канал {channel_name} для пользователя {telegram_id}")
    self.db.add_comment(user_id, channel_name, post.id, comment)
    self.db.update_last_message_id(user_id, channel_name, post.id)
    break # Выходим из цикла, если комментарий успешно отправлен
    else:
    logger.warning(f"Аккаунт пользователя {telegram_id} не авторизован. Тип аккаунта: {type(account_data)}")
    except Exception as e:
    logger.error(f"Ошибка при отправке комментария: {e}")
    finally:
    await user_client.disconnect()
    else:
    logger.error(f"Не удалось отправить комментарий. Все аккаунты пользователя {telegram_id} не авторизованы")
    else:
    logger.info(f"Нет новых постов в канале {channel_name}")

    logger.info(f"Ожидание {user_settings.get('frequency', 1)} минут перед следующим каналом")
    await asyncio.sleep(user_settings.get('frequency', 1) * 60)
    except Exception as e:
    logger.error(f"Ошибка при обработке канала '{channel_name}' для пользователя {telegram_id}: {e}")
    logger.info("Завершение процесса написания комментариев")

    async def main():
    logger.info("Запуск основного цикла commentator.py")
    commentator = TelegramCommentator()
    await commentator.start()
    try:
    while True:
    logger.info("Начало итерации цикла")
    await commentator.write_comments_in_telegram()
    logger.info("Ожидание 5 минут перед следующей проверкой")
    await asyncio.sleep(300) # Проверка каждые 5 минут
    except KeyboardInterrupt:
    logger.info("Получен сигнал прерывания, завершение работы")
    finally:
    await commentator.stop()
    logger.info("Скрипт завершен")

    if __name__ == "__main__":
    asyncio.run(main())
    Но когда мы хотим заюзать tdata акк, выдает ошибку:

    Код
    2025-02-09 17:12:24,144 - __main__ - INFO - Создание клиента из tdata директории: tdata_6306428168_91d0b553-6ac2-4981-aa2a-799372b001a2/tdata
    2025-02-09 17:12:24,144 - __main__ - INFO - Найден файл tdata.session, пробуем использовать его
    2025-02-09 17:12:24,598 - __main__ - WARNING - Клиент не авторизован из директории: tdata_6306428168_91d0b553-6ac2-4981-aa2a-799372b001a2/tdata
    2025-02-09 17:12:24,603 - __main__ - ERROR - Ошибка при отправке комментария: 'NoneType' object has no attribute 'connect'
    2025-02-09 17:12:24,604 - __main__ - ERROR - Ошибка при обработке канала '@fsure09r' для пользователя 6306428168: 'NoneType' object has no attribute 'disconnect'
    че дел
     
  2. GIGABIT385
    GIGABIT385 25 мар 2025 16 20 май 2023
    Так везде авторизация одна и та же, в доках почитай
     
Загрузка...
Top