Загрузка...

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

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

Загрузка...
  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
    Так везде авторизация одна и та же, в доках почитай
     
Top
JavaScript error: