我正在创建一个显示比特币统计数据的机器人。该机器人每 3 秒将其事件更改为比特币统计数据。但在某些时候,机器人每次都会停止而没有错误,我重新启动机器人,然后收到错误不和谐。http:我们受到速率限制。回复429。该怎么办,我需要如何重做代码?
import requests_html
import time
import discord
from discord.ext import commands
from discord.utils import get
from discord.ext import commands, tasks
import asyncio
intents = discord.Intents.default()
intents.message_content = True
intents.members = True
bot = commands.Bot(command_prefix='.', intents=intents)
Count = 0
@bot.command()
async def crypto_statistic(ctx):
while True:
global Count
await bot.wait_until_ready()
session = requests_html.HTMLSession()
r = session.get('https://www.coingecko.com/en/coins/bitcoin') #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ListOfStatistic = []
#Цена
for item in r.html.xpath('/html/body/div[5]/div[5]/div[1]/div/div[1]/div[3]/div/div[1]/span[1]/span'):
Price = item.text
#Процент за 1 час
for item in r.html.xpath('/html/body/div[5]/div[7]/div[1]/div/div/div/div[1]/div[1]/div[1]/div[3]/div[2]/div[1]/span'):
ListOfStatistic.append("1h: " + item.text)
#Процент за 24 часа
for item in r.html.xpath('/html/body/div[5]/div[7]/div[1]/div/div/div/div[1]/div[1]/div[1]/div[3]/div[2]/div[2]/span'):
h24 = item.text
ListOfStatistic.append("24h: " + item.text)
#Процент за 7 дней
for item in r.html.xpath('/html/body/div[5]/div[7]/div[1]/div/div/div/div[1]/div[1]/div[1]/div[3]/div[2]/div[3]/span'):
ListOfStatistic.append("7d: " + item.text)
#Процент за 30 дней
for item in r.html.xpath('/html/body/div[5]/div[7]/div[1]/div/div/div/div[1]/div[1]/div[1]/div[3]/div[2]/div[5]/span'):
ListOfStatistic.append("30d: " + item.text)
#Процент за год
for item in r.html.xpath('/html/body/div[5]/div[7]/div[1]/div/div/div/div[1]/div[1]/div[1]/div[3]/div[2]/div[6]/span'):
ListOfStatistic.append("1y: " + item.text)
#Лоу за 24 часа
for item in r.html.xpath('/html/body/div[5]/div[7]/div[1]/div/div/div/div[1]/div[1]/div[3]/div[2]/div[1]/table/tbody/tr[2]/td/span/span/span[1]'):
ListOfStatistic.append("24h Low: " + item.text)
#Макс за 24 часа
for item in r.html.xpath('/html/body/div[5]/div[7]/div[1]/div/div/div/div[1]/div[1]/div[3]/div[2]/div[1]/table/tbody/tr[2]/td/span/span/span[2]'):
ListOfStatistic.append("24h High: " + item.text)
guild = discord.utils.get(bot.guilds, name="тесты") #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
member = guild.get_member(1066093484890656951) #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
if float(h24[:-1]) >= 0:
await member.edit(nick = Price + " (↗)")
else:
await member.edit(nick = Price + " (↘)")
if Count == 6:
await bot.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name = ListOfStatistic[Count]))
print(1)
Count = 0
await asyncio.sleep(3)
else:
await bot.change_presence(activity=discord.Activity(type=discord.ActivityType.watching, name = ListOfStatistic[Count]))
print(2)
Count += 1
await asyncio.sleep(3)
@bot.event
async def on_ready():
await crypto_statistic(bot.get_context)
if __name__ == "__main__":
bot.run('MyTokenHere') #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
我尝试了很多方法,我还通过@tasks.loop循环这个命令,但它不起作用。有些方法有所帮助,但是我在机器人事件中的统计数据应该按以下顺序排列:1小时、24小时、7天、30天、1年...,按相同的顺序排列,但有些统计数据丢失并且没有显示在机器人事件中!
最佳答案
HTTP 状态 429
表示请求过多
,如您所见 here 。 Discord API 对给定时间内可以发出的请求数量有限制。您可以做的一个聪明的事情是拦截响应的状态代码,无论它是否为 429,然后您执行 sleep()
然后重做请求!
像这样(这是伪代码):
request_url = ""
request_headers = {}
response = discord_requests.get(url, headers)
if response.status_code == "429"
sleep(5)
response = discord_requests.get(url, headers)
请注意,这不是最佳实践。最佳实践是了解 API 可以处理的确切请求数量,计算脚本在这段时间内可以执行的请求数量,然后放置 sleep()
我不太清楚如何从请求中获取状态代码
,但通过调试它应该很容易理解!
确实,我必须使用 requests
库为数据导入脚本执行类似的操作。
关于python - 如何解决 -discord.http : We are being rate limited. 回复 429,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75193879/