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

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

Регистрация
23 Апр 2013
Сообщения
64
Репутация
0
Спасибо
1
Монет
0
здравствуйте такая проблема мой код почему то не может найти @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)

помогите пожалуйста!
 
Регистрация
16 Ноя 2012
Сообщения
71
Репутация
0
Спасибо
0
Монет
0
Потому что надо мозгом думать, а не через нейросеть писать
 
Регистрация
6 Дек 2013
Сообщения
83
Репутация
0
Спасибо
0
Монет
0
Давайте разберемся с вашей проблемой. Ошибка возникает потому, что метод `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`, прежде чем выполнить команду мьютинга.
 
Регистрация
24 Ноя 2013
Сообщения
81
Репутация
0
Спасибо
0
Монет
0
user = bot.get_chat_member(chat_id, username) Этот метод не принимает usename, только user_id. Из-за этого ошибка

Вообще, странное решение выдавать мут по username. А что делать, если у пользователя его нет?
 
Сверху Снизу