saveapi.org

Скачивание видео из соцсетей на PHP

Расширение curl в PHP — это весь клиент. Записать стоит то, что отличается от fetch в браузере: кодирование ссылки в query-строку, обрыв медленного источника по таймауту, потоковая запись большого файла на диск вместо строки и повтор только того, что повтор исправляет.

Обновлено

Одна функция

curl с http_build_query для ссылки — значение обязано быть URL-кодированным, ссылка с & сломает собранную вручную query-строку. CURLOPT_TIMEOUT не даёт медленному источнику держать запрос; тридцать секунд — выше собственного бюджета API на источник.

PHP
<?php
function resolve(string $link): array {
    $ch = curl_init("https://api.saveapi.org/v1/download?" . http_build_query(["url" => $link]));
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT        => 30,
        CURLOPT_HTTPHEADER     => ["Authorization: Bearer sk_live_xxxx"],
    ]);
    $body = curl_exec($ch);
    curl_close($ch);
    return json_decode($body, true) ?? ["success" => false, "error" => ["code" => "UPSTREAM_ERROR"]];
}

Прочитайте medias[]

В каждом ответе один и тот же массив: по записи на файл в порядке поста, у каждой — type. Ветвитесь по type, а не предполагайте видео: слайдшоу TikTok и карусель Instagram приходят записями image.

PHP
$data = resolve("https://www.instagram.com/reel/ABC123/");

if (!$data["success"]) {
    throw new RuntimeException($data["error"]["code"]);
}

foreach ($data["medias"] as $media) {
    echo $media["type"], " ", $media["url"], PHP_EOL;   // video | image | audio
}

Пишите файл на диск потоком

CURLOPT_FILE пишет загрузку прямо в дескриптор. Загрузить 4K-reel в строку PHP — самый быстрый способ упереться в memory_limit; поток не упирается никогда.

PHP
// Faylni diskka oqizish — xotiraga yuklamasdan
$out = fopen("video.mp4", "wb");
$ch  = curl_init($data["medias"][0]["url"]);
curl_setopt_array($ch, [CURLOPT_FILE => $out, CURLOPT_FOLLOWLOCATION => true, CURLOPT_TIMEOUT => 120]);
curl_exec($ch);
curl_close($ch);
fclose($out);

Повторяйте только то, что повтор исправляет

UPSTREAM_TIMEOUT и UPSTREAM_ERROR стоят ещё одной попытки и ничего не стоят. PRIVATE_CONTENT, MEDIA_NOT_FOUND и UNSUPPORTED_PLATFORM финальны — второй вызов даст тот же ответ и для тарифицируемых спишет ещё 0.1 кредита. Действуйте по коду, никогда по тексту сообщения.

Один повтор, в коде

Один повтор после короткой паузы, только для двух повторяемых кодов. Оберните это в свою очередь, если разрешаете массово; поминутный лимит — в заголовках ответа как X-RateLimit-Remaining.

PHP
$retryable = ["UPSTREAM_TIMEOUT", "UPSTREAM_ERROR"];

$data = resolve($link);
if (!$data["success"] && in_array($data["error"]["code"], $retryable, true)) {
    sleep(2);
    $data = resolve($link);      // faqat bir marta, faqat shu kodlar uchun
}

Вопросы перед началом

Есть пакет Composer?
Нет, одному эндпоинту он не нужен — весь клиент это функция из первого шага.
Файл проходит через API?
Нет. Вы получаете URL CDN и скачиваете напрямую; скорость зависит от этого CDN, а не от API.
Можно вызывать с shared-хостинга?
Да — это обычный curl по HTTPS. Важно лишь, чтобы хостинг разрешал исходящие запросы, а почти все разрешают.

Платформы, использованные здесь

Другие руководства

Запустите это руководство со своим ключом

Ключ за минуту. 1 000 бесплатных кредитов, без карты и без срока.

Получить ключ и попробоватьПолный справочник API