34618


laravel5.4でoauth-5-laravelを使用しています。  
resource controllerを使ってルーティングしています。

アクセストークンは取得済みで、ブラウザ上でindex()のurlを入力するとjson形式でurlが返ってきますが、curlなどでリクエストを送るとhtmlコードがレスポンスされて、HTTPステータスコードは500となっています。

[code]

    private $service = 'Instagram';
    
    private $instagram;
    
    function __construct()
    {
        $this->instagram = \OAuth::consumer($this->service);
    }
    
    public function index()
    {
        $result = json_decode($this->instagram->request('/users/self/media/recent'));
        $url = array();
    
        foreach ($result->data as $data) {
            $image = $data->images->standard_resolution;
            $url[] = str_replace("/s640x640/", "/s1080x1080/", $image->url);
        }
        return response()->json(['url' => $url]);
    }
    
[/code]

ちなみに

[code]

    public function index()
    {
        return ['test' => 'test'];
    }
    
[/code]

などであれば問題なく出力されるので、リクエストの部分が問題であると判断しましたが、なぜこのような記述であればレスポンスが返ってこないのかがわかりません。


CC BY-SA 3.0
2017-03-26T01:52:50.437
33537
2019-12-26T00:02:20.297
18697
question
php api laravel instagram
instagramのapiの出力からurlを抽出して出力するapiを作りたい


$this->instagram->request
がどのような処理をしているか見えないので、phpで動いているコードを以下に、このcURL版サンプルを動かすとインスタグラムのuserid
access_tokenが適当なので

[code]

    {"meta": {"code": 400, "error_type": "OAuthAccessTokenException", "error_message": "The access_token provided is invalid."}}
    
[/code]

が返される事が確認できます。

補足：file_get_contents版での読み込み時、サーバからエラーが返されるとfile_get_contentsの読み込み内容はfalseになります。  
アクティブなuserid access_tokenを使うと jsonデータのレスポンスを受けることができます。

[code]

    function wbsRequest($method, $url, $params = array())
    {
        $data = http_build_query($params);
        $header = Array("Content-Type: application/x-www-form-urlencoded");
    //    $header = Array();
        $options = array('http' => Array(
            'method' => $method,
            'header'  => implode("\r\n", $header),
        ));
        //ステータスをチェック
        $respons = get_headers($url);
        if(preg_match("/(404|403|500)/",$respons['0'])){
            return false;
        }
        if($method == 'GET') {
            $url = ($data != '')?$url.'?'.$data:$url;
        }elseif($method == 'POST') {
            $options['http']['content'] = $data;
        }
        $content = file_get_contents($url, false, stream_context_create($options));
        return $content;
    }
    
    //cURL版
    function wbsRequest_curl($method, $url, $params = array())
    {
        $data = http_build_query($params);
        if($method == 'GET') {
            $url = ($data != '')?$url.'?'.$data:$url;
        }
        $ch = curl_init($url);
        if($method == 'POST'){
            curl_setopt($ch,CURLOPT_POST,1);
            curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
        }
        //curl_setopt($ch, CURLOPT_HEADER,true); //header情報がひつようなならば
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_TIMEOUT, 2);
        $res = curl_exec($ch);
        //ステータスをチェック
        $respons = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if(preg_match("/^(404|403|500)$/",$respons)){
            return false;
        }
        return $res;
    }
    
    $userid ='123456789';
    $access_token = 'xxxxx.xxxxxxxx';
    //$respons = wbsRequest('GET', 'https://api.instagram.com/v1/users/'.$userid.'/media/recent',array('access_token' => $access_token));
    $respons = wbsRequest_curl('GET', 'https://api.instagram.com/v1/users/'.$userid.'/media/recent',array('access_token' => $access_token));
    
    print_r(json_decode($respons,true));
    
[/code]


CC BY-SA 3.0
2017-05-11T02:24:51.310
34618
2017-05-11T02:24:51.310
22793
33537
answer