I wanted to do a simple script that calculates the number of certain actions in the game . The game has an api that is limited to 100 results per request, that is why they have unix timestamps if you want to go further and keep searching in a loop,the issue is that i take all 100 timestamps from the results add them to a list and sort them to take the last one and use it in the next request until there are no more results, but using the code below 1- The code doesn't exit 2- After debugging the code the code changes the timestamp only once
import requests
import json
import time
c = 0
link = "https://api.torn.com/user/"
key = "secret_api_key"
Monarch_Engineering = {
"dummmyId":[0,0,0,0,0],# user id : success, fail, bad, good, number of revs payed
}
Monarch = {
"dummmyId":[0,0,0,0,0],# user id : success, fail, bad, good, number of revs payed
}
non_contract = {
"dummmyId":[0,0,0],# user id : success, fail, number of revs payed
}
def search(frm,tt,ky=key):
parameter = {
"selections" : "revives",
"key" : ky,
"from" : frm,
"to" : tt
}
timestamp = True
while True:
with requests.get(link,params=parameter) as resp:
respon = json.loads(resp.text)
# Makes the get request and returns json
# transforms json str to a dictionary
if resp.status_code != 200 :
print("Request Error : ",resp.status_code, "\nExiting ....")
if "error" in respon.keys():
print(respon['error']['error'] " Error Code : ", respon['error']['code'])
q = input("Do you Want to continue Y/N : ").lower()
if q != "y":
print("script exiting ......")
return
# makes sure that it is a successful
# wait for a user input here to confirm the issue also print the error code
time.sleep(1)
# to prevent getting banned
timestamp = bool(respon['revives'])
if timestamp !=True :
return
print(parameter)# for debuging
parameter['from'] = revive(respon)
def revive(respond):
global c
global Monarch_Engineering
global Monarch
global non_contract
ff = [] # timestamps list
if "revives" not in respond.keys():
print("error no revs found ")
return
for key in respond["revives"]:
c =1
tkey = respond['revives'][key]
uid = tkey['target_id']
ff.append(tkey['timestamp'])
# if in ME
if tkey['target_faction'] == 7835 :
if uid not in Monarch_Engineering:
Monarch_Engineering[uid]=[0,0,0,0,0]
if "hospitalized" in tkey['target_hospital_reason'].lower() and tkey['chance'] >= 50:
Monarch_Engineering[uid][3] =1
if tkey['result'].lower() == "success":
Monarch_Engineering[uid][0] =1
else:
Monarch_Engineering[uid][1] =1
else:
Monarch_Engineering[uid][2] =1
elif tkey['target_faction'] == 8336 :
if uid not in Monarch:
Monarch[uid]=[0,0,0,0,0]
if "hospitalized" in tkey['target_hospital_reason'].lower() and tkey['chance'] >= 40:
Monarch[uid][3] =1
if tkey['result'].lower() == "success":
Monarch[uid][0] =1
else:
Monarch[uid][1] =1
else:
Monarch[uid][2] =1
else:
if uid not in non_contract:
non_contract[uid]=[0,0,0]
if tkey['result'].lower() == "success":
non_contract[uid][0] =1
else:
non_contract[uid][1] =1
ff.sort()
return ff[-1]
search(1635163200, 1635768000)
for i in Monarch_Engineering:
print("user id :", i)
print("The number of Success :", Monarch_Engineering[i][0])
print("The number of Failed :", Monarch_Engineering[i][1])
print("The number of Bad :", Monarch_Engineering[i][2])
print("The number of Good :", Monarch_Engineering[i][3])
print("\nthe number of revs searched/done = ",c)
CodePudding user response:
Issue solved: the server used a 30 sec cache, so whatever query i search for i get the same results, it seems it is an issue in their server they say it shouldn't act this way but i changed the delay to 31 secs just to make sure and it worked