Не удается вычитать поток данных, всегда пуст

153
02 июля 2019, 18:50

Пытаюсь скачать видео (любое) с сервиса 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();
    }
Answer 1

Оказывается проблема была в другом, что бы 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();
    }
}
READ ALSO
Action который принимает разное кол-во аргументов

Action который принимает разное кол-во аргументов

Как мне можно присвоить Action'у методы (разные) с разным кол-вом параметров и при этом параметры разные

135
Как получить полное число перед знаком

Как получить полное число перед знаком

Мне нужно распарсить строкуОна может иметь один из вот таких видов:

125
Узнать куда было перенаправление

Узнать куда было перенаправление

Как можно узнать куда был перенаправлен запрос HttpClient если для запроса указывать только запрос заголовков?

154
Fatal error: Uncaught Error: Class &#39;application\core\view&#39; not found На хостинге

Fatal error: Uncaught Error: Class 'application\core\view' not found На хостинге

когда залил сайт на хостинг столкнулся с ошибкой

172