Ошибка "Could not find the input entity for PeerUser" возникает, когда Telethon не может получить полную информацию о пользователе только по его ID. Это нормальная ситуация при работе с большими списками пользователей и может происходить по нескольким причинам:
Нужно модифицировать код, чтобы он корректно обрабатывал такие ошибки и продолжал работу. Вот улучшенная версия части кода, отвечающей за получение информации о пользователях:
# Получаем пользователей из Telegram по их ID
all_participants = []
print("Получение информации о пользователях из Telegram...")
# Если используем файл из конфига, получаем только пользователей со статусом "не написали"
users_to_process = users_manager.get_users_with_status(users_from_file, 'не написали') if use_file else list(users_from_file.keys())
total_users = len(users_to_process)
print(f"Всего пользователей для обработки: {total_users}")
# Обрабатываем пользователей пакетами для оптимизации
batch_size = 100
for i in range(0, total_users, batch_size):
batch = users_to_process[i:i+batch_size]
print(f"Обработка пакета {i//batch_size + 1}/{(total_users + batch_size - 1)//batch_size}...")
for user_id in batch:
try:
# Пробуем получить пользователя по ID
user = await client.get_entity(int(user_id))
all_participants.append(user)
print(f"✓ Получена информация о пользователе {user.username or user.id}")
except ValueError as e:
# Ошибка "Could not find the input entity"
print(f"⚠️ Не удалось получить информацию о пользователе {user_id}: {e}")
error_count += 1
# Помечаем пользователя как недоступного в базе данных
if str(user_id) in users_from_file:
users_from_file[str(user_id)]['status'] = 'недоступен'
except Exception as e:
print(f"❌ Ошибка при получении информации о пользователе {user_id}: {e}")
error_count += 1
# Сохраняем промежуточные результаты
users_manager.save_users_data(chat_id, users_from_file, custom_filename)
# Небольшая пауза между пакетами, чтобы избежать ограничений API
await asyncio.sleep(2)# В цикле обработки пользователей
for user_id_str in batch:
try:
user_data = users_from_file[user_id_str]
username = user_data.get('username')
# Если есть username, используем его вместо ID
if username and username != "Нет username":
try:
user = await client.get_entity(username)
all_participants.append(user)
continue
except:
# Если не удалось по username, пробуем по ID
pass
# Пробуем получить по ID
user = await client.get_entity(int(user_id_str))
all_participants.append(user)
except Exception as e:
print(f"Не удалось получить информацию о пользователе {user_id_str}: {e}")
error_count += 1# Вместо получения всех пользователей заранее, отправляем сообщения сразу
for user_id_str in users_to_process:
try:
# Пробуем отправить сообщение напрямую по ID
await client.send_message(int(user_id_str), config.MESSAGE_TEXT)
print(f"Сообщение отправлено пользователю {user_id_str}")
# Обновляем статус пользователя
users_from_file = users_manager.update_user_status(users_from_file, int(user_id_str))
sent_count += 1
except Exception as e:
print(f"Не удалось отправить сообщение пользователю {user_id_str}: {e}")
error_count += 1
# Помечаем пользователя как недоступного
if user_id_str in users_from_file:
users_from_file[user_id_str]['status'] = 'недоступен'
# Периодически сохраняем данные
if (sent_count + error_count) % config.SAVE_INTERVAL == 0:
users_manager.save_users_data(chat_id, users_from_file, custom_filename)
await asyncio.sleep(config.DELAY) # Задержка между сообщениямиЭти изменения должны помочь вашему скрипту корректно обрабатывать ситуации, когда не удается получить информацию о пользователе, и продолжать работу с остальными пользователями.
далось отправить сообщение пользователю rustufil: A wait of 446 seconds is required (caused by SendMessageRequest)
Не удалось отправить сообщение пользователю PyccMEHT: A wait of 446 seconds is required (caused by SendMessageRequest)
Не удалось отправить сообщение пользователю eeesss95: A wait of 446 seconds is required (caused by SendMessageRequest)
Не удалось отправить сообщение пользователю Markeshiik: A wait of 446 seconds is required (caused by SendMessageRequest)
Не удалось отправить сообщение пользователю JeLaim3: A wait of 446 seconds is required (caused by SendMessageRequest)
Не удалось отправить сообщение пользователю Poori8D: A wait of 446 seconds is required (caused by SendMessageRequest)
Не удалось отправить сообщение пользователю Aavisav: A wait of 446 seconds is required (caused by SendMessageRequest)
Не удалось отправить сообщение пользователю Mahdi483: A wait of 446 seconds is required (caused by SendMessageRequest)
Не удалось отправить сообщение пользователю polinkamissvlgulucshechemkozhok: A wait of 446 seconds is required (caused by SendMessageRequest)
Не удалось отправить сообщение пользователю 6642972421: A wait of 446 seconds is required (caused by SendMessageRequest)
Не удалось отправить сообщение пользователю kyniwomen2007: A wait of 446 seconds is required (caused by SendMessageRequest)
Не удалось отправить сообщение пользователю zenlg: A wait of 446 seconds is required (caused by SendMessageRequest)
Не удалось отправить сообщение пользователю psychosdvg: A wait of 446 seconds is required (caused by SendMessageRequest)
Не удалось отправить сообщение пользователю zalami_nft: A wait of 446 seconds is required (caused by SendMessageRequest)
Не удалось отправить сообщение пользователю HaxeIOG: A wait of 446 seconds is required (caused by SendMessageRequest)
Не удалось отправить сообщение пользователю grindzadza: A wait of 446 seconds is required (caused by SendMessageRequest)
Данные сохранены в файлы users_2429074478.json и users_2429074478.txt
Рассылка завершена!
Отправлено: 17
Пропущено: 0
Ошибок: 10847
Всего пользователей в базе: 10875
Также ошибка с ожиданием, если есть задержка то пусть не отключается сразу, и надо чтобы он всем пользователям отписал, поэтому отправь мне исправленный код main.py
Вот исправленный код main.py, который корректно обрабатывает ограничения по времени и продолжает работу после ожидания:
from telethon import TelegramClient, errors
import asyncio
import os
import re
import time
from datetime import datetime
import config
from users_manager import UsersManager
# Инициализация менеджера пользователей
users_manager = UsersManager()
async def main():
# Удаляем файл сессии, если он существует и настройка включена
session_file_path = config.SESSION_FILE + '.session'
if config.DELETE_OLD_SESSION and os.path.exists(session_file_path):
try:
os.remove(session_file_path)
print("Старая сессия удалена.")
except PermissionError:
print("Не удалось удалить старую сессию из-за отсутствия прав. Продолжаем с существующей сессией.")
except Exception as e:
print(f"Ошибка при удалении сессии: {e}. Продолжаем с существующей сессией.")
# Создаем клиент Telegram
client = TelegramClient(config.SESSION_FILE, config.API_ID, config.API_HASH)
# Подключаемся к Telegram
print("Запуск авторизации...")
await client.start(phone=config.PHONE_NUMBER)
print("Клиент успешно авторизован!")
# Проверяем, указан ли файл с участниками в конфиге
use_file = False
custom_filename = None
users_from_file = None
if config.DEFAULT_CHAT_FILE and os.path.exists(config.DEFAULT_CHAT_FILE):
use_file = True
custom_filename = config.DEFAULT_CHAT_FILE
# Определяем формат файла (JSON или TXT)
if custom_filename.endswith('.json'):
users_from_file = users_manager.load_users_data(custom_filename.split('_')[1].split('.')[0])
else:
users_from_file = users_manager.load_users_from_txt(custom_filename)
if users_from_file:
print(f"Загружено {len(users_from_file)} пользователей из файла {custom_filename}")
# Получаем список пользователей со статусом "не написали"
users_to_message = users_manager.get_users_with_status(users_from_file, 'не написали')
print(f"Из них {len(users_to_message)} пользователей со статусом 'не написали'")
else:
print("Ошибка при чтении файла. Будет запрошена ссылка на чат.")
use_file = False
# Если не используем файл из конфига, запрашиваем ссылку на чат
if not use_file:
chat_link = input("Введите ссылку на чат: ")
try:
# Получаем объект чата
chat = await client.get_entity(chat_link)
print(f"Чат найден: {chat.title}")
chat_id = chat.id
# Загружаем данные о пользователях
users_data = users_manager.load_users_data(chat_id)
# Используем iter_participants для получения участников
all_participants = []
print("Получение списка участников чата...")
async for user in client.iter_participants(chat):
all_participants.append(user)
users_data = users_manager.add_user_to_data(users_data, user)
print(f"Найдено {len(all_participants)} участников.")
# Сохраняем обновленный список пользователей
custom_filename = users_manager.save_users_data(chat_id, users_data)
# Теперь используем этот файл для рассылки
users_from_file = users_data
use_file = True
except Exception as e:
print(f"Произошла ошибка при получении участников чата: {e}")
return
else:
# Используем данные из файла
chat_id = users_manager.extract_chat_id_from_filename(custom_filename)
# Счетчики для статистики
sent_count = 0
skipped_count = 0
error_count = 0
flood_wait_count = 0
# Получаем пользователей со статусом "не написали"
users_to_process = users_manager.get_users_with_status(users_from_file, 'не написали')
total_users = len(users_to_process)
print(f"Всего пользователей для обработки: {total_users}")
# Отправляем сообщение каждому участнику
print(f"\nНачинаем рассылку сообщений...")
# Индекс текущего пользователя для возможности продолжения после ожидания
current_index = 0
while current_index < len(users_to_process):
user_id_str = users_to_process[current_index]
try:
# Получаем данные пользователя
user_data = users_from_file[user_id_str]
username = user_data.get('username', 'Нет username')
# Пробуем отправить сообщение
try:
# Сначала пробуем по username, если он есть
if username and username != "Нет username":
await client.send_message(username, config.MESSAGE_TEXT)
print(f"✅ Сообщение отправлено пользователю {username}")
else:
# Если нет username, пробуем по ID
await client.send_message(int(user_id_str), config.MESSAGE_TEXT)
print(f"✅ Сообщение отправлено пользователю ID:{user_id_str}")
# Обновляем статус пользователя
users_from_file = users_manager.update_user_status(users_from_file, user_id_str)
# Увеличиваем счетчик отправленных
sent_count += 1
except errors.FloodWaitError as e:
# Обрабатываем ограничение по времени
wait_time = e.seconds
flood_wait_count += 1
print(f"\n⏳ Достигнут лимит отправки сообщений. Ожидание {wait_time} секунд...")
print(f"Текущий прогресс: отправлено {sent_count} из {total_users}")
# Сохраняем текущий прогресс
users_manager.save_users_data(chat_id, users_from_file, custom_filename)
# Ожидаем указанное время + 10 секунд для надежности
for i in range(wait_time + 10, 0, -1):
if i % 60 == 0 or i <= 10:
print(f"⏳ Осталось ждать {i} секунд...")
await asyncio.sleep(1)
print("⏳ Ожидание завершено, продолжаем отправку...")
# Не увеличиваем индекс, чтобы повторить попытку с тем же пользователем
continue
except Exception as e:
# Другие ошибки при отправке
print(f"❌ Не удалось отправить сообщение пользователю {username or user_id_str}: {e}")
error_count += 1
# Если это не ошибка ограничения, помечаем пользователя как недоступного
if "wait of" not in str(e).lower():
users_from_file[user_id_str]['status'] = 'ошибка'
users_from_file[user_id_str]['error'] = str(e)
except Exception as e:
print(f"❌ Ошибка при обработке пользователя {user_id_str}: {e}")
error_count += 1
# Увеличиваем индекс для перехода к следующему пользователю
current_index += 1
# Периодически сохраняем данные
if current_index % config.SAVE_INTERVAL == 0 or sent_count % config.SAVE_INTERVAL == 0:
users_manager.save_users_data(chat_id, users_from_file, custom_filename)
print(f"💾 Прогресс сохранен. Обработано {current_index}/{total_users}, отправлено {sent_count}")
# Задержка между сообщениями для избежания ограничений
await asyncio.sleep(config.DELAY)
# Сохраняем финальные данные
users_manager.save_users_data(chat_id, users_from_file, custom_filename)
print("\nРассылка завершена!")
print(f"Отправлено: {sent_count}")
print(f"Пропущено: {skipped_count}")
print(f"Ошибок: {error_count}")
print(f"Ограничений по времени: {flood_wait_count}")
print(f"Всего пользователей в базе: {len(users_from_file)}")
# Обновляем DEFAULT_CHAT_FILE в конфиге, если он не был указан
if not config.DEFAULT_CHAT_FILE and custom_filename:
print(f"\nДля автоматической работы в будущем, добавьте в config.py строку:")
print(f"DEFAULT_CHAT_FILE = \"{custom_filename}\"")
# Корректно закрываем клиент
await client.disconnect()
if __name__ == "__main__":
try:
# Запуск клиента
asyncio.run(main())
except KeyboardInterrupt:
print("\n\nРабота программы прервана пользователем.")
print("Для продолжения рассылки запустите программу снова.")
except Exception as e:
print(f"\n\nПроизошла критическая ошибка: {e}")
print("Для продолжения рассылки запустите программу снова.")Этот код должен корректно обрабатывать ограничения Telegram API и продолжать работу после ожидания, а также обеспечивать сохранение прогресса для возможности продолжения рассылки в случае прерывания.
Проанализируй данный код, изучи его логику и все остальное.
Наблюдается пару изменений и ошибок
Медленный анализ и баги.
При попытке анализа, пользователь подтверждает трату запроса на анализ чата и с некоторых списывает не 1 запрос а сразу несколько, исправь эту ошибку.
А также странная нагрузка, из за нее у некоторых не работает команда /start и бот зависает, сделай так чтобы нагрузка распределялась среди 3-х аккаунтов, если 1 аккаунт нагружен одним анализом, то следующий анализ пользователя переходит ра другой аккаунт чтобы работа шла быстрее и очередь более быстрее продвигалась
Также оптимизируй чтобы бот не засорял чат.
Повысь скорость анализа и чтобы бот перезапускался при каждой сильной нагрузке которая не позволяет прописать /start и получить ответ