Liczba zapytań na sekundę, które można wykonywać w zależności od planu, zanim serwer zacznie odrzucać zapytania z błędem 429 Too Many Requests
.
Plan | Wartość |
---|---|
Free | 5 zapytań/s |
Pro | 50 zapytań/s |
Dodatkowe wartości ułatwiające implementacje, np. kolejki odświeżania serwerów. Pomocne w przypadku wykonywania wielu zapytań po sobie, w jednym ciągu.
Nazwa | Wyjaśnienie | Przykład |
---|---|---|
RateLimit-Limit | Liczba zapytań dostępnych jest w każdym okienku ratelimitu. | 5 |
RateLimit-Policy | Obowiązujące zasady ratelimitów. | 5;w=1 |
RateLimit-Remaining | Liczba pozostałych możliwych do wykonania w obecnym okienku ratelimitu. | 4 |
RateLimit-Reset | Liczba sekund, które należy odczekać przed kolejnym wykonywaniem zapytania. | 0 |
Poniżej przykładowy kod korzystający ze składni języka Python, wykorzystujący nagłówki do implementacji odświeżania listy serwerów.
# Copyright (c) 2020 OkaeriPoland
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included in all
# copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
while True:
# get first element from queue without removing it
request = queue.peek()
# wait one second if there is no requests to make
if not request:
sleep(1)
continue
# execute http request (don't forget about generic error handling)
result = request.execute()
# read response headers
rl_limit = int(result.headers['RateLimit-Limit'])
rl_remaining = int(result.headers['RateLimit-Remaining'])
rl_reset = int(result.headers['RateLimit-Reset'])
rl_window = int(result.headers['RateLimit-Policy'].split(';')[1].split('=')[1])
# determine actions
if result.http_code == 429: # ratelimit reached
if not rl_reset: # for whatever reason the reset header was not present
print(f"Reached RateLimit (no RateLimit-Reset found!): sleeping 1 second")
sleep(1)
else: # sleep for time provided in the header
print(f"Reached RateLimit: sleeping f{rl_reset} seconds")
sleep(rl_reset)
continue # continue processing requests without removing current request from queue
if rl_reset: # wait if header is present without checking http code to respect service overload protection
print(f"Reset received without 429 response: respecting overload protection and sleeping f{rl_reset} seconds")
sleep(rl_reset) # sleep RateLimit-Reset seconds
elif rl_remaining <= 1: # only few tokens left, wait a moment for the refill
cooldown = rl_window / rl_limit
print(f"Just {rl_remaining} token(s) remaining: sleeping f{cooldown} seconds")
sleep(cooldown) # 0.2s sleep [determined automatically, example for 1s window and limit of 5]
# remove first element from queue
queue.remove()
# TODO: process received data
if result.http_code == 400:
# fail! "Invalid or unresolvable address"
continue
if result.http_code == 409:
# fail! "Server is unreachable"
continue
if result.http_code != 200:
# unknown error
continue
print(result.body)
https://gamedata-api.okaeri.eu/v1/gamedata/ips
[sprawdź w dokumentacji]
Lista adresów IP wykorzystywanych przez system do odczytywania informacji o serwerach
{
"ipv4_cidr": ["127.0.0.1/32", "127.0.0.2/32"]
}
GameData nie wymaga autoryzacji dla użytkowników darmowych. W przypadku użytkowników planu Pro, należy przesłać swój token w postaci nagłówka, w każdym zapytaniu, które ma być autoryzowane za jego pomocą: Authorization: Bearer XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Oficjalnie wspierane rozwiązanie. Sprawdź dostępność dla swojego języka tutaj.
Język | Nazwa | Link | Opis |
---|---|---|---|
Node | okaeri-sdk-node | https://www.npmjs.com/package/okaeri-sdk | podstrona |
Biblioteki społeczności oraz przestarzałe wersje oficjalne.
Język | Nazwa | Link | Opis |
---|---|---|---|
Stworzyłeś bibliotekę do języka niewspieranego przez Okaeri SDK? Napisz do nas z pytaniem o rozszerzenie listy.