Как я могу найти ссылки для загрузки видео Vimeo? - PullRequest
23 голосов
/ 16 декабря 2010

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

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

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

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

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

Как я получаювидео на данный момент:

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

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

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

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

Ответы [ 8 ]

8 голосов
/ 20 декабря 2010

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

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

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

    • request_signature
    • request_signature_expires
    • isHD
  5. Затем я сгенерирую ссылку:

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

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

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

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

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

3 голосов
/ 03 декабря 2014

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

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

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

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

3 голосов
/ 22 декабря 2012

Этот 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>";

источник

1 голос
/ 19 февраля 2015

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

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

Просто запустите инструменты разработчика (Opera Dragonfly, инструменты разработчика Chrome и т. Д.), Выберите Сеть, и все:

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

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

1 голос
/ 23 мая 2011

К вашему сведению, приведенный выше пример не сработает, но он близок. Вам необходимо отправить поддельные куки. Таким образом, в основном, когда вы посещаете страницу с 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;
    }
0 голосов
/ 27 мая 2017

Ответы на это в SuperUser были устаревшими, поэтому я подумал, что опубликую это здесь (недостаточно репутации, чтобы публиковать там)файл json, содержащий ссылку на размещенное на CDN видео akamai вместе с токеном, который предоставляет 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

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

0 голосов
/ 16 апреля 2014

Алгоритм выглядит так:

  • Входные данные: 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'));
0 голосов
/ 24 июня 2013

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

$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);
    }
}
...