четверг, 7 февраля 2013 г.

Как скачать видео или звук с OnlineTV.ru

Не люблю я смотреть видео на сайтах, а самый любимый жанр, всяческие разговоры, вообще смотреть особого смысла нет, предпочитаю слушать с плейера по пути на работу/ с работы. Поэтому, когда на OnlineTV.ru появилась Вся правда о... происхождении человека с доктором биологии Александром Марковым, а кнопки Скачать не обнаружилось, пришлось немножко поковыряться внутрях OnlineTV.ru и найти способ получить вожделенный mp3, ну и mp4 если надо.

Загружать потоковое видео по протоколу RTMP умеют спец.утилитка RTMPDump, ну и, сюрприз, сюрприз :) FFmpeg. Но просто по-тупому взять из исходников страницы http://www.onlinetv.ru/video/665/ свойства плейера streamer: "rtmp://cdn0.onlinetv.ru:1935/onlinetvload/", file: "onlinetv/19/665/evolution.mp4,onlinetv/19/665/evolution_hq.mp4" и подсунуть этим утилиткам не получится, во-первых, серверу, кроме адреса файла надо подсовывать еще дополнительные поля, а во-вторых, как оказалось файлы лежат по другому адресу.

Попытка поковырять обмен браузера и сервера при помощи Microsoft Network Monitor обломалась :( т.к. не смог найти для него парсер RTMP, а без парсера протокола все RTMP пакеты Microsoft Network Monitor показывает как голимый TCP - ничего не поймёшь.

Зато, как оказалось, хорошо показывает RTMP Wireshark. Запускаем Wireshark, включаем слежение, ставим фильтр rtmpt, обновляем страницу http://www.onlinetv.ru/video/665/, запускаем просмотр видео, видим сначала connect по первоначальному адресу, потом connect после переадресации и реальный адрес rtmp://, запомним также свойство swfUrl, пригодится:



несколькими строками ниже - команда play с реальным адресом файла:



Из распотрошенных данных можно составить команду на загрузку при помощи RTMPDump:
rtmpdump.exe --rtmp "rtmp://88.212.207.11:1935/onlinetv/mp4:onlinetv/19/665/evolution.mp4" \
--playpath "mp4:onlinetv/19/665/evolution.mp4" \
--swfUrl "http://www.onlinetv.ru/static/flash/player.swf?v=1.0.5.5" \
-o evolution.flv
(если что-то не идет можно добавить ключик --verbose, чтоб получить побольше информации), или при помощи FFmpeg:
ffmpeg -i "rtmp://88.212.207.11:1935/onlinetv/mp4:onlinetv/19/665/evolution.mp4 \
playpath=mp4:onlinetv/19/665/evolution.mp4 \
swfUrl=http://www.onlinetv.ru/static/flash/player.swf?v=1.0.5.5" \
-c copy evolution.mp4
Собственно FFmpeg'ом можно создавать сразу mp3:
ffmpeg -i "rtmp://88.212.207.11:1935/onlinetv/mp4:onlinetv/19/665/evolution.mp4 \
playpath=mp4:onlinetv/19/665/evolution.mp4 \
swfUrl=http://www.onlinetv.ru/static/flash/player.swf?v=1.0.5.5" \
-vn evolution.mp3

Вуаля! Дальше, пока разработчики сайта OnlineTV.ru что-нибудь не поменяют, можно так глубоко не потрошить, а брать из исходников страницы, например http://www.onlinetv.ru/video/658/, адрес файла file: "onlinetv/32/658/hakamada.mp4,onlinetv/32/658/hakamada_hq.mp4" и составлять команду для загрузки:
ffmpeg -i "rtmp://88.212.207.11:1935/onlinetv/mp4:onlinetv/32/658/hakamada_hq.mp4 \
playpath=mp4:onlinetv/32/658/hakamada_hq.mp4 \
swfUrl=http://www.onlinetv.ru/static/flash/player.swf?v=1.0.5.5" \
-c copy hakamada_hq.mp4

з.ы. обратные слэши - \ - не все командные оболочки адекватно воспринимают как визуальный разрыв длинной строки, так что, на всякий случай - вводите всю команду одной длинной строкой.

UPD: А вот ещё вариант.

2 комментария:

  1. вытащить урлы получилось, а с rtmp dump проблема: rtmp server sent error
    rtmp server requested close
    cистеме не удается найти указанный путь

    видео вот
    Property 'swfUrl' String 'http://www.onlinetv.ru/static/flash/player.swf?v=1.0.5.9 '

    Property 'tcUrl' String 'rtmp://cdn0.onlinetv.ru:1935/onlinetvload/'

    881 68.803187000 192.168.0.126 88.212.207.11 RTMP 128 play('mp4:onlinetv/19/794/pushnoy.mp4') | Set Buffer Length 1,5000ms

    и составленный путь: C:\FFmpeg\ffmpeg-20130418-git-ee94362-win32-static\bin\ffmpeg -i "rtmp://88.212.207.11:128/onlinetv/mp4: onlinetv/19/794/pushnoy.mp4 \
    :\FFmpeg\ffmpeg-20130418-git-ee94362-win32-static\bin\ffmpeg playpath=mp4: onlinetv/19/794/pushnoy.mp4 \
    :\FFmpeg\ffmpeg-20130418-git-ee94362-win32-static\bin\ffmpeg swfUrl='http://www.onlinetv.ru/static/flash/player.swf?v=1.0.5.9" \
    :\FFmpeg\ffmpeg-20130418-git-ee94362-win32-static\bin\ffmpeg -c copy pushnoy.mp4

    rtmpdump\rtmpdump-2.1-windows\rtmpdump\rtmpdump.exe --rtmp "rtmp://88.212.207.11:1935/onlinetv/mp4:onlinetv/19/794/pushnoy.mp4" \
    --playpath "mp4:onlinetv/19/794/pushnoy.mp4" \

    ОтветитьУдалить
    Ответы
    1. почему-то в команде ffmpeg номер порта 128, а должен быть 1935, вот так нормально качает:

      ffmpeg -i "rtmp://88.212.207.11:1935/onlinetv/mp4:onlinetv/19/794/pushnoy.mp4 playpath=mp4:onlinetv/19/794/pushnoy.mp4 swfUrl=http://www.onlinetv.ru/static/flash/player.swf?v=1.0.5.5" -c copy pushnoy.mp4

      Удалить