2016-05-10 12 views
7

Tôi tự gọi mình là một nhà phát triển PHP có kinh nghiệm, nhưng điều này khiến tôi phát điên. Tôi đang cố gắng để có được thông tin phát hành của một kho lưu trữ để hiển thị cảnh báo cập nhật, nhưng tôi tiếp tục trả lại 403 lỗi. Để đơn giản hóa nó, tôi đã sử dụng API GitHubs đơn giản nhất: GET https://api.github.com/zen. Đó là một loại thế giới hello.file_get_contents() nhận 403 từ api.github.com everytime

này hoạt động

  • trực tiếp trong trình duyệt
  • với một đồng bằng curl https://api.github.com/zen trong một thiết bị đầu cuối
  • với PHP-Github-API-Class như php-github-api

Đây không phải làm việc

  • với một đơn giản file_get_contents() từ PHP-skript

Đây là toàn bộ mã đơn giản của tôi:

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

Trình duyệt cho thấy Warning: file_get_contents(https://api.github.com/zen): failed to open stream: HTTP request failed! HTTP/1.0 403 Forbidden, biến $content là một boolean và false.

Tôi đoán tôi đang thiếu một số loại http-header-lĩnh vực, nhưng tôi không thể tìm thấy những thông tin trong API-Docs, cũng không sử dụng thiết bị đầu cuối của tôi curl -call bất kỳ tập tin tiêu đề đặc biệt và các công trình.

Bạn có bất kỳ gợi ý nào không? Cảm ơn trước!

+0

Bạn hãy thử sử dụng [Fiddler] (http://www.telerik.com/fiddler) để so sánh các cuộc gọi khác nhau? –

+0

Bật 'allow_url_fopen'? – Pitchinnate

+0

'allow_url_fopen' được bật. Cảm ơn @RickS cho đề xuất công cụ, tôi sẽ bao gồm điều đó trong luồng công việc tương lai của mình. Giải pháp là một trường tiêu đề bị thiếu, như tôi đã đoán. Xem câu trả lời được đánh dấu. –

Trả lời

10

Điều này xảy ra vì GitHub yêu cầu bạn gửi tiêu đề UserAgent. Nó không cần phải là bất cứ điều gì cụ thể. Điều này sẽ làm:

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

Đầu ra là:

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

Điều đó đã giúp, cảm ơn. Bạn có biết rằng từ kinh nghiệm hoặc có bất kỳ hướng dẫn nào trong tài liệu mà tôi đã giám sát không? –

+0

phỏng đoán được giáo dục;) –

+0

FYI. https://developer.github.com/v3/#user-agent-required> Tất cả các yêu cầu API PHẢI bao gồm một tiêu đề Tác nhân người dùng hợp lệ. Các yêu cầu không có tiêu đề Tác nhân người dùng sẽ bị từ chối. Chúng tôi yêu cầu bạn sử dụng tên người dùng GitHub của bạn hoặc tên của ứng dụng của bạn, cho giá trị tiêu đề Tác nhân người dùng. Điều này cho phép chúng tôi liên lạc với bạn nếu có vấn đề. – haakym

Các vấn đề liên quan