Discord.py 机器人不在线,但仍然有效
Discord.py Bot is not online, but still works
我的 discord 机器人有问题,每当我 运行 下面的代码使用 apraw 获取 subreddit 上最近提交的标题时,机器人不再在线但仍然 returns CMD 中的标题:
- 当我执行此命令时 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')
- 但是当我执行这个时在线但显然不要求子名称...:[=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
中使用 activity
和 status
kwargs,例如:
bot = commands.Bot(command_prefix = '?', status=discord.Status.online, activity=discord.Game('?'))
我的 discord 机器人有问题,每当我 运行 下面的代码使用 apraw 获取 subreddit 上最近提交的标题时,机器人不再在线但仍然 returns CMD 中的标题:
- 当我执行此命令时 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')
- 但是当我执行这个时在线但显然不要求子名称...:[=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
中使用 activity
和 status
kwargs,例如:
bot = commands.Bot(command_prefix = '?', status=discord.Status.online, activity=discord.Game('?'))