Frelinq
Знаток
(430),
на голосовании
3 месяца назад
здравствуйте такая проблема мой код почему то не может найти @username пользователя мой код создает команду /mute_user @username но когда я пишу /mute_user @username бот выдает такие ошибки
Чат тг: Не удалось получить User ID для @username.
журнал: INFO:__main__:Получаем user_id для username: @username, chat_id: -chatid ERROR:__main__:Ошибка при получении информации о пользователе: A request to the Telegram API was unsuccessful. Error code: 400. Description: Bad Request: invalid user_id specified
def get_user_id_by_username(username, chat_id): """Получает ID пользователя по его username, проверяя участников чата.""" username = username.lstrip('@') # Убираем символ @, если он есть logger.info(f"Получаем user_id для username: {username}, chat_id: {chat_id}")
try: # Получаем информацию о пользователе user = bot.get_chat_member(chat_id, username) if user.user.username == username: logger.info(f"Пользователь найден: {user.user.id}") return user.user.id else: logger.warning(f"Пользователь {username} не найден.")
except telebot.apihelper.ApiException as e: logger.error(f'Ошибка при получении информации о пользователе: {str(e)}')
return None
def mute_user(chat_id, user_id): """Замучивает пользователя в чате.""" try: bot.restrict_chat_member(chat_id, user_id, permissions=telebot.types.ChatPermissions(can_send_messages=False)) logger.info(f'Пользователь {user_id} замучен в чате {chat_id}.') except telebot.apihelper.ApiException as e: logger.error(f'Ошибка при замучивании пользователя: {str(e)}')
@bot.message_handler(commands=['mute_user']) def mute_user_command(message): """Обрабатывает команду /mute_user и замучивает пользователя по username.""" if len(message.text.split()) > 1: username = message.text.split()[1] # Получаем username из аргументов команды chat_id = message.chat.id # Получаем ID текущего чата user_id = get_user_id_by_username(username, chat_id)
if user_id: mute_user(chat_id, user_id) bot.reply_to(message, f'Пользователь {username} замучен.') else: bot.reply_to(message, f'Не удалось получить User ID для {username}.') else: bot.reply_to(message, 'Пожалуйста, укажите username пользователя.')
# Запуск бота if __name__ == '__main__': bot.polling(none_stop=True)
Давайте разберемся с вашей проблемой. Ошибка возникает потому, что метод `get_chat_member` ожидает получить идентификатор пользователя (`user_id`), а не имя пользователя (`username`). Вы передаете `username`, но функция пытается обработать его как `user_id`.
Для решения этой проблемы необходимо сначала получить `user_id` по `username`. Для этого можно воспользоваться методом `get_chat_members_count`, который возвращает список пользователей в чате. Затем мы можем пройтись по этому списку и найти нужного пользователя по его имени.
def get_user_id_by_username(username, chat_id): """Получает ID пользователя по его username, проверяя участников чата.""" username = username.lstrip('@') # Убираем символ @, если он есть logger.info(f"Получаем user_id для username: {username}, chat_id: {chat_id}")
try: # Получаем список участников чата members = bot.get_chat_members_count(chat_id)
for member in members['result']: if member['user']['username'] == username: logger.info(f"Пользователь найден: {member['user']['id']}") return member['user']['id']
logger.warning(f"Пользователь {username} не найден.")
except telebot.apihelper.ApiException as e: logger.error(f'Ошибка при получении информации о пользователе: {str(e)}')
return None
def mute_user(chat_id, user_id): """Замучивает пользователя в чате.""" try: bot.restrict_chat_member(chat_id, user_id, permissions=telebot.types.ChatPermissions(can_send_messages=False)) logger.info(f'Пользователь {user_id} замучен в чате {chat_id}.') except telebot.apihelper.ApiException as e: logger.error(f'Ошибка при замучивании пользователя: {str(e)}')
@bot.message_handler(commands=['mute_user']) def mute_user_command(message): """Обрабатывает команду /mute_user и замучивает пользователя по username.""" if len(message.text.split()) > 1: username = message.text.split()[1] # Получаем username из аргументов команды chat_id = message.chat.id # Получаем ID текущего чата user_id = get_user_id_by_username(username, chat_id)
if user_id: mute_user(chat_id, user_id) bot.reply_to(message, f'Пользователь {username} замучен.') else: bot.reply_to(message, f'Не удалось получить User ID для {username}.') else: bot.reply_to(message, 'Пожалуйста, укажите username пользователя.')
# Запуск бота if __name__ == '__main__': bot.polling(none_stop=True) ```
Теперь ваш бот будет искать пользователя по его имени и получать правильный `user_id`, прежде чем выполнить команду мьютинга.
мой код создает команду /mute_user @username
но когда я пишу /mute_user @username бот выдает такие ошибки помогите пожалуйста!