我想用 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
, with cookies, without cookies, referrer 等......不会改变。
在 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));
}