Discord 机器人停止通过 Heroku 工作,离线工作正常

Discord bot stopped working through Heroku, works fine offline

解决了!在下面回答。

编辑:清理此 post 以保持一切清晰。

这是一个简单的 GIF 机器人的代码。 重要的是:这个机器人离线工作,当我发送 ! 命令时给出一个 gif。这个机器人 与 Heroku 联机 ,所以这也很好。 工作是在机器人在线时发送命令以接收 gif。所以代码有效,但我无法通过在线模式下的命令使其进入工作状态。

代码

import random
import discord
import giphy_client
from discord.ext.commands import Bot
from giphy_client.rest import ApiException

discord_token = *hidden for Whosebug*

giphy_token = *hidden for Whosebug*

api_instance = giphy_client.DefaultApi()

def search_gifs(query):
    try:
        return api_instance.gifs_search_get(giphy_token, query, limit=100, rating = 'PG13')

    except ApiException as e:
        return "Exception when calling DefaultApi->gifs_search_get: %s\n" % e

def gif_response(emotion):
    gifs = search_gifs(emotion)
    lst = list(gifs.data)
    gif = random.choices(lst)

    return gif[0].url

class DiscordClient(discord.Client):
    async def on_ready(self):
        print("Login as")
        print(self.user)
        print("-------")

    async def on_message(self, message):

        if message.author != self.user:
            if message.content == '!vibe':
                await message.channel.send(gif_response('vibing'))
            if message.content == '!dragony':
                await message.channel.send(gif_response('dragon'))  
            if message.content == '!gm':
                await message.channel.send(gif_response('gm'))    

intents = discord.Intents(messages=True, guilds=True, guild_messages=True)
client = DiscordClient(intents=intents)
# client = DiscordClient()
client.run(discord_token)

需求文件 (requirements.txt)

git+https://github.com/Rapptz/discord.py
PyNaCl==1.3.0
dnspython==1.16.0
async-timeout==3.0.1
pandas
giphy_client==1.0.0

Procfile

worker: python gif_bot.py

部署时的日志

2022-04-21T11:46:39.000000+00:00 app[api]: Build started by user 
2022-04-21T11:47:14.667290+00:00 app[api]: Deploy x by user 
2022-04-21T11:47:14.667290+00:00 app[api]: Release v11 created by user 
2022-04-21T11:47:15.800842+00:00 heroku[worker.1]: State changed from crashed to starting
2022-04-21T11:47:21.019690+00:00 heroku[worker.1]: Starting process with command `python gif_bot.py`
2022-04-21T11:47:21.640978+00:00 heroku[worker.1]: State changed from starting to up
2022-04-21T11:47:25.392719+00:00 app[worker.1]: Login as
2022-04-21T11:47:25.392731+00:00 app[worker.1]: Gif Bot#8552
2022-04-21T11:47:25.392732+00:00 app[worker.1]: -------
2022-04-21T11:47:29.000000+00:00 app[api]: Build succeeded

对于较新版本的 discord,您需要传递您的意图。本质上告诉 discord 你将要使用什么事件和一些缓存内容。一个简单的思考方式就像你打算做什么或权限。

对于您的示例,请尝试以下操作

intents = discord.Intents.default()
intents.message_content = True

然后修复您的客户端以包含指定的意图

client = DiscordClient(intents=intents)

在这里阅读更多关于它们的信息:https://discordpy.readthedocs.io/en/stable/intents.html

注意:如果您打算做更复杂的事情,则必须添加更多意图。

@smerkd 帮我解答了!

在意图中添加“message_content = True”使其生效。

代码

intents = discord.Intents(messages=True, message_content=True, guilds=True, guild_messages=True)