Discord.py 机器人不在线,但仍然有效

Discord.py Bot is not online, but still works

我的 discord 机器人有问题,每当我 运行 下面的代码使用 apraw 获取 subreddit 上最近提交的标题时,机器人不再在线但仍然 returns CMD 中的标题:

  1. 当我执行此命令时 Bot 不在线,但仍然要求提供 subreddit 名称并在 CMD 中打印 subreddit 的新帖子的标题:
import asyncio
import apraw
from discord.ext import commands

bot = commands.Bot(command_prefix = '?')

@bot.event
async def on_ready():
    print('Bot is ready')
    await bot.change_presence(status=discord.Status.online, activity=discord.Game('?'))

@bot.command()
async def online (ctx):
    await ctx.send('Bot is online !')

reddit = apraw.Reddit(client_id = "CLIENT_ID",
                      client_secret = "CLIENT_SECRET",
                      password = "PASSWORD",
                      user_agent = "pythonpraw",
                      username = "LittleBigOwl")

@bot.event
async def scan_posts():
    xsub = str(input('Enter subreddit name : '))
    subreddit = await reddit.subreddit(xsub)
    async for submission in subreddit.new.stream():
        print(submission.title)

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(scan_posts())


bot.run('TOKEN')
  1. 但是当我执行这个时在线但显然不要求子名称...:[=​​21=]
import asyncio
import apraw
from discord.ext import commands

bot = commands.Bot(command_prefix = '?')

@bot.event
async def on_ready():
    print('Bot is ready')
    await bot.change_presence(status=discord.Status.online, activity=discord.Game('?'))

@bot.command()
async def online (ctx):
    await ctx.send('Bot is online !')


bot.run('TOKEN')

所以 reddit 就是问题所在。但是,为了让我的机器人在线显示,同时仍然能够在给定的 subreddit 上检索新提交的标题,我需要做哪些具体更改?代码没有 return 任何错误:/

你把async def scan_posts():上面的@bot.event改成@bot.command()。它会自行触发,因为您的代码中有这个:

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(scan_posts())

这就是导致 scan_posts 自动变为 运行 的原因。您应该删除它,因为您希望 scan_posts 成为机器人命令而不是自动发生的事情。由于这段代码,机器人也没有上线。它所做的是检查此文件是否已 运行 然后 运行s scan_posts。其余代码不会被触发。 另外,你不应该改变 on_ready 中的状态,因为 Discord 很有可能在 on_ready 事件期间完全断开你的连接,你无法阻止它。相反,您可以在 commands.Bot 中使用 activitystatus kwargs,例如:

bot = commands.Bot(command_prefix = '?', status=discord.Status.online, activity=discord.Game('?'))