【发布时间】:2012-07-08 09:12:41
【问题描述】:
我想要使用 PHP 脚本直接链接到来自 Vimeo 的视频。 我设法手动找到它们,但我的 PHP 脚本不起作用。 这是倡议: 比如我拍了这个视频:http://vimeo.com/22439234
当您进入页面时,Vimeo 会生成与当前时间戳和该视频相关联的签名。此信息存储在 JavaScript 变量中,大约在第 520 行之后:
window.addEvent ('domready', function () {
然后当您点击播放时,HTML5 播放器会读取此变量并发送 HTTP 请求:
http:// player.vimeo.com/play_redirect?clip_id=37111719&sig={SIGNATURE}&time={TIMESTAMP}&quality=sd&codecs=H264,VP8,VP6&type=moogaloop_local&embed_location=
但它也适用于:
http:// player.vimeo.com/play_redirect?clip_id=37111719&sig={SIGNATURE}&time={TIMESTAMP}&quality=sd
如果此 URL 未使用打开 http://vimeo.com/22439234 的 IP 地址打开,则会返回带有错误消息的 HTTP 代码 200。
如果使用正确的 IP 地址打开此 URL,则标头“Location”会重定向到视频文件的链接:
http://av.vimeo.com/XXX/XX/XXXX.mp4?aksessionid=XXXX&token=XXXXX_XXXXXXXXX
当我手动构建此链接http://player.vimeo.com/play_redirect?...(“右键单击”>“源代码”>“第 520 行”)时,它可以工作。
但是对于 PHP 和正则表达式,它会返回带有错误消息的 HTTP code 200。
为什么?
根据我的观察,Vimeo 不会检查 HTTP 请求的标头 http:// player.vimeo.com/play_redirect?...
GET、HEAD、带 cookie、不带 cookie、引荐来源网址等...不会改变。
对于 PHP,我使用函数 file_get_contents() 和 get_headers()。
<?php
function getVimeo($id) {
$content = file_get_contents('http://vimeo.com/'.$id);
if (preg_match('#document\.getElementById\(\'player_(.+)\n#i', $content, $scriptBlock) == 0)
return 1;
preg_match('#"timestamp":([0-9]+)#i', $scriptBlock[1], $matches);
$timestamp = $matches[1];
preg_match('#"signature":"([a-z0-9]+)"#i', $scriptBlock[1], $matches);
$signature = $matches[1];
$url = 'http://player.vimeo.com/play_redirect?clip_id='.$id.'&sig='.$signature.'&time='.$timestamp.'&quality=sd';
print_r(get_headers($url, 1));
}
【问题讨论】: