Я видел, что сегодня 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
. http://vimeo.com/moogaloop/load/clip:video_id;
, проанализировать XML и найти необходимую информацию:
Создайте ссылку:
$video_link = "http://vimeo.com/moogaloop/play/clip:".$video_id."/".$request_signature."/".$request_signature_expires."/?q=".$quality."";
Если я сделаю это вручную через браузер, это сработает, но если я сделаю это через скрипт, это не произойдет.
Проведя несколько часов, узнав, как я могу получить прямую ссылку на vimeo, я нашел хорошее решение. Итак, вот шаги для пользователей, которые хотят загружать и передавать видео src непосредственно из vimeo. Имейте в виду, что они блокируют все IP-адреса и, вероятно, узлы, которые загружают видео таким образом, поэтому я просто прекратил использовать их службы, и я больше никогда их не буду использовать :).
Шаги для получения источников видео:
http://vimeo.com/video_id
video_id
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 :).
Этот 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>";
источник
Предупреждение Описанные выше методы не поддерживаются Vimeo. Нет никакой гарантии, что они работают прямо сейчас или будут продолжать работать в будущем. Они могут (и, вероятно, будут) разорваться в любой момент без предварительного уведомления.
Единственный официально поддерживаемый метод доступа к URL-адресам видеофайлов – через API .
Если вы пытаетесь получить доступ к URL-адресам принадлежащих вам видео, у вас должна быть учетная запись PRO.
Если вы пытаетесь получить доступ к URL-адресам видео, которые у вас нет, вы должны вставить видео или открыть его с помощью приложения Vimeo iOS .
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; }
Нет необходимости в каких-либо скриптах, не говоря уже о PHP.
Я хотел загрузить защищенное видео (встроенное на конкретный веб-сайт), что даже на vimeo.com невозможно воспроизвести из-за «настроек конфиденциальности».
Просто запустите инструменты разработчика (Opera Dragonfly, инструменты разработчика Chrome, что угодно), выберите «Сеть», и вы туда:
http://pdl.vimeocdn.com/23062/181/302074466.mp4?token2=1424299768_bbeb6039c037cd429cd560d668ec851e&aksessionid=1f4d289cd1a3abe1
Метод: Получить
Текст состояния: 206 Частичный контент
Тип: видео / mp4
Просто скопируйте этот первый URL-адрес и загрузите с помощью какого-либо инструмента (я использовал «wget»).
Сохраненный.
Быстрый и грязный подход:
$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); } }
Страница Vimeo немного медленна с моего конца, но попробуйте этот трюк при загрузке любых видео с любого сайта. http://www.youtube.com/watch?v=tWxY1JpdpNk
Алгоритм выглядит так:
Вот мой простой класс, который работает на этот момент:
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'));
Ответы на это на 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 – это номера, которые я заменил для конфиденциальности.