На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
  
> Delphi+YouTube , Как?
    Здраствуйте. Подскажите пожайлусто как мне скачать видео с YouTube? хотябы с чего начать как скачивать файлы с сети я могу, а вот с ю тубом все сложнее.
      ExpandedWrap disabled
        BOOL InternetReadFile(
          HINTERNET hFile,
          LPVOID lpBuffer,
          DWORD dwNumberOfBytesToRead,
          LPDWORD lpdwNumberOfBytesRead
        );
        А как узнать какой URL у видео файла?
          Gaws, дополняя пример Rouse_'а посмотри в MSDN работу с библиотекой WinInet или в FAQ форума
          Цитата Attack @
          А как узнать какой URL у видео файла?

          так на странице же есть ссылка чтобы вставить видео на свой сайт, проблема лишь в том что видео вставиться с плеером и будем иметь расширение *.swf, т.е. расширение Adobe Flash :)
            а отдельно скачать .flv файл нельзя?
            И как тогда поступают программы вроде YouTube Downloader? даже некоторые сайты позволяют через них скачивать только видео...
              Цитата Attack @
              И как тогда поступают программы вроде YouTube Downloader?

              скорее всего использует какую-то дырку в движке
                Какие дырки ? Парсишь страницу и ищешь url для загрузки.
                  Цитата P.O.D @
                  Парсишь страницу и ищешь url для загрузки.

                  дык у youtube не предусмотрена скачка видео только просмотр и распространение на других ресурсах путем вставки их плеера :huh:
                    Цитата kanes @
                    скорее всего использует какую-то дырку в движке

                    эта дырка редиректом зовется :)
                      Rouse_, а как использоать этот "редирект" с целью получения flv файла?
                        послать запрос на внешнюю ссылку, при это выставить INTERNET_FLAG_NO_AUTO_REDIRECT, при получении статуса HTTP_STATUS_REDIRECT обработать сам редирект, ну или просто вытащить оттуда имя файла...
                          Rouse_, прошу прощения за назойливость, но можно пример кода? а то я всё это довольно смутно представляю...
                          Сообщение отредактировано: Attack -
                            Сначала покажи ссылку, по которой хочешь получить результат
                              ну скажем эта:
                              ExpandedWrap disabled
                                http://www.youtube.com/watch?v=x_z8FeN6j78
                              Сообщение отредактировано: Attack -
                                По этой ссылке нет никакого FLV. Это обычная страница которая запускает проигрыватель расположенный по адресу:
                                http://s.ytimg.com/yt/swf/watch-vfl50057.swf
                                или
                                http://s.ytimg.com/yt/swf/watch_v8-vfl50057.swf
                                и передает ему код файла. Как видишь на www.youtube.com самого файла нет, а откуда проигрыватель его бует известно только ему самому.
                                  Rouse_ возник впрос а перехватить как-нибудь разве нельзя адреса роликов, например, посылая запросы на YouTube ... ;)
                                    Цитата andrew.virus @
                                    а перехватить как-нибудь разве нельзя адреса роликов, например, посылая запросы на YouTube

                                    Мне такие способы не известны :)
                                      Ура! Я разобрался...

                                      В аттаче мой енот, с помощью которого можно скачивать видео с www.youtube.com

                                      Угощаемся =)

                                      P.S.
                                      Код мальца кривой, но рабочий!
                                      Сообщение отредактировано: Attack -

                                      Прикреплённый файлПрикреплённый файлGetYTVFile.zip (1.33 Кбайт, скачиваний: 1090)
                                        Attack спасибо ...
                                          пробывал этот код переделать под наш баштуб но неполучилось ничего.
                                          Можете переделать эту программу под скачку видео дял сервиса http://bashtube.ru/ ?
                                            Tapac, перекроил под bashtube.ru=) пользуем...
                                            Сообщение отредактировано: Attack -

                                            Прикреплённый файлПрикреплённый файлGetBTVFile.zip (1.22 Кбайт, скачиваний: 404)
                                              Вот пример использования, так на всякий слуай =)
                                              Прикреплённый файлПрикреплённый файлBD.zip (3.06 Кбайт, скачиваний: 500)
                                                ага, этот BD.zip при запуске требует какойто компонент(((
                                                  Обновлённый енот для bashtube.ru

                                                  ExpandedWrap disabled
                                                    ////////////////////////////////////////////////////////////////////////////////
                                                    ///                                                                          ///
                                                    ///                -------= GetBashTubeVideoFile  =-------                   ///
                                                    ///                                                                          ///
                                                    ///  Ссылка должна быть вида:                                                ///
                                                    ///                 http://bashtube.ru/video/XXXX/                           ///
                                                    ///                                                                          ///
                                                    ///  Пример использования:                                                   ///
                                                    ///                                                                          ///
                                                    ///     if GetVideoFile('http://bashtube.ru/video/XXXX/',                    ///
                                                    ///         'C:\VideoFile.flv') then                                         ///
                                                    ///         ShowMessage('Файл получен!')                                     ///
                                                    ///         else ShowMessage('Ошибка');                                      ///
                                                    ///                                                                          ///
                                                    ////////////////////////////////////////////////////////////////////////////////
                                                    unit GetBTVFile;
                                                     
                                                    interface
                                                     
                                                    uses
                                                         Windows,
                                                         SysUtils,
                                                         Wininet,
                                                         Classes,
                                                         IdHTTP;
                                                     
                                                    Function GetVideoFile(const URL, SaveFileName : String) : Boolean;
                                                     
                                                    implementation
                                                     
                                                    function GetInetFile(const fileURL, FileName: String): boolean;
                                                    const
                                                         BufferSize = 1024;
                                                    var
                                                         hSession,
                                                         hURL      :    HInternet;
                                                         Buffer    :    array[1..BufferSize] of Byte;
                                                         BufferLen :    DWORD;
                                                         f         :    File;
                                                    begin
                                                         Result:=False;
                                                     
                                                         hSession := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG,
                                                              nil, nil, 0);
                                                         try
                                                              hURL := InternetOpenURL(hSession,
                                                                   PChar(fileURL),nil,0,0,0);
                                                              try
                                                                   AssignFile(f, FileName);
                                                                   Rewrite(f,1);
                                                                   repeat
                                                                        InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
                                                                        BlockWrite(f, Buffer, BufferLen)
                                                                   until BufferLen = 0;
                                                                   CloseFile(f);
                                                                   Result:=True;
                                                              finally
                                                                   InternetCloseHandle(hURL)
                                                              end
                                                         finally
                                                              InternetCloseHandle(hSession)
                                                         end
                                                    end;
                                                     
                                                    Function GetVideoFile(const URL, SaveFileName : String) : Boolean;
                                                         function fAnsiPos(const Substr, S: AnsiString; FromPos: integer) : Integer;
                                                         var
                                                              P    :    PAnsiChar;
                                                         begin
                                                                 Result := 0;
                                                                 P := AnsiStrPos(PAnsiChar(S) + fromPos - 1, PAnsiChar(SubStr));
                                                                 if P <> nil then
                                                                 Result := Integer(P) - Integer(PAnsiChar(S)) + 1;
                                                         end;
                                                    var
                                                         IdHTTP         :    TIdHTTP;
                                                         WebDoc         :    TStringStream;
                                                         X1,
                                                         X2             :    Integer;
                                                         FullURLFile    :    String;
                                                    Begin
                                                         Result := false;
                                                         IdHTTP := TIdHTTP.Create(nil);
                                                         try
                                                              WebDoc := TStringStream.Create('');
                                                              try
                                                                   with IdHTTP do
                                                                   Begin
                                                                        Request.UserAgent := 'MSIE';
                                                                        Request.Host := 'www.bashtube.ru';
                                                                   End;
                                                                   IdHTTP.Get(URL + 'play.xml?123', WebDoc);
                                                     
                                                                   X1 := fAnsiPos('<location>', WebDoc.DataString, Pos('</creator>', WebDoc.DataString) + 10)+10;
                                                                   X2 := fAnsiPos('</location>', WebDoc.DataString, X1);
                                                     
                                                                   FullURLFile := copy(WebDoc.DataString, X1, X2-X1);
                                                     
                                                                   if GetInetFile(FullURLFile, SaveFileName) then Result := true;
                                                              finally
                                                              WebDoc.Free;
                                                              end;
                                                         finally
                                                              IdHTTP.Free;
                                                         end;
                                                    End;    
                                                    end.


                                                  Хочу заметить, что енот написан и тестирован на Delphi 2009
                                                    Цитата Rouse_ @
                                                    а откуда проигрыватель его бует известно только ему самому

                                                    Есть ли возможность как-то это узнать, например с помощью снифера?
                                                      ну лично я понял откуда берётся видео разбирая исходник.
                                                      Например открывает ссылку http://bashtube.ru/video/10181/
                                                      И просто напросто добавим туда play.xml?123
                                                      И у нас выходит ссылка http://bashtube.ru/video/10181/play.xml?123

                                                      И у нас будет написано http://bashtube.ru/spotajob1.swf http://www.ufanet.ru/ overlay http://bashtube.ru/files/93/93dc089120dbbe0130fbdf3f06ac0d54.flv

                                                      Вот ссылка http://bashtube.ru/files/93/93dc089120dbbe0130fbdf3f06ac0d54.flv и есть тот самый видос !!!



                                                      А не знаете ли как зделать эту программу чтобы например мона было грузить более 2-ух видосов сразу !
                                                      А то ведь вставляешь ссылку в прогу и всё, пока нескачает нельзя к ней обращаться. Я имею ввиду то, чтобы зделать 1 оболочку, и зделать 1 программу которая будет запускаться из-под оболочки и сохранять видосы
                                                        Tapac, вроде привели вверху код. Осталось только потоки создавать, передавать в них разные ссылки на скачку и усе :)
                                                          Пример для YouTube не работает.

                                                          Качаем файл:
                                                          http://www.youtube.com/watch?v=Y0a1e2wvhCs

                                                          FullURLFile в функции GetVideoFile становится следующим:
                                                          http://www.youtube.com/get_video?video_id=Y0a1e2wvhCs&t=t

                                                          И никакого FLV по этому адресу нет.
                                                            Такая же проблема
                                                            ну что с ютубом делать?
                                                              pkotenev, ZILOSOFT, всё дело в том что ребята из youtube просто изменили код странички...

                                                              Переписал Unit, теперь всё работает, по крайней мере пока!

                                                              ExpandedWrap disabled
                                                                ////////////////////////////////////////////////////////////////////////////////
                                                                ///                                                                          ///
                                                                ///                -------= GetYouTubeVideoFile  =-------                    ///
                                                                ///                                                                          ///
                                                                ///  Ссылка должна быть вида:                                                ///
                                                                ///                 http://www.youtube.com/watch?v=XXXXXXXXXXX               ///
                                                                ///                                                                          ///
                                                                ///  Пример использования:                                                   ///
                                                                ///                                                                          ///
                                                                ///     if GetVideoFile('http://www.youtube.com/watch?v=XXXXXXXXXXX',        ///
                                                                ///         'C:\VideoFile.flv') then                                         ///
                                                                ///         ShowMessage('Файл получен!')                                     ///
                                                                ///         else ShowMessage('Ошибка');                                      ///
                                                                ///                                                                          ///
                                                                ///------------------>>> Написано на Delphi 2009 <<<-------------------------///
                                                                ///             с предыдущими версиями работать НЕ должно!                   ///
                                                                ////////////////////////////////////////////////////////////////////////////////
                                                                unit GetYTVFile;
                                                                 
                                                                interface
                                                                 
                                                                uses
                                                                    Windows,
                                                                    SysUtils,
                                                                    Wininet,
                                                                    Classes,
                                                                     IdHTTP;
                                                                 
                                                                Function GetVideoFile(const URL, SaveFileName : String) : Boolean;
                                                                 
                                                                implementation
                                                                 
                                                                function GetInetFile(const fileURL, FileName: String): boolean;
                                                                const
                                                                    BufferSize = 1024;
                                                                var
                                                                    hSession,
                                                                     hURL       :   HInternet;
                                                                    Buffer  :   array[1..BufferSize] of Byte;
                                                                    BufferLen   :   DWORD;
                                                                    f       :   File;
                                                                begin
                                                                    Result:=False;
                                                                 
                                                                    hSession := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG,
                                                                            nil, nil, 0);
                                                                    try
                                                                        hURL := InternetOpenURL(hSession,
                                                                        PChar(fileURL),nil,0,0,0);
                                                                        try
                                                                                AssignFile(f, FileName);
                                                                                Rewrite(f,1);
                                                                                repeat
                                                                                    InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
                                                                                    BlockWrite(f, Buffer, BufferLen)
                                                                                until BufferLen = 0;
                                                                                CloseFile(f);
                                                                                Result:=True;
                                                                        finally
                                                                            InternetCloseHandle(hURL)
                                                                        end
                                                                    finally
                                                                        InternetCloseHandle(hSession)
                                                                    end
                                                                end;
                                                                 
                                                                Function GetVideoFile(const URL, SaveFileName : String) : Boolean;
                                                                     function fAnsiPos(const Substr, S: string; FromPos: integer) : Integer;
                                                                     var
                                                                          tmp  :    String;
                                                                          p   :    Integer;
                                                                     begin
                                                                          Result := 0;
                                                                          tmp := copy(S, FromPos, (Length(S) - FromPos));
                                                                          p :=  pos(Substr, tmp);
                                                                          if p <> 0 then Result := p + FromPos - 1;
                                                                     end;
                                                                const
                                                                     BeginURLFile   =   'http://www.youtube.com/get_video?video_id=';
                                                                var
                                                                     IdHTTP     :   TIdHTTP;
                                                                     WebDoc     :   TStringStream;
                                                                     X1,
                                                                     X2,
                                                                     X4,
                                                                     X5         :   Integer;
                                                                     FullURLFile    :   String;
                                                                Begin
                                                                    Result := false;
                                                                    IdHTTP := TIdHTTP.Create(nil);
                                                                    try
                                                                        WebDoc := TStringStream.Create('');
                                                                          try
                                                                        with IdHTTP do
                                                                            Begin
                                                                                Request.UserAgent := 'MSIE';
                                                                                    Request.Host := 'www.youtube.com';
                                                                            End;
                                                                            IdHTTP.Get(URL, WebDoc);
                                                                 
                                                                               X1 := fAnsiPos('"', WebDoc.DataString, Pos('"video_id":', WebDoc.DataString) + 11)+1;
                                                                               X2 := fAnsiPos('"', WebDoc.DataString, X1);
                                                                               FullURLFile := BeginURLFile;
                                                                 
                                                                               FullURLFile := FullURLFile + copy(WebDoc.DataString, X1, X2-X1) + '&t=';
                                                                 
                                                                               X4 := fAnsiPos('"', WebDoc.DataString, Pos('"t"', WebDoc.DataString) + 3)+1;
                                                                               X5 := fAnsiPos('"', WebDoc.DataString, X4+1);
                                                                 
                                                                               FullURLFile := FullURLFile + copy(WebDoc.DataString, X4, X5-X4);
                                                                 
                                                                               if GetInetFile(FullURLFile, SaveFileName) then Result := true;
                                                                          finally
                                                                          WebDoc.Free;
                                                                          end;
                                                                     finally
                                                                        IdHTTP.Free;
                                                                     end;
                                                                End;    
                                                                end.


                                                              написано и протестировано на Delhpi 2009

                                                              А вообще ребята, парсер вам в помощь, я этот енот написал чисто для того, чтобы новичкам было от чего отталкиваться! А обновляю его от делать нечего ))
                                                                и снова всё поменяли
                                                                  и снова все исправили ))

                                                                  http://www.onlinedisk.ru/file/731468/
                                                                    Цитата Bravo @

                                                                    Файл при запуске пишет ошибку!

                                                                    Если у кого есть рабочий варинт, то прошу в студию. ;)

                                                                    тема опять актульна ;)
                                                                      Этот подойдёт? Только я не проверял работоспособность.
                                                                        Цитата Filka @
                                                                        Этот подойдёт? Только я не проверял работоспособность.

                                                                        Скачал. потребовалось установит еще два компонента.
                                                                        программа предоставляет ссылку на скачивание, однако не рабочую. пытается что-то скачать и в итоге получается просто файл на ~100 kb.
                                                                        Коротко - код не рабочий.
                                                                        надо еще разобраться может получиться, а пока тема актуальна!
                                                                          1. Получаем код страницы..
                                                                          2. Делаем ссылки читабельными..
                                                                          типа тк..
                                                                          Link:= TIdURI.URLDecode(Link);
                                                                          Потом например регисом фильтруем...TRegeXpr
                                                                          правило..
                                                                          'url=([/a-zA-Zа-яА-Я0-9- _!?.,:;"#=&%@№*]{1,500})&quality'
                                                                            Вроде всё работает проверил на последнем выложеном ролике

                                                                            Ссылка на ролик

                                                                            http://www.youtube.com/watch?v=aog_IX09as4&feature=g-logo


                                                                            Полученая ссылка на файл


                                                                            Скомпилиный файл + исходник
                                                                            http://www.onlinedisk.ru/file/885372/
                                                                              Цитата faust777 @
                                                                              Потом например регисом фильтруем...TRegeXpr
                                                                              правило..
                                                                              'url=([/a-zA-Zа-яА-Я0-9- _!?.,:;"#=&%@№*]{1,500})&quality'

                                                                              На днях что то подобное правило заглючело..
                                                                              Оказалось можно и проще...
                                                                              Rege.Expression := 'url=(.+?)&quality'; :thanks:
                                                                              Так же можно прикрутить Gzip, вес страницы при парсинге в разы меньше..
                                                                                И вновь они там что то намутили.. <_<
                                                                                Ни как в коде ссылку не могу найти.. Есть у кого рабочий пример?
                                                                                  Найди исходники "сайта" (скрипта) на пхп и там посмотри.
                                                                                  Суть в том чтоб из ролика выдернуть адрес FLV файла а его уже скачать удобным методом.

                                                                                  P.S. меняют они что-то регулярно чтобы не парсили. Чаще них меняется только формат поисковой выдачи Гугла
                                                                                  Сообщение отредактировано: Виталь -
                                                                                    Виталь Какой ПХП на гуглвском ЮТУБЕ? Кто тебе даст СЕРВЕРНЫЙ скрипт?

                                                                                    Проблема в том, что распарсить результат не получилось в этот раз.
                                                                                      Да какие скрипты.. :(
                                                                                      Вот например http://userscripts.org/scripts/show/25105 для Greasemonkey...
                                                                                      Но толку, я например далёк от этого.. крутил, вертел)..

                                                                                      Вообще ссылки то спарсить не такая и проблема.. беда в том что этого мало.
                                                                                      А именно, как различить какому формату соответствует ссылка....
                                                                                      в ссылках щас по Два itag= которые "отвечают" за формат..
                                                                                      и фишка в том, что они Разные..
                                                                                      Цитата "Например..мы знаем, что.."
                                                                                      itag=18 - MP4 360p
                                                                                      itag=34 - FLV 360p
                                                                                      itag=43 - WebM 360p


                                                                                      И нам нужно ссылку для MP4 360.. вот тут то и проблемка.. как определить что есть что.
                                                                                      в ссылке может быть два одинаковых например два itag=18..
                                                                                      а может быть itag=18 и itag=34..
                                                                                      при этом в следующей ссылке будет itag=18 и itag=43 и т.д..а могут быть вообще другие.

                                                                                      На video/mp4 тоже можно особо не смотреть.. так как может быть video/x-flv или video/webm, а на деле mp4..и.п..
                                                                                      И нужно оставить только Одни правильный itag=..
                                                                                      Такая вот фигня.. :wall:
                                                                                      Сообщение отредактировано: faust777 -
                                                                                        Ха, вроде раскурил) :P
                                                                                        Короче..
                                                                                        Неподалёку от ссылок.. есть параметр fmt_list=..
                                                                                        Там записаны форматы...
                                                                                        И короче порядок этих форматов соответствует порядку ссылок..
                                                                                        Ну а как это всё собрать, проявляем фантазию).. :thanks:
                                                                                          faust777
                                                                                          Тут что-то есть на эту тему, но на C#...
                                                                                          Сообщение отредактировано: Filka -
                                                                                            Filka
                                                                                            Да не, мне то уже не нужно.. основная проблема то была, это в различие ссылок и она решаема как я уже выше написал)..
                                                                                            В общем решение уже как бы есть..а кто как реализует, уже его дело. Ну а прежде чем смотреть чужие варианты нужно убедиться,что они работают..
                                                                                            судя по регису..
                                                                                            ExpandedWrap disabled
                                                                                              Regex(@"url=(?<url>http://.+?)&quality=");

                                                                                            это старый вариант.. хотя там тоже парсится ещё и fmt_list=.. может там как то по своему, не знаю.
                                                                                            Сообщение отредактировано: faust777 -
                                                                                              Цитата ttiger
                                                                                              Виталь Какой ПХП на гуглвском ЮТУБЕ? Кто тебе даст СЕРВЕРНЫЙ скрипт?

                                                                                              По интернетам ходил исходик скрипта-сайта типа savefrom.net - ты ему ссылку которую дает YouTube а он тебе в ответ прямую ссылку на скачивание flv. Я имел в виду что надо достать этот исходник и посмотреть как там сделано...

                                                                                              Но раз проблема решена - мой совет уже бесполезен :crazy:
                                                                                              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                                                              0 пользователей:


                                                                                              Рейтинг@Mail.ru
                                                                                              [ Script execution time: 0.1342 ]   [ 15 queries used ]   [ Generated: 24.10.26, 05:47 GMT ]