но когда я пишу /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
код
import telebot
import logging
# Настройка логирования
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
# Замените 'YOUR_TOKEN' на токен вашего бота
API_TOKEN = ''
bot = telebot.TeleBot(API_TOKEN)
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}"
Давайте разберемся с вашей проблемой. Ошибка возникает потому, что метод `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`, прежде чем выполнить команду мьютинга.