Пытаюсь скачать видео (любое) с сервиса Sibnet, провел тестирование получения ссылки на видео-файл, и успешно получаю нормальный Url, но при этом, если сделать запрос чтения потока данных, ничего не происходит, и поток данных всегда пуст, хотя код ответа 200.
В общем для того чтобы получить ссылку на файл, нужно сделать следующее, получить ссылку на файл mpd, переименовать mpd в mp4, и сделать запрос.
Если делать все это с помощью браузера, получается так что при запросе Url, делается перенаправление на один из серверов sibnet где лежит файл (ну точнее доступ оттуда будет разрешен, ссылка всегда разная отдается). В моем случае, при запросе такого Url перенаправления не происходит, и HttpClient просто читает ответ заголовков, не более.
Приведенный ниже код работоспособен, но не может читать контент.
Что можно сделать что бы контент можно было прочитать, а так же дабы сработало перенаправление?
public class Program
{
public static void Main(string[] args)
{
CookieCollection cookieCollection = new CookieCollection();
CookieContainer container = new CookieContainer();
container.Add(cookieCollection);
HttpClientHandler clientHandler = new HttpClientHandler
{
AllowAutoRedirect = true,
UseCookies = true
};
HttpClient client = new HttpClient(clientHandler, true)
{
BaseAddress = new Uri("https://video.sibnet.ru/")
};
string result =
client.GetStringAsync
(
new Uri(
"/shell.php?videoid=3490241",
UriKind.Relative)
).GetAwaiter().GetResult();
Regex regex = new Regex(@"\[\{src\:\s?\""(?<FilePath>[^\""]+)\""");
Match match = regex.Match(result);
Console.WriteLine(match.Groups["FilePath"].Value.Replace("mpd", "mp4").Replace("m3u8", "mp4"));
client.DefaultRequestHeaders.Referrer = new Uri(client.BaseAddress.OriginalString + "/shell.php?videoid=3490241");
client.DefaultRequestHeaders.Add("Origin", "https://video.sibnet.ru");
HttpResponseMessage message = client
.GetAsync(new Uri(match.Groups["FilePath"].Value.Replace("mpd", "mp4").Replace("m3u8", "mp4"),
UriKind.Relative)).GetAwaiter().GetResult();
message = message.EnsureSuccessStatusCode();
Stream fileData = message.Content.ReadAsStreamAsync().GetAwaiter().GetResult();
FileStream file = File.Create("sibnet.mp4");
byte[] data = new byte[8388608]; // 8 Mb 1024*1024*8
int offset = 0;
while ((offset = fileData.Read(data, 0, data.Length)) != 0) file.Write(data, offset, data.Length);
file.Close();
fileData.Close();
client.Dispose();
}
Оказывается проблема была в другом, что бы sibnet отдал ссылку на полный файл, нужно отправлять POST запрос с контентом buffer_method: full, тогда в исходном коде можно будет найти полную ссылку на файл, но стоит не забывать о том что sibnet проверяет 2 заголовка, это Origin, и Referer. В общем приведенный ниже код можно спокойно использовать как для скачивания (любого) видео с sibnet.
Но у меня остался вопрос, как можно используя полученный Stream записывать например дынные в файл или например на локальный сокет сервер (стримминг в локальной сети)?
public class Program
{
public static async Task Main(string[] args)
{
Uri loadUri = new Uri("/shell.php?videoid=3490241", UriKind.Relative);
Regex regex = new Regex(@"src\:\s?\""(?<FilePath>[^\""]+)\""");
CookieCollection cookieCollection = new CookieCollection();
CookieContainer container = new CookieContainer();
container.Add(cookieCollection);
HttpClientHandler clientHandler = new HttpClientHandler
{
AllowAutoRedirect = true,
UseCookies = true
};
HttpClient client = new HttpClient(clientHandler, true)
{
BaseAddress = new Uri("https://video.sibnet.ru/")
};
HttpResponseMessage result = await client.PostAsync(loadUri, new FormUrlEncodedContent(new []{new KeyValuePair<string, string>("buffer_method", "full")}));
Match match = regex.Match(await result.Content.ReadAsStringAsync());
Console.WriteLine(match.Groups["FilePath"].Value);
client.DefaultRequestHeaders.Referrer = new Uri(client.BaseAddress, loadUri);
client.DefaultRequestHeaders.Add("Origin", client.BaseAddress.OriginalString);
Stream message = await client.GetStreamAsync(new Uri(match.Groups["FilePath"].Value, UriKind.Relative));
FileStream file = File.Create("sibnet.mp4");
await message.CopyToAsync(file, 8388608);
message.Dispose();
file.Dispose();
client.Dispose();
}
}
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости