快速浏览网站的源代码,它会生成以下 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 模拟一下
向该 url 发出 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 错误请求。没什么大不了的,从您自己的驱动器下载文件时,通过查看请求标头来模拟它仍然很容易。我不愿意分享复制和粘贴解决方案,因为上述方法仍然有效,您只需要添加一些标题,而 StackOverflow 不是免费的编码服务,我也不需要维护我写过的每一个答案。祝你好运。