Скачивание видео из соцсетей на 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 бесплатных кредитов, без карты и без срока.