【问题标题】:file_get_contents() gets 403 from api.github.com every timefile_get_contents() 每次从 api.github.com 获取 403
【发布时间】:2016-05-10 14:22:56
【问题描述】:

我称自己是一位经验丰富的 PHP 开发人员,但这让我发疯。我正在尝试获取用于显示更新警告的存储库的发布信息,但我一直返回 403 错误。为了简化它,我使用了最简单的 GitHub API 用法:GET https://api.github.com/zen。这是一个你好世界。

这行得通

  • 直接在浏览器中
  • 在终端中使用纯 curl https://api.github.com/zen
  • 使用 PHP-Github-API-Class,例如 php-github-api

这行不通

  • 使用来自 PHP 脚本的简单 file_get_contents()

这是我的整个简化代码:

<?php
    $content = file_get_contents("https://api.github.com/zen");
    var_dump($content);
?>

浏览器显示Warning: file_get_contents(https://api.github.com/zen): failed to open stream: HTTP request failed! HTTP/1.0 403 Forbidden,变量$content是布尔值,false

我想我缺少某种 http-header-fields,但我既不能在 API-Docs 中找到这些信息,也不能使用我的终端 curl-调用任何特殊的头文件并工作。

【问题讨论】:

  • 您是否尝试使用Fiddler 来比较不同的调用?
  • allow_url_fopen 是否启用?
  • allow_url_fopen 已启用。感谢@RickS 的工具推荐,我将把它包含在我未来的工作流程中。正如我猜想的那样,解决方案是缺少标题字段。请参阅标记的答案。

标签: php github-api


【解决方案1】:

这是因为 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."

【讨论】:

  • 那位帮了忙,谢谢。您是否从经验中知道这一点,或者我监督的文档中是否有任何说明?
  • 仅供参考。 developer.github.com/v3/#user-agent-required >所有 API 请求必须包含一个有效的 User-Agent 标头。没有 User-Agent 标头的请求将被拒绝。我们要求您使用您的 GitHub 用户名或应用程序的名称作为 User-Agent 标头值。这样我们可以在有问题时与您联系。
  • 太棒了!我在allow_url_fopen 上找到了很多东西,但我的已经在上面了。这就是问题所在。我还了解了漂亮的 zen api URL。谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-07-25
  • 2013-06-27
  • 1970-01-01
  • 1970-01-01
  • 2011-05-31
  • 2014-03-25
相关资源
最近更新 更多