bot.get_user(id) стал возвращать "None". Раньше все работало

Буквально 2 недели назад, данный ниже код работал. То есть, я пишу в чат "!status id_пользователя", а затем, бот возвращает в консоль его ник и тег в формате "имя_пользователя#0000".

Сейчас, при запуске этого же кода, какой id я не укажу, бот всегда возвращает None в консоль. При этом не поменялось ничего вообще, пользователи не меняли ник (хоть от этого и не зависит id) и уж тем более не удаляли свой аккаунт. В чем может быть проблема?

@bot.command()
async def status(ctx, arg):
    user = bot.get_user(int(arg))
    print(user)

Ответы (1 шт):

Автор решения: denisnumb

Итак, более-менее разобравшись в проблеме готов помочь тем, кто столкнулся или еще столкнется с подобной проблемой в дискорде. А таких будет много :)

Причина по которой произошел сбой в работе моего кода:

Шлюз был обновлен несколько дней назад и теперь вам нужно добавлять намерения для работы бота

Грубо говоря, вышло обновление, немного изменившее принцип работы дискорд-бота.

Как устранить проблему:

Поняв, что проблема определенно не в коде, обратился в поддержку дискорда: моя заявка. Там мне сообщили, что для восстановления работы бота я должен выдать ему необходимые намерения. Какие конкретно нужны, я еще не разобрался, поэтому пока что выдал вообще все. Делается это так:

Обновляем библиотеку: pip install --upgrade discord.py

# объявляем намерения. all() означает, что выдаем все
intents = discord.Intents.all()

# при определении бота и его префикса, определяем также намерения
bot = commands.Bot(command_prefix='!', intents=intents)

Дополнительно:

Подробнее об это можно почитать здесь. Данную ссылку мне дали в поддержке. Всем удачи, надеюсь не придется искать решение проблемы также долго как мне :)


Также можно оформить данный код так, чтобы он работал без выдачи намерений. Вместо get_user() использовать await fetch_user().

@bot.command()
async def status(ctx, arg):
    user = await bot.fetch_user(int(arg))
    print(user)
→ Ссылка