Пытаюсь скачать видео (любое) с сервиса 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();
}
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Как мне можно присвоить Action'у методы (разные) с разным кол-вом параметров и при этом параметры разные
Мне нужно распарсить строкуОна может иметь один из вот таких видов:
Как можно узнать куда был перенаправлен запрос HttpClient если для запроса указывать только запрос заголовков?
когда залил сайт на хостинг столкнулся с ошибкой