Подтвердить что ты не робот

Как найти ссылки для загрузки видео?

Я видел, что сегодня vimeo изменил способ потоковой передачи видео, и я больше не могу передавать их видео. Я видел, что когда я создаю ссылку на видео, которое было, например:

http://vimeo.com/moogaloop/play/clip:6649390/1eab2a25f30f1aadaf5e306d0f40fd6c/1292498602/?q=hd

Он перенаправляет меня на страницу с сообщением "Permission denied". Я пробовал использовать завиток, но безуспешно. Я понюхал трафик, и я увидел, что он передает из чего-то вроде:

http://av.vimeo.com/02047/623/34209065.mp4?token=1292496582_34de09a6d13212cf26af08357d311c30

Кто-нибудь знает, как получить рабочий URL-адрес видеофайла?

В настоящее время я получаю видеоролики:

  • Выберите ссылку http://vimeo.com/video_id.
  • Получить только video_id.
  • Получить XML для видео http://vimeo.com/moogaloop/load/clip:video_id;.
  • проанализируйте XML и найдите необходимую информацию:

    • request_signature
    • request_signature_expires
    • isHD
  • Создайте ссылку:

    $video_link = "http://vimeo.com/moogaloop/play/clip:".$video_id."/".$request_signature."/".$request_signature_expires."/?q=".$quality."";
    

Если я делаю это вручную через браузер, он работает, но если я делаю это через script, это не так.

4b9b3361

Ответ 1

Проведя несколько часов, узнав, как я могу получить прямую ссылку на vimeo, я нашел хорошее решение. Итак, вот шаги для пользователей, которые хотят скачать и потоковое видео src непосредственно из vimeo. Имейте в виду, что они блокируют все IP-адреса и, возможно, узлы, которые загружают видео таким образом, поэтому я просто прекратил использовать их службы, и я больше никогда их не буду использовать:).

Шаги для получения источников видео:

  • выберите ссылку http://vimeo.com/video_id
  • получить только video_id
  • получить xml для видео http://vimeo.com/moogaloop/load/clip:video_id;
  • проанализируйте xml, и я найду необходимую информацию:

    • request_signature
    • request_signature_expires
    • isHD
  • Затем я создаю ссылку:

    $video_link = "http://vimeo.com/moogaloop/play/clip:".$video_id."/".$request_signature."/".$request_signature_expires."/?q=".$quality."";
    
  • Затем, если вы php dev, вы вызываете команду wget через exec таким образом

    exec("wget -b '$video_link' -a 'wget.log' -O -");

  • Затем вы читаете журнал и узнаете, какую ссылку вы ищете. Вы можете просто проанализировать файл журнала. Прямая ссылка находится между "Расположение:" и "[далее]"

  • Вы возвращаете прямую ссылку и очищаете файл журнала:)

ПРИМЕЧАНИЕ. Помните, что это не будет работать вечно. Рано или поздно они заблокируют ваш ip:).

Ответ 2

Этот javascript работает для меня.

var player = document.getElementsByClassName("player")[0].getAttribute("id");
player = eval(player.replace("player_", "clip"));
var time = player.config.request.timestamp;
var sig = player.config.request.signature;
var clip_id = window.location.href.substring(17);

var url = "http://player.vimeo.com/play_redirect" +
  "?clip_id=" + clip_id +
  "&sig=" + sig +
  "&time=" + time;

var v = document.getElementById("menu");
v.style.fontSize = "4em";
v.style.lineHeight = "1em";

v.innerHTML =
  "<a href='" + url + "'>SD</a>, " +
  "<a href='" + url + "&quality=hd'>HD</a>";

источник

Ответ 3

Предупреждение Описанные выше методы не поддерживаются Vimeo. Нет никакой гарантии, что они работают прямо сейчас или будут продолжать работать в будущем. Они могут (и, вероятно, будут) разорваться в любой момент без предварительного уведомления.

Единственный официально поддерживаемый способ доступа к URL-адресам видеофайлов - через API.

Если вы пытаетесь получить доступ к URL-адресам принадлежащих вам видео, у вас должна быть учетная запись PRO.

Если вы пытаетесь получить доступ к URL-адресам видео, которые у вас нет, вы должны встроить видео или открыть его с помощью приложения Vimeo iOS.

Ответ 4

FYI, приведенный выше пример не будет работать, но он близок. Вам нужно отправить поддельные куки. Таким образом, в основном, когда вы посещаете страницу с помощью XML, вам необходимо захватить файлы cookie, а затем отправить эти файлы cookie, которые вы ранее получили, посетив окончательный URL-адрес видео. Итак, как вы это делаете в PHP (используя Yii) с curl:

public function actionVimeo($video_id)
    { 
        $xml_url = "http://vimeo.com/moogaloop/load/clip:$video_id";

        $ch = curl_init($xml_url);           
        $cookieFile = Yii::app()->basePath . '/runtime/vimeocookie'. time().'.txt'; //replace this line with code to generate a writeable path in your application
        curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); //the cookie file will be populated with cookies received while viewing the xml page   
        curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); //you need to send a user agent here and it must be the same below when you visit the video url
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $output = curl_exec($ch);
        curl_close($ch);


        $xml = simplexml_load_string($output);
        $request_signature = $xml->request_signature;
        $request_signature_expires = $xml->request_signature_expires;
        $vid_url = "http://vimeo.com/moogaloop/play/clip:".$video_id."/".$request_signature."/".$request_signature_expires."/?q=sd";

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL,$vid_url);         
        curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);  //same user agent as on previous vimeo page you visited       
        curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); //the cookies in that cookie file will be used while visiting the video URL         
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); //vimeo changes the header location, so you gotta follow it
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $video = curl_exec($ch);
        curl_close($ch);

        unlink($cookieFile); //remove the temporary cookie file

        $savePath = Yii::app()->basePath . '/runtime/testvim.mp4'; //change this to a path your application can write the final video to
        file_put_contents($savePath, $video);

        exit;
    }

Ответ 5

Нет необходимости в каких-либо скриптах, не говоря уже о PHP.

Я хотел загрузить защищенное видео (встроенное на конкретный веб-сайт), что даже на vimeo.com невозможно воспроизвести из-за "настроек конфиденциальности".

Просто запускайте инструменты разработчика (Opera Dragonfly, инструменты разработчика Chrome, независимо от того), выберите "Сеть", и вы идете:

http://pdl.vimeocdn.com/23062/181/302074466.mp4?token2=1424299768_bbeb6039c037cd429cd560d668ec851e&aksessionid=1f4d289cd1a3abe1
Метод: Получить Текст состояния: 206 Частичный контент
Тип: видео /mp 4

Просто скопируйте этот первый URL-адрес и загрузите с помощью некоторого инструмента (я использовал "wget" ).
Сохраненный.

Ответ 6

Быстрый и грязный подход:

$base = 'http://player.vimeo.com/play_redirect';

$curl = curl_init(sprintf('http://player.vimeo.com/video/%s', $_GET['id']));
curl_setopt_array($curl, array(
    CURLOPT_USERAGENT => $_SERVER['HTTP_USER_AGENT'],
    CURLOPT_RETURNTRANSFER => true
));

preg_match('/g:(\{.*?\}),a/s', curl_exec($curl), $match);
curl_close($curl);

$json = json_decode($match[1])->request;
$url = sprintf('%s?quality=sd&clip_id=%s&time=%d&sig=%s',
    $base,
    $_GET['id'],
    $json->timestamp,
    $json->signature
);

$curl = curl_init($url);
curl_setopt_array($curl, array(
    CURLOPT_HEADER => true,
    CURLOPT_NOBODY => true,
    CURLOPT_USERAGENT => $_SERVER['HTTP_USER_AGENT'],
    CURLOPT_RETURNTRANSFER => true
));

$headers = explode("\r\n", curl_exec($curl));
curl_close($curl);

foreach ($headers as $header) {
    if ($header) {
        header($header);
    }
}

Ответ 7

Страница Vimeo немного медленна с моего конца, но попробуйте этот трюк при загрузке любых видео с любого сайта. http://www.youtube.com/watch?v=tWxY1JpdpNk

Ответ 8

Алгоритм выглядит следующим образом:

  • Входные данные: vimeoUrl.
  • content = getRemoteContent (vimeoUrl).
  • Разбор содержимого для поиска и извлечения значения из data-config-url атрибут.
  • Перейдите в data-config-url и загрузите контент как объект JSON: $ video = json_decode ($ this- > getRemoteContent ($ video- > getAttribute ('data-config-url')));
  • Вернуть $video- > request- > files- > h264- > sd- > url - это вернет прямая ссылка для видео качества SD.

Вот мой простой класс, который работает на этот момент:

class VideoController
{

    /**
     * @var array Vimeo video quality priority
     */
    public $vimeoQualityPrioritet = array('sd', 'hd', 'mobile');

    /**
     * @var string Vimeo video codec priority
     */
    public $vimeoVideoCodec = 'h264';

    /**
     * Get direct URL to Vimeo video file
     * 
     * @param string $url to video on Vimeo
     * @return string file URL
     */
    public function getVimeoDirectUrl($url)
    {
        $result = '';
        $videoInfo = $this->getVimeoVideoInfo($url);
        if ($videoInfo && $videoObject = $this->getVimeoQualityVideo($videoInfo->request->files))
        {
            $result = $videoObject->url;
        }
        return $result;
    }

    /**
     * Get Vimeo video info
     * 
     * @param string $url to video on Vimeo
     * @return \stdClass|null result
     */
    public function getVimeoVideoInfo($url)
    {
        $videoInfo = null;
        $page = $this->getRemoteContent($url);
        $dom = new \DOMDocument("1.0", "utf-8");
        libxml_use_internal_errors(true);
        $dom->loadHTML('<?xml version="1.0" encoding="UTF-8"?>' . "\n" . $page);
        $xPath = new \DOMXpath($dom);
        $video = $xPath->query('//div[@data-config-url]');
        if ($video)
        {
            $videoObj = json_decode($this->getRemoteContent($video->item(0)->getAttribute('data-config-url')));
            if (!property_exists($videoObj, 'message'))
            {
                $videoInfo = $videoObj;
            }
        }
        return $videoInfo;
    }

    /**
     * Get vimeo video object
     * 
     * @param stdClass $files object of Vimeo files
     * @return stdClass Video file object
     */
    public function getVimeoQualityVideo($files)
    {
        $video = null;
        if (!property_exists($files, $this->vimeoVideoCodec) && count($files->codecs))
        {
            $this->vimeoVideoCodec = array_shift($files->codecs);
        }
        $codecFiles = $files->{$this->vimeoVideoCodec};
        foreach ($this->vimeoQualityPrioritet as $quality)
        {
            if (property_exists($codecFiles, $quality))
            {
                $video = $codecFiles->{$quality};
                break;
            }
        }
        if (!$video)
        {
            foreach (get_object_vars($codecFiles) as $file)
            {
                $video = $file;
                break;
            }
        }
        return $video;
    }

    /**
     * Get remote content by URL
     * 
     * @param string $url remote page URL
     * @return string result content
     */
    public function getRemoteContent($url)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
        curl_setopt($ch, CURLOPT_TIMEOUT, 20);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
        curl_setopt($ch, CURLOPT_USERAGENT, 'spider');
        $content = curl_exec($ch);

        curl_close($ch);

        return $content;
    }

}

Использование:

$video = new VideoController;
var_dump($video->getVimeoDirectUrl('http://vimeo.com/90747156'));

Ответ 9

Ответы для этого на SuperUser были устаревшими, поэтому я думал, что отправлю его здесь (недостаточно репутации для публикации там)

Итак, я только что записал XHR-запросы с помощью Chrome devtools, и первый запрос был для json файла, содержащего ссылку на видео в формате akamai CDN, наряду с маркером akamai. Этот токен важен. Это хэш, который включает временную метку, поэтому ссылки для видео здесь должны быть загружены несколько быстро или запросы будут отклонены.

Формат для этого файла JSON был в форме:

https://player.vimeo.com/video/VIDEO_ID/config?byline=0&collections=1&context=Vimeo%5CController%5CClipController.main&default_to_hd=1&outro=nothing&portrait=0&share=1&title=0&watch_trailer=0&s=6cffff97fffffffffff4ffffffff679ec66ffff_14ffffffff

И тогда я просто искал объект самого высокого качества в JSON (1080p) и загрузил этот файл. В формате:

https://fpdl.vimeocdn.com/vimeo-prod-skyfire-std-us/01/XXXXX/8/XXXX/XXXXXXXX.mp4?token=XXXXXXX-0xXXXXXXXXXXXXX

Обратите внимание, что Xs - это номера, которые я заменил для конфиденциальности.