如何在不达到 Discord 的 1,000 个连接最大值的情况下运行从 API 更新的 Discord 机器人?



我构建了一个bot,它将bot的名称更新为Python中的价格。同样,机器人的状态也会更新为不同的价格。bot按预期工作了一段时间,但随后我从Discord收到以下消息:

显示您的bot "MY bot NAME"在短时间内连接到Discord超过1000次。由于这种行为通常是一个错误的结果,我们已经继续重置你的bot的令牌。

我的bot每15秒运行一次,在linux服务器上从shell脚本运行,这也会杀死在它之前运行的最后一个进程。我杀死前面的进程,这样它们就不会耗尽我的内存,导致我的服务器崩溃。

下面是我的代码:
#!/usr/bin/python
import discord
from discord.ext import commands
import requests
import json
import emoji
import sys
import asyncio
client = commands.Bot(command_prefix = '.')
url = 'URL FOR THE API'
price = requests.get(url)
rapid_gprice = price.json()['data']['price1']
standardp = price.json()['data']['price2']
@client.event
async def on_ready():
guild = client.get_guild(MY GUILD ID)
me = guild.me
await me.edit(nick=standardp)
activity = discord.Game(name=rapid_gprice)
await client.change_presence(status=discord.Status.online, activity=activity)
client.run('MY TOKEN')

我相当确定我需要在我的Python脚本中使用某种函数,该函数通过price api循环并相应地更新Discord bot,只需要运行Python脚本一次。

我很乐意提供你可能需要的任何额外信息。提前谢谢。

每15秒运行一次脚本是一个非常糟糕的主意,有一个内置的名为tasks的discord.py扩展,它允许您运行后台任务,因此得名。

from discord.ext import tasks
@tasks.loop(seconds=15)
async def change_nick(guild):
nick = # Get the nick here
await guild.me.edit(nick=nick)

@client.event
async def on_ready():
await client.wait_until_ready()
guild = client.get_guild(MY GUILD ID)
change_nick.start(guild)

我也看到你正在使用requests,这是一个阻塞库,我建议你使用aiohttp代替

查看任务介绍

这就是我如何解决我的问题。这可能是多余的代码,但它是有效的。请随时帮助我修改它,使其更有效:

#!/usr/bin/python
from discord.ext import tasks, commands
import aiohttp
import json
import asyncio
import discord
client = commands.Bot(command_prefix = '.')
url = 'THE API LINK I''M USING'
async def getPrice1():
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
response = await resp.json()
price1 = response['data']['priceZYX']
return price1
async def getPrice2():
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
response = await resp.json()
price2 = response['data']['priceXYZ']
return price2
@tasks.loop(seconds=7)
async def change_nick(guild):
nick = await getPrice1()
await guild.me.edit(nick=nick)
activity = discord.Game(name=await getPrice2())
await client.change_presence(status=discord.Status.online, activity=activity)
@client.event
async def on_ready():
await client.wait_until_ready()
guild = client.get_guild(MY GUILD ID)
change_nick.start(guild)

我得到了一个错误,试图实现价格数据(从url)到我的机器人的用户名。错误:discord.errors.HTTPException: 400 Bad Request(错误码:50035):Invalid Form Body在nick:无法解释"(现场价格)";作为字符串。

如果您有相同的问题(并且使用不和谐重写),请确保将(nick=nick)标记为字符串:

@tasks.loop(seconds=15)
async def change_nick(guild):
nick = await getPrice1()
await guild.me.edit(nick=str(nick))

PS:我相当新的编码,所以请纠正我,如果我错了,它为我工作。也感谢你的帖子,它帮助了我很多做我的机器人。

相关内容

  • 没有找到相关文章

最新更新