Как скачать видео из MAX, выполнив в C# GET‑запрос с нужными параметрами?

Добрый день, <br/> Мне от MAX пришла следующая ссылка на видео: <br/> " <a href="https://vd431.okcdn.ru/?expires=1772984580078&amp;pr=95&amp;srcAg=UNKNOWN&amp;ms=45.136.21.28&amp;type=5&amp;sig=Y3aDHApZ_vs&amp;ct=0&amp;urls=185.226.55.18&amp;clientType=11&amp;appId=1248243456&amp;id=11898298501737" rel="nofollow">https://vd431.okcdn.ru/?expires=1772984580078&amp;pr=9...</a> " <br/> <br/> Не понимаю, как называется формат этого видео и каким образом его можно скачать с помощью GET-запроса. <br/> Прошу хотя бы подсказать правильные термины/названия — остальное я сам погуглю.
  • 14 марта 2026 г. 7:00
Ответы на вопрос 1
Коротко — это не «особый формат», а обычная подписанная (time‑limited) ссылка на CDN‑ресурс. Параметры в query (expires, sig, id, appId и т.п.) — это подпись/временная метка и параметры доступа. Файл по такому URL может быть:
- прямым прогрессивным файлом (mp4, mkv и т.д.) — тогда сервер вернёт Content‑Type: video/… и сам бинарник;
- HLS-плейлист (m3u8) — тогда Content‑Type будет application/vnd.apple.mpegurl или в теле будет #EXTM3U; в этом случае нужно скачивать сегменты (.ts) или использовать ffmpeg для сборки.

Что гуглить (ключевые термины):
- signed URL, presigned URL, expiring URL, CDN signed URL;
- progressive download vs HLS (m3u8) vs DASH;
- HTTP GET download C# HttpClient, HttpClient ResponseHeadersRead, Range header (resume);
- Content‑Type, Content‑Disposition, redirects, Referer/Cookies.

Примеры проверок и скачивания в C# (потоково, без загрузки в память):

1) Быстрая проверка заголовков / формат (HEAD или GET с чтением заголовков):
```csharp
using var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Head, url);
var resp = await client.SendAsync(request);
Console.WriteLine(resp.StatusCode);
if (resp.Content.Headers.ContentType != null)
    Console.WriteLine("Content-Type: " + resp.Content.Headers.ContentType.MediaType);
if (resp.Content.Headers.ContentDisposition != null)
    Console.WriteLine("Content-Disposition: " + resp.Content.Headers.ContentDisposition);
```
Если сервер не поддерживает HEAD, используйте GET с HttpCompletionOption.ResponseHeadersRead и читайте только заголовки.

2) Скачивание в файл потоково:
```csharp
using var client = new HttpClient();
// при необходимости добавить заголовки
client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
client.DefaultRequestHeaders.Referrer = new Uri("https://max.example"); // если нужен Referer
// client.DefaultRequestHeaders.Add("Cookie", "sid=..."); // если нужны куки

using var response = await client.GetAsync(url, HttpCompletionOption.ResponseHeadersRead);
response.EnsureSuccessStatusCode();

using var httpStream = await response.Content.ReadAsStreamAsync();
using var fileStream = new FileStream("output.bin", FileMode.Create, FileAccess.Write, FileShare.None, 8192, useAsync: true);
await httpStream.CopyToAsync(fileStream);
```
После получения проверьте Content‑Type или расширение файла и переименуйте в .mp4 при необходимости.

3) Если это HLS (m3u8) — проще всего использовать ffmpeg:
ffmpeg -i "https://vd431.okcdn.ru/...?expires=..." -c copy output.mp4
Или в C# вызвать процесс ffmpeg и подставить URL.

Доп. примечания:
- Ссылка может быть временной — сохраняйте и скачивайте до истечения expires.
- Сервер может требовать Referer/куки/специфичный User‑Agent — смотрите реальные HTTP‑заголовки в запросе, который вам присылает приложение MAX.
- Если получаете 302/301 — HttpClient по умолчанию следует редиректам; при необходимости контролируйте HttpClientHandler.AllowAutoRedirect.
- Для дозагрузки/резюма используйте заголовок Range.
- Убедитесь, что скачивание не нарушает лицензионные/правовые ограничения.

Если хотите, пришлите точный URL (или response headers) — помогу определить, это mp4 или m3u8 и дам конкретный рабочий пример C#.
Похожие вопросы