簡體   English   中英

(discord.py) 如何讓我的機器人讀取發送給它的 DM 並打印它們或將它們發送到特定頻道

[英](discord.py) How do I get my bot to read DM's that are sent to it and either print them or send them to a specific channel

所以我最近創建了一個帶有各種 meme 命令和調節命令的 discord bot。 我對 python 比較陌生,但我了解它的要點。 我已經創建了一個命令,讓我(只有我)可以通過機器人向用戶發送消息。 我現在想嘗試讓機器人能夠讀取發回給它的消息並將它們發送給我,無論是打印在 shell 中還是發送到特定的頻道/我我不在乎,我只想能夠看到發送給它的內容。 我做了一些閱讀並找到了這個,然后我收集了這個:

@bot.event
async def on_message(message):
    channel = bot.get_channel('channel ID')
    if message.server is None and message.author != bot.user:
        await bot.send_message(channel, message.content)
    await bot.process_commands(message)

僅此一項對我不起作用,當我對機器人進行 DM 處理時,我收到一條錯誤消息,指出“AttributeError: 'Message' 對象沒有屬性 'server'”。 有人告訴我 discord.py 重寫不使用“服務器”,而是“公會”。 所以我把它改成message.guild。 從那里它給了我錯誤“AttributeError:'Bot'對象沒有屬性'send_message'”,這就是我到達那里的程度。 我已經修補了它,並在這里和那里改變了一些東西,並取得了一些小小的進步......我想。 我的新代碼是:

@bot.event
async def on_message(ctx, message):
    channel = bot.get_channel('channel ID')
    if message.guild is None and message.author != bot.user:
        await ctx.send(channel, message.content)
    await bot.process_commands(message)

這給了我錯誤“TypeError:on_message() 缺少 1 個必需的位置參數:'message'”。 這就是我現在所得到的。 任何幫助將不勝感激,正如我所說,我對 python 還是有點陌生​​,我大約 2 個月前才開始使用它。

您正在使用 ctx 參數,它是命令獨有的。

'ctx' 是 commands.Context,它提供有關已執行命令的信息。 由於這不是命令,而是事件,因此您不應提供它。

未經測試,但這應該可以解決問題:

(我這樣做是為了忽略來自所有機器人的消息,以避免垃圾郵件)

用於將消息打印到控制台

@bot.event
async def on_message(message: discord.Message):
    if message.guild is None and not message.author.bot:
        print(message.content)
    await bot.process_commands(message)

用於將消息內容轉儲到通道

msg_dump_channel = 1234
@bot.event
async def on_message(message: discord.Message):
    channel = bot.get_channel(msg_dump_channel)
    if message.guild is None and not message.author.bot:
        # if the channel is public at all, make sure to sanitize this first
        await channel.send(message.content)
    await bot.process_commands(message)

您的第一個代碼使用的是古老、過時且不受支持的 dpy 版本。

除了on_message事件等少數錯誤外,您在第二個代碼中大部分都正確更新了它。

它不起作用,因為它只需要一個參數message ,在該事件中沒有ctx

所以事件傳遞了一個參數,但你的函數需要 2 因此錯誤。 正確的代碼是: async def on_message(message):

但現在你會困惑如何處理你寫的這一行: await ctx.send(channel, message.content)

即使ctx存在,這也不起作用,因為 send 不再接受目的地,而是在目的地destination.send("Hello")上調用 send,因此如果channel是您要發送的位置,則將其轉換為您的代碼將是await channel.send(message.content)

還有最后一個注意事項,我注意到您在這里使用了字符串: bot.get_channel('channel ID')這可能是您只是舉例,但請記住ID 是 ints ,如果您傳遞字符串,它將永遠找不到該頻道。

例如這是無效的bot.get_channel('123456789111315178')

這將是有效的: bot.get_channel(123456789111315178)

基於該錯誤,我會說您可能會在某個時候調用 on_message() 而沒有提供message參數。 查看您的代碼,看看是否可能是這種情況。

或者,如果是您尚未編寫的其他一些代碼正在調用您的函數,那么它可能只使用一個參數調用 on_message(),在這種情況下,ctx 參數可能與該函數不兼容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM