Документация› API и интеграции› Примеры интеграции

Примеры интеграции

Практические примеры работы с публичным API. Все примеры используют реальные форматы запросов и ответов.

1. Получить ключ

Ключ выдаётся только в личном кабинете после регистрации:

  1. Зарегистрируйтесь/войдите: /profile/.
  2. Раздел «API» (/profile/api/) → «+ Создать проект» (для CLI; при желании укажите IP).
  3. Скопируйте ключ (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 секунд.