Если вы управляете сайтом реселлера, Telegram-ботом или небольшим инструментом для агентства, рано или поздно вам захочется, чтобы заказы отправлялись в вашу SMM-панель автоматически, а не оформлялись вручную. Большинство SMM-панелей используют один и тот же простой формат «API v2», поэтому, поняв его единожды, вы сможете подключиться практически к любой панели за пару часов.

В этой статье я покажу весь процесс с рабочим кодом на PHP и Python: получение списка услуг, проверка баланса, оформление заказа и отслеживание его статуса.

Дисклеймер: я владею SafeSMM, поэтому в примерах используется эндпоинт SafeSMM. Формат запросов стандартный для v2, поэтому тот же код обычно работает и с другими панелями, если вы измените URL и ключ.

Как работает API v2 SMM-панели

Всё взаимодействие происходит через один URL с помощью POST-запросов. Вы всегда отправляете два поля:

  •  key : ваш API-ключ (со страницы аккаунта)
  •  action : действие, которое вы хотите выполнить

В ответ приходит JSON. Основные действия:

Action Описание Дополнительные параметры
 services  Список всех услуг нет
 balance  Показать ваш баланс нет
 add  Оформить заказ  service ,  link ,  quantity 
 status  Статус заказа  order  (или  orders  для нескольких)
 refill  Запросить refill  order 
 cancel  Запросить отмену  order 

Шаг 1: тестирование через cURL

Прежде чем писать код, проверьте ваш ключ из терминала:

 curl -X POST https://safesmm.net/api/v2 \
  -d "key=YOUR_API_KEY" \
  -d "action=balance"
 

Работающий ключ возвращает примерно следующее:

 { "status": "success", "balance": "100.84292", "currency": "USD" }
 

Неверный ключ возвращает:

 { "error": "Invalid API key." }
 

Шаг 2: небольшой клиент на Python

Здесь используется только стандартная библиотека Python, поэтому устанавливать ничего не нужно:

 import json
import urllib.parse
import urllib.request

API_URL = "https://safesmm.net/api/v2"
API_KEY = "YOUR_API_KEY"


def call(action, **params):
    data = {"key": API_KEY, "action": action, **params}
    body = urllib.parse.urlencode(data).encode()
    req = urllib.request.Request(API_URL, data=body, method="POST")
    with urllib.request.urlopen(req, timeout=30) as resp:
        result = json.loads(resp.read().decode())
    if isinstance(result, dict) and "error" in result:
        raise RuntimeError(result["error"])
    return result


print(call("balance"))

services = call("services")
for s in services[:5]:
    print(s["service"], s["name"], s["rate"], s["min"], s["max"])

order = call("add", service=1, link="https://instagram.com/yourpage", quantity=100)
print(call("status", order=order["order"]))
 

Шаг 3: то же самое на PHP

 <?php
function smm_call($action, $params = []) {
    $data = array_merge(['key' => 'YOUR_API_KEY', 'action' => $action], $params);
    $ch = curl_init('https://safesmm.net/api/v2');
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    $result = json_decode(curl_exec($ch), true);
    curl_close($ch);
    if (is_array($result) && isset($result['error'])) {
        throw new Exception($result['error']);
    }
    return $result;
}

print_r(smm_call('balance'));

$order = smm_call('add', ['service' => 1, 'link' => 'https://instagram.com/yourpage', 'quantity' => 100]);
print_r(smm_call('status', ['order' => $order['order']]));
 

Значения статусов заказа

Когда вы вызываете  status , вы получаете такие поля, как  status ,  start_count ,  remains  и  charge . Обычно используются следующие статусы:

  •  Pending: заказ находится в очереди
  •  In progress: выполнение началось
  •  Completed: полностью выполнено
  •  Partial: выполнена только часть, а остаток средств возвращен на баланс
  •  Canceled: не выполнено, сумма возвращена

Я написал более подробное руководство о том, что означает каждый статус, здесь: https://safesmm.net/blog/smm-panel-order-status-meanings

Drip-feed и кастомные комментарии

Два специальных типа заказов используют то же действие  add :

  •  Drip-feed: отправьте  quantity  (количество за раз),  runs  и  interval  (минуты между запусками), чтобы растянуть выполнение во времени.
  •  Custom comments: отправьте  comments  по одному комментарию на строку вместо  quantity .

Советы по управлению панелью

  1.  Кэшируйте список услуг. Вызовите  services  один раз и сохраните результат. ID услуг, тарифы, минимальные и максимальные значения берутся оттуда, и вам не нужно запрашивать их при каждом заказе.
  2.  Проверяйте статус раз в несколько минут, а не каждую секунду. Используйте  orders  с ID, разделенными запятыми, чтобы проверять множество заказов за один запрос.
  3.  Проверяйте ссылку перед отправкой. Приватный профиль или неверная ссылка — самая частая причина зависания или отмены заказа.
  4.  Храните ключ на сервере. Никогда не помещайте ваш API-ключ в фронтенд-код на JavaScript или в публичный репозиторий.
  5.  Везде обрабатывайте поле  error . Оба примера выше превращают его в исключение, чтобы один некорректный заказ не ломал весь ваш скрипт.

Полный код

Готовые клиенты на PHP и Python (с поддержкой refill, отмены, drip-feed, комментариев и проверки нескольких статусов) доступны на GitHub:

https://github.com/safesmmnet/safesmm-api-examples

Полный список параметров приведен в документации API: https://safesmm.net/api/docs

Если у вас есть вопросы по подключению API панели к вашему сайту или боту, задавайте их в комментариях, и я помогу.