谷歌驱动器api file_get_contents和refferer

时间:2017-06-30 13:19:35

标签: php jquery file-get-contents

我正在尝试列出google驱动器文件夹中的文件。

如果我使用jquery,我可以成功获得结果:

var url = "https://www.googleapis.com/drive/v3/files?q='" + FOLDER_ID + "'+in+parents&key=" + API_KEY;

$.ajax({
    url: url,
    dataType: "jsonp"
}).done(function(response) {
     //I get my results successfully
});

但是我想用php得到这个结果,但是当我运行它时:

$url = 'https://www.googleapis.com/drive/v3/files?q='.$FOLDER_ID.'+in+parents&key='.$API_KEY;
$content = file_get_contents($url);
$response = json_decode($content, true);
echo json_encode($response);
exit;

我收到错误:

  

file_get_contents(...):无法打开流:HTTP请求失败! HTTP / 1.0 403禁止

如果我在浏览器中运行它:

https://www.googleapis.com/drive/v3/files?q={FOLDER_ID}+in+parents&key={API_KEY}

我明白了:

  

请求未指定任何引用。请确保客户端正在发送引用或使用API​​控制台删除引用限制。

我已经在google开发者控制台中为我的网站和localhost设置了引荐来源。

有人可以解释一下jquery和php调用之间有什么区别,为什么php调用失败?

1 个答案:

答案 0 :(得分:0)

它是标题或Cookie。

当您使用jQuery执行请求时,用户代理,IP和用户的额外标题将发送给Google以及用户的Cookie(允许用户保持登录状态)。当您使用PHP执行此操作时,此数据将丢失,因为您,服务器将成为发送数据的人,而不是用户或用户的浏览器。

Google可能会阻止使用无效用户代理作为第一道防线的请求,或者您需要登录。

在您注销时尝试执行相同的jQuery AJAX请求。如果它不起作用,你就会知道你的问题。

否则,您需要更改标题。看看这个:PHP file_get_contents() and setting request headers。当然,您需要进行一些反复试验,以确定哪个丢失的标头允许请求通过。

关于referrer,jQuery有效,因为referrer标头被设置为您当前所在的页面。当你直接进入页面时,没有引用者标题。使用file_get_contents发出的PHP请求没有引荐来源,因为它们对于它们没有任何意义。