生成谷歌驱动器链接的自定义直接下载链接

时间:2017-12-04 01:20:07

标签: php google-drive-api

我想在不打开网页的情况下生成谷歌驱动器直接下载链接。

我发现有一个网站做同样的事情,但我没有发现他是怎么做的。

下面是生成直接下载链接而不打开谷歌驱动器页面的网站。

https://links-safety.com/download.php?id=0B475ByfcR9n4a1JMVEZxQno2Tmc

0B475ByfcR9n4a1JMVEZxQno2Tmc是谷歌文件并替换为任何文件。

任何人都可以告诉我该怎么做?我想像上面的网站一样制作相同的页面。

我尝试了这个网址,但它没有用。而不是开始下载它打开页面。

https://drive.google.com/uc?id=0BwSYfbOPSw89Rno4LTZpSGF6RUE

1 个答案:

答案 0 :(得分:3)

快速浏览一下网站的来源,它会生成以下javascript。

<script>
    setTimeout(function() {
        window.location.href = "https://doc-0o-a0-docs.googleusercontent.com/docs/securesc/ha0ro937gcuc7l7deffksulhg5h7mbp1/nemv3kbhggb02fn2933p80ec5vsi521t/1512345600000/10410701494873540224/*/0B475ByfcR9n4a1JMVEZxQno2Tmc?e=download";
    }, 300);
</script>

但是这个网址来自哪里?

当它确实要求在谷歌上确认时,稍微摆弄并观看控制台,你可以看到它发出POST请求并返回一些json。

)]}'
{"disposition":"SCAN_CLEAN","downloadUrl":"https://doc-0c-9k-docs.googleusercontent.com/docs/securesc/aonp7ed1gjmns5tl5di4fl0psa1cppk8/16panrhf9etu7sqgddkaduij5anokf8t/1512345600000/17294955007197410767/17294955007197410767/0ByzJffaEk18uN2ZLeGlIRGVOaDJmWS1WU1RUN3dXUGdtUUx3?e\u003ddownload","fileName":"install.sh","scanResult":"OK","sizeBytes":4936}

所以只需用PHP模拟它

向该网址发出json POST请求,google将使用json进行响应,然后删除)]}' json解码它,然后使用标头重定向到该文件。

<?php
$id = '0B475ByfcR9n4a1JMVEZxQno2Tmc';

$ch = curl_init('https://drive.google.com/uc?id='.$id.'&export=download');                                                                      
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
curl_setopt($ch, CURLOPT_POSTFIELDS, []);                                                                  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    ... see notice below
));                                                                                                                                                                          
$result = curl_exec($ch);

$object = json_decode(str_replace(')]}\'', '', $result));

exit(header('Location: '. $object->downloadUrl));

修改(08-04-18)

看起来已经添加了一些额外的标头,如果缺少它会抛出400 Bad Request。没什么大不了的,从你自己的驱动器下载文件时,通过查看请求标题来模拟它仍然很容易。我不愿意共享一个复制和粘贴解决方案,因为上面仍然有效,你只需要添加一些标题,StackOverflow不是一个免费的编码服务,我也不需要保持我写过的每一个答案。祝你好运。