python - 如何解决 -discord.http : We are being rate limited. 回复 429

标签 python discord discord.py

我正在创建一个显示比特币统计数据的机器人。该机器人每 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/

相关文章:

python - Python中每个元素的长度总和

Python:无法插入 MongoDB

javascript - 代码将自身循环三次并运行 "If"语句两次和 "Else"语句一次

python - 如何使用discord.py 获取discord 用户的用户ID

discord.py - 如何用praw提取reddit提交内容?

python - MySQL 和 Python 编程错误 : 1064 (42000)

python - 流式 pyspark 应用程序中的连接池

python - 用python解析xml中的CDATA

javascript - 检查 YouTube channel 是否上传了视频

javascript - .addNumberOption 错误(斜杠命令)