@AndreiRonnie

Как исправить AuthKeyUnregisteredError в телеграм боте?

Есть телеграм бот с таким кодом для копирования сообщений из одного канала в другой, работающий в telethon. При запуске заходит нормально, делает пару копирований, а затем выдает ошибку "ERROR - Ошибка AuthKeyUnregistered: The key is not registered in the system (caused by GetHistoryRequest)". С чем это может быть связано? С неправильным кодом или сессия завершается из-за нарушения лимитов работы с API? Заранее очень признателен за любой ответ или совет.

import logging
from telethon import TelegramClient, events
import asyncio
import json
import random
import datetime
from telethon.errors.rpcerrorlist import AuthKeyUnregisteredError, FloodWaitError

# Настройка подробного логирования
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

# Ваши данные авторизации из my.telegram.org
api_id = '****'
api_hash = '****'

# ID канала-источника и канала-получателя
source_channel = '@****'
target_channel = '@****'

# Указание конкретного пути для файла сессии
session_file_path = r'C:\Users\andre\Desktop\Боты тг\session_name'
client = TelegramClient(session_file_path, api_id, api_hash)

# Файл для хранения ID последнего обработанного сообщения
last_message_id_file = 'last_message_id.json'

# Задержка между запросами
API_REQUEST_DELAY = 10 # в секундах

def load_last_message_id():
try:
with open(last_message_id_file, 'r') as file:
data = json.load(file)
return data.get(source_channel)
except (FileNotFoundError, json.JSONDecodeError):
logger.warning('Не удалось загрузить последний ID сообщения, начинаем с начала.')
return None

def save_last_message_id(message_id):
try:
data = {source_channel: message_id}
with open(last_message_id_file, 'w') as file:
json.dump(data, file)
logger.info(f'Сохранен последний ID сообщения: {message_id}')
except Exception as e:
logger.error(f'Ошибка при сохранении последнего ID сообщения: {e}')

async def check_and_forward_messages():
last_message_id = load_last_message_id()
try:
async for message in client.iter_messages(source_channel, reverse=True):
if not message.text or (last_message_id and message.id <= last_message_id):
continue
logger.info(f'Пересылка сообщения с ID {message.id}')
await asyncio.sleep(random.randint(1, 10)) # Добавляем случайную задержку
await client.send_message(target_channel, message)
save_last_message_id(message.id)
await asyncio.sleep(API_REQUEST_DELAY) # Добавляем задержку между запросами
except FloodWaitError as e:
logger.error(f'Ошибка FloodWait: {e}')
await asyncio.sleep(e.seconds + 5) # Добавляем к ожиданию немного времени
await check_and_forward_messages() # Повторяем попытку после ожидания
except AuthKeyUnregisteredError as e:
logger.error(f'Ошибка AuthKeyUnregistered: {e}')
logger.info('Повторная попытка подключения...')
await client.reconnect()
await check_and_forward_messages() # Повторяем попытку после переподключения
except Exception as e:
logger.error(f'Ошибка при получении сообщений: {e}')

async def main():
try:
logger.info("Попытка запуска клиента...")
await client.start()
logger.info("Клиент успешно запущен")
while True:
try:
current_hour = datetime.datetime.now().hour
if 8 <= current_hour < 22:
await check_and_forward_messages()
await asyncio.sleep(random.randint(60, 180)) # Рандомизация интервала проверки
except Exception as e:
logger.error(f'Ошибка: {e}')
await asyncio.sleep(10)
except Exception as e:
logger.error(f'Ошибка при запуске клиента: {e}')
return # Выход из функции в случае ошибки

if __name__ == '__main__':
client.loop.run_until_complete(main())
  • Вопрос задан
  • 417 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы