英文:
steampy. Always getting TooManyRequests
问题
今天我开始制作Discord机器人,它将跟踪我的CS:GO贴纸的市场价格。问题是,当我尝试使用steampy获取市场价格时,我总是收到"TooManyRequests"错误。
这是代码的一部分。
@client.command()
async def cena(ctx):
global steam_client
f = open('items.json', "r")
data = json.load(f)
item_dict = data['items_info']
for x in item_dict:
item = x['item']
quantity = x['quantity']
cost = x['cost']
market = steam_client.market.fetch_price(item, game=GameOptions.CS, currency=Currency.EURO)
print(market)
if market == None or market['success'] == False:
await ctx.send("error")
break
else:
lowest = market['lowest_price'].replace("€", "").replace(",", ".")
ans = f"{item} : **{lowest}€** ||{cost}€ ({quantity})||"
await ctx.send(ans)
f.close()
time.sleep(6)
这是items.json
{
"items_info" : [
{
"item" : "Sticker | Spirit (Holo) | 2020 RMR",
"quantity" : 1,
"cost" : 0.50,
"sellat" : 0.65
},
{
"item" : "Sticker | Virtus.pro (Holo) | 2020 RMR",
"quantity" : 1,
"cost" : 0.61,
"sellat" : 0.90
},
{
"item" : "Sticker | FURIA (Holo) | 2020 RMR",
"quantity" : 2,
"cost" : 0.48,
"sellat" : 0.60
},
{
"item" : "Sticker | Renegades (Holo) | 2020 RMR",
"quantity" : 5,
"cost" : 0.20,
"sellat" : 0.30
}
]
}
我尝试撤销我的Steam API密钥,但没有帮助。我还尝试了其他包,如steammarket,但也没有成功。这甚至在第一次获取时都发生了。
编辑:今天我尝试运行代码,第一次它获取了前两个贴纸的成本,但在第三个贴纸中完全停止工作。
英文:
Today i started making Discord bot that will track market price of my CS:GO Stickers. Problem is when I trying to fetch market price using steampy I always getting TooManyRequests error.
This fragment of a code.
@client.command()
async def cena(ctx):
global steam_client
f = open('items.json', "r")
data = json.load(f)
item_dict = data['items_info']
for x in item_dict:
item = x['item']
quantity = x['quantity']
cost = x['cost']
market = steam_client.market.fetch_price(item, game=GameOptions.CS, currency=Currency.EURO)
print(market)
if market == None or market['success'] == False:
await ctx.send("error")
break
else:
lowest = market['lowest_price'].replace("€", "").replace(",", ".")
ans = f"{item} : **{lowest}€** ||{cost}€ ({quantity})||"
await ctx.send(ans)
f.close()
time.sleep(6)
Here is items.json
{
"items_info" : [
{
"item" : "Sticker | Spirit (Holo) | 2020 RMR",
"quantity" : 1,
"cost" : 0.50,
"sellat" : 0.65
},
{
"item" : "Sticker | Virtus.pro (Holo) | 2020 RMR",
"quantity" : 1,
"cost" : 0.61,
"sellat" : 0.90
},
{
"item" : "Sticker | FURIA (Holo) | 2020 RMR",
"quantity" : 2,
"cost" : 0.48,
"sellat" : 0.60
},
{
"item" : "Sticker | Renegades (Holo) | 2020 RMR",
"quantity" : 5,
"cost" : 0.20,
"sellat" : 0.30
}
]
}
I tried to revoking my Steam API Key it didn't help. I've also tried with another packages like steammarket but it didn't work too. It happends even in first fetch.
EDIT I tried run code today and first time it fetched cost of first two sticker but in sticker three it stopped working at all.
答案1
得分: 1
你超过了Steam API设置的速率限制,你需要在发出请求之间添加延迟。最好使用asyncio.sleep
来添加延迟。
import asyncio
@client.command()
async def cena(ctx):
global steam_client
f = open('items.json', "r")
data = json.load(f)
item_dict = data['items_info']
for x in item_dict:
item = x['item']
quantity = x['quantity']
cost = x['cost']
market = steam_client.market.fetch_price(item, game=GameOptions.CS, currency=Currency.EURO)
print(market)
if market == None or market['success'] == False:
await ctx.send("error")
break
else:
lowest = market['lowest_price'].replace("€", "").replace(",", ".")
ans = f"{item} : **{lowest}€** ||{cost}€ ({quantity})||"
await ctx.send(ans)
# 在请求之间添加延迟
await asyncio.sleep(5)
f.close()
英文:
You exceed the rate limit imposed by the Steam API, you gonna have to add a delay in between the request you make.
The best would be to use asyncio.sleep
to add delay.
import asyncio
@client.command()
async def cena(ctx):
global steam_client
f = open('items.json', "r")
data = json.load(f)
item_dict = data['items_info']
for x in item_dict:
item = x['item']
quantity = x['quantity']
cost = x['cost']
market = steam_client.market.fetch_price(item, game=GameOptions.CS, currency=Currency.EURO)
print(market)
if market == None or market['success'] == False:
await ctx.send("error")
break
else:
lowest = market['lowest_price'].replace("€", "").replace(",", ".")
ans = f"{item} : **{lowest}€** ||{cost}€ ({quantity})||"
await ctx.send(ans)
# Add a delay between requests
await asyncio.sleep(5)
f.close()
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论