У меня есть видео-файл с Google Drive (например, https://drive.google.com/file/d/FILE_ID/view) и я хочу получить ссылку на redirector.googlevideo.com.
Как сайты нравятся http://api.getlinkdrive.com/ сделай это? Я пытался использовать Google Drive REST API (как v2, так и v3), но все еще не могу найти способ сделать это. Многие телешоу и сайты фильмов размещают свой контент на диске Google и используют этот «скрытый» URL, срок действия которого истекает, так что вы не сможете, например, вставить его где-то еще.
Самое близкое, что я получил, — это перейти на docs.google.com/get_video_info?docid=FILE_ID и получить ссылки fmt_stream_map, но это не возвращает нужную мне ссылку перенаправителя.
Он говорит о том, чтобы получить от Google Drive все качества в формате 360p, 480p, 720p, 1080p и преобразовать его непосредственно перед / videoplayback в redirector.googlevideo.com и сделать его видео / mp4 для воспроизведения в JW Player. У меня есть полный сценарий, но у него есть небольшая проблема, он говорит, что запрещено 403, и это из-за изменений, внесенных Google в API. Посмотрите на коды в PHP и дайте мне знать, если кто-то может это исправить, я опубликую полный сценарий позже.
function Drive($link) {
$url = urldecode($link);
$get = curl1($url);
$data = explode(',["fmt_stream_map","', $get);
$data = explode('"]', $data[1]);
$data = str_replace(array('\u003d', '\u0026'), array('=', '&'), $data[0]);
$data = explode(',', $data);
asort($data);
foreach($data as $list) {
$data2 = explode('|', $list);
if($data2[0] == 37) {$q1080p = preg_replace("/\/[^\/]+\.google\.com/","/redirector.googlevideo.com",$data2[1]);} // 1080P
if($data2[0] == 22) {$q720p = preg_replace("/\/[^\/]+\.google\.com/","/redirector.googlevideo.com",$data2[1]);} // 720P
if($data2[0] == 59) {$q480p = preg_replace("/\/[^\/]+\.google\.com/","/redirector.googlevideo.com",$data2[1]);} // 480P
if($data2[0] == 18) {$q360p = preg_replace("/\/[^\/]+\.google\.com/","/redirector.googlevideo.com",$data2[1]);} // 360P
}
$js[0][0] = "$q1080p";
$js[0][1] = "$q720p";
$js[0][2] = "$q480p";
$js[0][3] = "$q360p";
$js[1][0] = "1080P";
$js[1][1] = "720P";
$js[1][2] = "480P";
$js[1][3] = "360P";
return $js;
}
if ($jw[0][0] != "") {
echo('{file: "'.urldecode($jw[0][0]).'",type: "video/mp4",label: "'.urldecode($jw[1][0]).'"},');
}
if ($jw[0][1] != "") {
echo('{file: "'.urldecode($jw[0][1]).'",type: "video/mp4",label: "'.urldecode($jw[1][1]).'"},');
}
if ($jw[0][2] != "") {
echo('{file: "'.urldecode($jw[0][2]).'",type: "video/mp4",label: "'.urldecode($jw[1][2]).'"},');
}
if ($jw[0][3] != "") {
echo('{file: "'.urldecode($jw[0][3]).'",type: "video/mp4",label: "'.urldecode($jw[1][3]).'"},');
}
Я реализовал лучший алгоритм из предыдущего ответа.
function curl($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, $return);
$result = curl_exec($ch);
curl_close($ch);
return $result;
}
function Drive($id) {
$o = [];
$url = "https://docs.google.com/get_video_info?docid=$id";
$get = curl($url);
parse_str($get, $out);
$data = explode(",", $out["fmt_stream_map"]);
foreach($data as $d) {
switch ((int)substr($d, 0, 2)) {
case 18:
$r = "360P";
break;
case 22:
$r = "720P";
break;
case 37:
$r = "1080P";
break;
case 59:
$r = "480P";
break;
default:
break;
}
$o[$r] = substr(preg_replace("/\/[^\/]+\.google\.com/","/redirector.googlevideo.com", $d), 3);
}
ksort($o);
return $o;
}
$jw = Drive(FILE_ID_HERE);
foreach ($jw as $k => $r) {
echo json_encode(array("file"=> $r, "type"=> "video/mp4", "label"=> $k))."\n";
}
Код PHP не будет работать здесь и даже бессмысленно, потому что он вернет результат на стороне сервера.
Это мой код Javascript / Ajax.
К сожалению, вы должны использовать Расширение Access-Control-Allow-Origin в браузере Chrome.
Во-первых, пожалуйста, смотрите этот скриншот консольного окна.
<!DOCTYPE html>
<html>
<head>
<script src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>
<script src="https://content.jwplatform.com/libraries/YOUR-JW-PLAYER-LICENSE-KEY.js"></script>
</head>
<body>
<p id="urls"></p>
<div id="myElement"></div>
</body>
<script>
var docid = "0B4Mn0g4wWmQ1ZThycVhOcDJQc2c";
var api_url = "https://docs.google.com/get_video_info";
var ans = {};
var url = "";
getGoogleVideoUrl();
function getGoogleVideoUrl(){
$.ajax({
url: api_url,
type: "get",
data: {
docid: docid,
},
success: function(response) {
//
// get value of which key is 'fmt_stream_map'.
//
var fmt_stream_map = getQueryVariable(response, 'fmt_stream_map');
//
// split my comma
//
var maps = fmt_stream_map.split("%2C");
//
// loop all links,
//
var purl = "";
for (x in maps) {
var res = decodeURIComponent(decodeURIComponent(maps[x])).split('|');
// purl = res[1].replace(new RegExp("/\/[^\/]+\.google\.com/", 'g'),"//redirector.googlevideo.com/");
// purl = res[1].replace(new RegExp("\.google\.com/", 'g'),".googlevideo.com/");
purl = res[1];
//.replace(/.c.docs.google.com/g,".googlevideo.com")
//.replace(/app=explorer/g,"app=storage")
//.replace(/key=ck2/g,"key=cms1")
//.replace(/&cp=/g,"&api=")
//.replace(/,cp&/g,',api&')
//.replace(/,cp,/g,',api,')
//.replace(/=cp,/g,'=api,')
//.replace(/&sparams=/g,'&cms_redirect=yes&sparams=');
switch (parseInt(res[0])) {
case 5:
quality = 'Low Quality, 240p, FLV, 400x240';
break;
case 17:
quality = 'Low Quality, 144p, 3GP, 0x0';
break;
case 18:
quality = 'Medium Quality, 360p, MP4, 480x360';
break;
case 22:
quality = 'High Quality, 720p, MP4, 1280x720';
break;
case 34:
quality = 'Medium Quality, 360p, FLV, 640x360';
break;
case 35:
quality = 'Standard Definition, 480p, FLV, 854x480';
break;
case 36:
quality = 'Low Quality, 240p, 3GP, 0x0';
break;
case 37:
quality = 'Full High Quality, 1080p, MP4, 1920x1080';
break;
case 38:
quality = 'Original Definition, MP4, 4096x3072';
break;
case 43:
quality = 'Medium Quality, 360p, WebM, 640x360';
break;
case 44:
quality = 'Standard Definition, 480p, WebM, 854x480';
break;
case 45:
quality = 'High Quality, 720p, WebM, 1280x720';
break;
case 46:
quality = 'Full High Quality, 1080p, WebM, 1280x720';
break;
case 82:
quality = 'Medium Quality 3D, 360p, MP4, 640x360';
break;
case 84:
quality = 'High Quality 3D, 720p, MP4, 1280x720';
break;
case 102:
quality = 'Medium Quality 3D, 360p, WebM, 640x360';
break;
case 104:
quality = 'High Quality 3D, 720p, WebM, 1280x720';
break;
default:
quality = 'transcoded (unknown) quality';
break;
}
ans[quality] = purl;
}
console.log(ans);
$('#urls').html(JSON.stringify(ans));
url = ans[Object.keys(ans)[0]];
build_player();
},
error: function(xhr) {
//Do Something to handle error
}
});
}function build_player(){
var playerInstance = jwplayer("myElement");
playerInstance.setup({
file: url,
type: "mp4",
width: 800 ,
height: 600,
});
}
function getQueryVariable(query, variable) {
var vars = query.split('&');
for (var i = 0; i < vars.length; i++) {
var pair = vars[i].split('=');
if (decodeURIComponent(pair[0]) == variable) {
//return decodeURIComponent(pair[1]);
return pair[1];
}
}
console.log('Query variable %s not found', variable);
return "";
}
</script>
</html>
Этот код работает в основном, но не играет в компоненте jwplayer.
Однако, если вы введете этот URL, «https://docs.google.com/get_video_info?docid=0B4Mn0g4wWmQ1ZThycVhOcDJQc2cmsgstr «, прямо в браузере chrome, получите файл JSON, проанализируйте его вручную, используйте один из URL непосредственно в этом коде в качестве URL-адреса файла jwplayer, он отлично работает, хотя и содержит тег» app = explorer «сам по себе.
Я не уверен, почему это происходит.
Поэтому я попытался сравнить 2 ссылки и некоторые параметры отличаются. Первый из приведенного выше кода и не работает, 2-й файл JSON напрямую и работает.)
ei=hJ5yWaHCKYXb-wWona2YBA
ei=KZ5yWZSkK4aFqgXAwpoo
susci=o-AC34EOoA1Wst0Heh0U_bP9epqR8K9s4UBhwlqmsxKZKwAOA
susci=o-AH82qbGL8BcWQ3BPybbvZyuNBiDd2Uasz4J0ZNXJCZwobPje
expire=1500698308
expire=1500698217
cp=QVNFUkdfV1NOSVhOOnhwOWFybUloWXNX
cp=QVNFUkdfV1JPSFhOOmpURGRUeUt3eVpv
signature=3D306FD9D9ADA683D313AABDFE057B608A6F2A39.8BB3A9C321B6BEAC8D1D5AEED2F25511DF97CE2B
signature=2C2465BDFC4D9CCFD0D4A42F38BAEF44D55AFDF1.A916937113445ABB90D18B3AE89600729CFADDE6
Почему первый не работает, а второй работает?
Есть идеи об этом?
Я почти уверен, что об этом спрашивали давным-давно, но я думаю, что смогу помочь вам на вашем пути к тому, что вы хотите. Итак, что вы хотите сделать, это пойти Настройки Google Фото и отметьте опцию, позволяющую показывать ваши видео на диске на фотографиях. Вернитесь в Google photos и выберите видео, на которое вы хотите получить прямую ссылку. Щелкните правой кнопкой мыши на миниатюру и скопируйте ссылку. Это должно что-то вроде https://lh3.googleusercontent.com/[long string]=w1278-h719-k-no
, Последняя часть, =w1278-h719-k-no
дайте ему небольшое изменение =m22
, Это автоматически сгенерирует ссылку для вас. Надеюсь, что это хорошо для вас.
Изменить: Извините, не совсем ссылка перенаправителя GoogleVideo, но это работает!
Изменить: После немного больше экспериментов, я понял, что установка его =m15
дает вам более длинную ссылку. Он работает так же, как первый. Изменение номера после m
даст вам разные разрешения. Итак, вы можете поэкспериментировать с этим.
EditL Хорошо. После еще большего количества экспериментов я загрузил два разных видео, одно на диск, а другое на фотографии. Я получил lh3.googleusercontent.com
ссылки для них обоих и получили их прямые ссылки на видео. Один из дисков был размещен на r3---something.googleusercontent.com
и один из фотографий был размещен на r5--something.googlevideo.com
, И я подумал, что если я заменю r5--something
часть этого с redirector
? Я пошел и сделал это, и хорошо, что вы знаете! Это сработало! И вот как вы получаете себе redirector.googlevideo.com
ссылка на сайт. НО, Я до сих пор не уверен, как api.getlinkdrive.com
может получить redirector.googlevideo.com
ссылка на сайт. Поскольку ссылки, сгенерированные Google, относятся к конкретным IP-адресам, это означает, что api.getlinkdrive.com
, поскольку он запросил его со своим собственным IP, но не для другого пользователя, с другим IP.
Изменить: Забыл упомянуть об этом, но я уверен, что некоторые люди заметили, что некоторые ссылки перенаправления не являются lh3.googleusercontent.com
, но 3.bp.blogspot.com
, Ну, следующие домены могут занять место lh3.googleusercontent.com
;
lh3.googleusercontent.com
lh4.googleusercontent.com
lh5.googleusercontent.com
lh6.googleusercontent.com
1.bp.blogspot.com
2.bp.blogspot.com
3.bp.blogspot.com