2016-05-10 5 views
7

Ich nenne mich selbst ein erfahrener PHP-Entwickler, aber das macht mich verrückt. Ich versuche, Release-Informationen eines Repositorys zu erhalten, um Update-Warnungen anzuzeigen, aber ich gebe immer 403 Fehler zurück. Zur Vereinfachung habe ich die einfachste Verwendung der GitHubs API verwendet: GET https://api.github.com/zen. Es ist eine Art Hallo Welt.file_get_contents() bekommt 403 von api.github.com jedes Mal

Dies funktioniert

  • direkt im Browser
  • mit einer einfachen curl https://api.github.com/zen in einem Terminal
  • mit einer PHP-Github-API-Klasse wie php-github-api

Das funktioniert nicht

  • mit einem einfachen file_get_contents() von einem PHP-Skript

Das ist mein ganz vereinfachten Code ist:

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

Der Browser zeigt Warning: file_get_contents(https://api.github.com/zen): failed to open stream: HTTP request failed! HTTP/1.0 403 Forbidden, die Variable $content ist ein boolean und false.

Ich denke, ich vermisse eine Art von http-Header-Felder, aber weder kann ich diese Informationen in der API-Docs finden, noch verwendet mein Terminal curl -call spezielle Header-Dateien und funktioniert.

Haben Sie Hinweise? Danke im Voraus!

+0

Haben Sie versucht, mit [Fiedler] (http://www.telerik.com/fiddler) die verschiedenen Anrufe zu vergleichen? –

+0

Ist 'allow_url_fopen' aktiviert? – Pitchinnate

+0

'allow_url_fopen' ist aktiviert. Danke @RickS für die Tool-Empfehlung, ich werde das in meine zukünftigen Workflows einbeziehen. Die Lösung war ein fehlendes Header-Feld, wie ich vermutete. Siehe markierte Antwort. –

Antwort

10

Dies passiert, weil GitHub Sie UserAgent-Header senden müssen. Es muss nichts Spezifisches sein. Dies tun:

$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); 

Die Ausgabe lautet:

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

Das half, danke. Kennst du das aus Erfahrung oder gibt es Anweisungen in den Dokumenten, die ich beaufsichtigt habe? –

+0

Erzogene Schätzung;) –

+0

FYI. https://developer.github.com/v3/#user-agent-required> Alle API-Anfragen MÜSSEN einen gültigen User-Agent-Header enthalten. Anfragen ohne User-Agent-Header werden abgelehnt. Wir bitten Sie, Ihren GitHub-Benutzernamen oder den Namen Ihrer Anwendung für den User-Agent-Header-Wert zu verwenden. Dies ermöglicht uns, Sie bei Problemen zu kontaktieren. – haakym