file_get_contents() 每次从 api.github.com 获取数据时都出现403错误。

15
我自称是一名经验丰富的PHP开发者,但这个问题让我抓狂。我正在尝试获取仓库的发布信息以显示更新警告,但我一直返回403错误。为了简化它,我使用了GitHubs API的最简单用法:GET https://api.github.com/zen。这有点像一个hello world。
这个可以:
- 直接在浏览器中使用 - 在终端中使用一个简单的curl https://api.github.com/zen命令 - 使用类似php-github-api的PHP-Github-API-Class
这个不行:
- 从PHP脚本中使用简单的file_get_contents()函数
这是我整个简化代码:
<?php
    $content = file_get_contents("https://api.github.com/zen");
    var_dump($content);
?>

浏览器显示“警告:file_get_contents(https://api.github.com/zen):无法打开流:HTTP请求失败!HTTP/1.0 403 Forbidden”,变量$content是一个布尔值且为false。
我猜测我缺少某种http-header-fields,但既找不到这些信息在API-Docs中,也没有使用我的终端curl调用任何特殊的头文件并且可以工作。

你尝试使用Fiddler来比较不同的调用了吗? - Rick S
allow_url_fopen是否已启用? - Pitchinnate
allow_url_fopen 已启用。感谢 @RickS 推荐的工具,我将在未来的工作流程中加入它。解决方案是缺少的头字段,正如我所猜测的那样。请参见标记的答案。 - Cologne_Muc
1个回答

30
由于GitHub要求您发送UserAgent标头,因此会出现此问题。它不需要是任何特定的内容。这个可以:
$opts = [
        'http' => [
                'method' => 'GET',
                'header' => [
                        'User-Agent: PHP'
                ]
        ]
];

$context = stream_context_create($opts);
$content = file_get_contents("https://api.github.com/zen", false, $context);
var_dump($content);

输出结果为:

string(35) "Approachable is better than simple."

那个很有帮助,谢谢。你是从经验中知道的还是我错过了文档中的说明? - Cologne_Muc
3
注意:https://developer.github.com/v3/#user-agent-required 所有API请求都必须包含一个有效的User-Agent标头。没有User-Agent标头的请求将被拒绝。我们要求您使用您的GitHub用户名或应用程序名称作为User-Agent标头值。这样,如果出现问题,我们就可以联系到您。 - haakym
太棒了!我在allow_url_fopen上找到了很多信息,但我的已经开启了。这就是问题所在。我还学习了有关精妙的Zen API URL的知识。谢谢! - Justin Breen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接