Если вы управляете сайтом реселлера, 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.
Советы по управлению панелью
-
Кэшируйте список услуг. Вызовите
servicesодин раз и сохраните результат. ID услуг, тарифы, минимальные и максимальные значения берутся оттуда, и вам не нужно запрашивать их при каждом заказе. -
Проверяйте статус раз в несколько минут, а не каждую секунду. Используйте
ordersс ID, разделенными запятыми, чтобы проверять множество заказов за один запрос. - Проверяйте ссылку перед отправкой. Приватный профиль или неверная ссылка — самая частая причина зависания или отмены заказа.
- Храните ключ на сервере. Никогда не помещайте ваш API-ключ в фронтенд-код на JavaScript или в публичный репозиторий.
-
Везде обрабатывайте поле
error. Оба примера выше превращают его в исключение, чтобы один некорректный заказ не ломал весь ваш скрипт.
Полный код
Готовые клиенты на PHP и Python (с поддержкой refill, отмены, drip-feed, комментариев и проверки нескольких статусов) доступны на GitHub:
https://github.com/safesmmnet/safesmm-api-examples
Полный список параметров приведен в документации API: https://safesmm.net/api/docs
Если у вас есть вопросы по подключению API панели к вашему сайту или боту, задавайте их в комментариях, и я помогу.
Комментарии (0)
Пока нет комментариев — будьте первым.