Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Python проблема с мутом для чат-бота в телеграмма

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
 код
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}")

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)
помогите пожалуйста!
Голосование за лучший ответ
Фуфлецо Фефлуцовыц Профи (520) 4 месяца назад
слишком сложно аааа
FrelinqЗнаток (430) 4 месяца назад
мало еще всего 70 строк
absolute Знаток (411) 4 месяца назад
Давайте разберемся с вашей проблемой. Ошибка возникает потому, что метод `get_chat_member` ожидает получить идентификатор пользователя (`user_id`), а не имя пользователя (`username`). Вы передаете `username`, но функция пытается обработать его как `user_id`.

Для решения этой проблемы необходимо сначала получить `user_id` по `username`. Для этого можно воспользоваться методом `get_chat_members_count`, который возвращает список пользователей в чате. Затем мы можем пройтись по этому списку и найти нужного пользователя по его имени.

Вот исправленный вариант кода:

```python
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}")

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`, прежде чем выполнить команду мьютинга.
FrelinqЗнаток (430) 4 месяца назад
тоже самое только вот уже в журнал пишеться число участников
Василий Ломоносов Знаток (297) 4 месяца назад
Потому что надо мозгом думать, а не через нейросеть писать
FrelinqЗнаток (430) 4 месяца назад
ну извините
Василий ЛомоносовЗнаток (297) 4 месяца назад
Извиняю
Frelinq Знаток (430) Василий Ломоносов, спасибо
CausonQ Мудрец (14159) 4 месяца назад
 user = bot.get_chat_member(chat_id, username)  
Этот метод не принимает usename, только user_id. Из-за этого ошибка

Вообще, странное решение выдавать мут по username. А что делать, если у пользователя его нет?
S.H.I. Оракул (73973) 4 месяца назад
Вместо bot.get_chat_member() для поиска user_id по username нужно использовать другой подход. Код с хранением user_id: https://pastebin.com/XUKEKnQg
FrelinqЗнаток (430) 4 месяца назад
бот не реагирует на команду теперь
Похожие вопросы