Я создаю бота Discord, используя discord.py для обучения. Я хотел бы отправить пользователю личное сообщение, когда он покидает сервер, которому принадлежит бот.
Проблема
Отправка с помощью команды косой черты работает, а отправка с помощью on_member_remove() — нет. Возникает следующая ошибка.
Код: Выделить всё
Traceback (most recent call last):
File "C:\Users\my-name\OneDrive\Desktop\test-app\.venv\Lib\site-packages\discord\client.py", line 449, in _run_event
await coro(*args, **kwargs)
File "c:\Users\my-name\OneDrive\Desktop\test-app\test_cog.py", line 11, in on_member_remove
await self.send_farewell_dm(member)
File "c:\Users\my-name\OneDrive\Desktop\test-app\test_cog.py", line 15, in send_farewell_dm
await dm_channel.send("See you!")
File "C:\Users\my-name\OneDrive\Desktop\test-app\.venv\Lib\site-packages\discord\abc.py", line 1618, in send
data = await state.http.send_message(channel.id, params=params)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\my-name\OneDrive\Desktop\test-app\.venv\Lib\site-packages\discord\http.py", line 752, in request
raise Forbidden(response, data)
discord.errors.Forbidden: 403 Forbidden (error code: 50007): Cannot send messages to this user
test_main.py
Код: Выделить всё
from test_bot import TestBot
def run() -> None:
bot = TestBot()
@bot.event
async def on_ready() -> None:
#load a cog file
await bot.load_extension("test_cog")
#Enable slash commands
guild = bot.get_guild(123456789012345678) # dummy
bot.tree.copy_global_to(guild=guild)
await bot.tree.sync(guild=guild)
bot.run("DICORD_BOT_TOKEN", root_logger=True)
if __name__ == "__main__":
run()
Код: Выделить всё
import discord
from discord.ext import commands
class TestBot(commands.Bot):
def __init__(self) -> None:
super().__init__(
command_prefix = "!",
intents = discord.Intents.all(),
application_id = 987654321098765 # dummy
)
Код: Выделить всё
import discord
from discord import app_commands
from discord.ext import commands
class TestCog(commands.Cog):
def __init__(self, bot:commands.Bot) -> None:
self.bot = bot
# Forbidden Error!
@commands.Cog.listener()
async def on_member_remove(self, member:discord.Member) -> None:
await self.send_farewell_dm(member)
async def send_farewell_dm(self, member:discord.Member) -> None:
dm_channel = await member.create_dm()
await dm_channel.send("See you!")
# Success
@app_commands.command()
async def send_hello_dm(self, interaction:discord.Interaction) -> None:
dm_channel = await interaction.user.create_dm()
await dm_channel.send("Hello!")
async def setup(bot: commands.Bot) -> None:
await bot.add_cog(TestCog(bot))
- Windows 11
- VS Code
- Python 3.12.5
- virtualenv 20.26.5
Код: Выделить всё
Package Version
------------------ -------
aiohappyeyeballs 2.4.1
aiohttp 3.10.6
aiosignal 1.3.1
async-timeout 4.0.3
attrs 24.2.0
charset-normalizer 3.3.2
discord.py 2.4.0
frozenlist 1.4.1
idna 3.10
multidict 6.1.0
peewee 3.17.6
pillow 10.4.0
pip 24.2
python-dotenv 1.0.1
yarl 1.12.1
Конфиденциальность и безопасность Discord
Я проверил мои настройки приложения Discord. Кажется, все в порядке.Снимок экрана моей конфиденциальности и безопасности
Отправьте личное сообщение нескольким пользователям
Я попробовал отправить личное сообщение на 3 Discord учетные записи с помощью on_member_remove(). Только один из них получил его благополучно. Другие этого не сделали. Произошла ошибка.Буду признателен, если кто-нибудь поможет мне устранить ошибку.
Подробнее здесь: https://stackoverflow.com/questions/790 ... ord-errors