Примеры интеграции
Практические примеры работы с публичным API. Все примеры используют реальные форматы запросов и ответов.
1. Получить ключ
Ключ выдаётся только в личном кабинете после регистрации:
- Зарегистрируйтесь/войдите: /profile/.
- Раздел «API» (/profile/api/) → «+ Создать проект» (для CLI; при желании укажите IP).
- Скопируйте ключ (64 hex-символа) — публичной выдачи ключей через API нет.
Сохраните ключ в переменной окружения:
bashexport OST_API_KEY="ваш_ключ"
2. Получить список серверов
bashcurl -s -H "X-API-KEY: $OST_API_KEY" \
"https://openspeedtest.ru/api.php?action=get-servers"
3. Отправить результат теста (Python)
pythonimport hashlib, hmac, json, time, urllib.request
API_KEY = "ваш_ключ"
URL = "https://openspeedtest.ru/api.php?action=submit-result"
dl, ul, ping, jitter = 123.45, 67.89, 12.34, 1.23
ts = str(int(time.time()))
# Строка подписи — ровно как на сервере (до сотых!)
data_string = f"dl={dl:.2f}:ul={ul:.2f}:ping={ping:.2f}:jitter={jitter:.2f}:timestamp={ts}"
signature = hmac.new(API_KEY.encode(), data_string.encode(), hashlib.sha256).hexdigest()
payload = json.dumps({
"dl": dl, "ul": ul, "ping": ping, "jitter": jitter,
"timestamp": ts, "server_id": 12, "source": "cli"
}).encode()
req = urllib.request.Request(URL, data=payload, headers={
"Content-Type": "application/json",
"X-API-KEY": API_KEY,
"X-SIGNATURE": signature,
})
print(urllib.request.urlopen(req).read().decode())
4. Проверить лимиты и использование
bashcurl -s -H "X-API-KEY: $OST_API_KEY" "https://openspeedtest.ru/api/v2/servers"
В ответе — limits и usage. Перед отправкой результатов сверяйте usage.hour / usage.day с limits, чтобы не получать 429.
5. Обработка 429 (backoff)
pythonimport time, json, urllib.request, urllib.error
def call(url, headers, data=None):
req = urllib.request.Request(url, data=data, headers=headers)
try:
return json.loads(urllib.request.urlopen(req).read())
except urllib.error.HTTPError as e:
if e.code == 429:
wait = int(e.headers.get("Retry-After", "60"))
time.sleep(wait)
return call(url, headers, data)
raise
Не спамьте повторными запросами: до конца окна все запросы будут получать 429.
6. Региональная статистика (карта)
Публично, без ключа:
bashcurl -s "https://openspeedtest.ru/api/v1/network-quality?network=home"
curl -s "https://openspeedtest.ru/api/v1/network-quality/geometry" -o regions.topojson
7. Интеграция с внешними системами
Для систем мониторинга и дашбордов используйте HTTP-источник данных:
- Grafana — настройте HTTP datasource на
https://openspeedtest.ru/api/v2/serversс заголовкомX-API-KEY; - Zabbix / Prometheus exporters — периодически вызывайте API и передавайте
usage/limitsи метрики серверов; - Собственные скрипты — оборачивайте вызовы в функцию с обработкой 429 (см. примеры выше).
Совет. Кэшируйте публичную статистику network-quality локально на сутки — она и так обновляется раз в сутки, поэтому частые запросы не нужны.
Техническая деталь
Подпись вычисляется по строке dl=%.2f:ul=%.2f:ping=%.2f:jitter=%.2f:timestamp=%s, где %s — timestamp как есть. Любое расхождение в округлении или порядке полей приведёт к ответу 403 «Invalid request signature». timestamp должен быть не старше 300 секунд.