Question

Here is a simple query from the linkedIn documentation that works:

$groupData = $this->linkedin->fetch('GET', "/v1/groups/{id}/posts");

It returns 10 records. But the moment I attach the count and start parameters like this:

$groupData = $this->linkedin->fetch('GET', "/v1/groups/{id}/posts?count=20&start=0");

I get this error:

A PHP Error was encountered

Severity: Warning

Message: file_get_contents(https://api.linkedin.com/v1/groups/{id}/posts&count=20&start=0?oauth2_access_token=xxxxx8&format=json): failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request

Filename: libraries/Linkedin.php

Line Number: 85

Here is my complete code:

class Auth extends CI_Controller {

    function __construct() {
        parent:: __construct();
        $this->load->library('linkedin'); // load library
        session_name('linkedin');
        session_start();
    }

    // linkedin login script
    function index() {
      // OAuth 2 Control Flow
      if (isset($_GET['error'])) {
          // LinkedIn returned an error
          // load any error view here
          exit;
      } elseif (isset($_GET['code'])) {
          // User authorized your application
          if ($_SESSION['state'] == $_GET['state']) {
              // Get token so you can make API calls
              $this->linkedin->getAccessToken();
          } else {

              // CSRF attack? Or did you mix up your states?
              exit;
          }
      } else {
          if ((empty($_SESSION['expires_at'])) || (time() > $_SESSION['expires_at'])) {
              // Token has expired, clear the state
              $_SESSION = array();
          }
          if (empty($_SESSION['access_token'])) {
              // Start authorization process
              $this->linkedin->getAuthorizationCode();
          }
      }

      // this is where I am fetching linkedIn data
      $groupData = $this->linkedin->fetch('GET', "/v1/groups/{id}/posts?count=20&start=0");

      // this is where I am sending the data to the idea model to be saved
      if ($groupData) {
        var_dump($groupData); exit();
        // foreach ($groupData->values as $data) {
        //   var_dump($data->creator->firstName); exit();
        // }

        $this->load->model('idea_model');
        $this->idea_model->store_ideas($groupData);

      } else {
         // linked return an empty array of profile data
      }

    }

}

The linkedIn library is the code sample given by linkedIn in their documentation:

<?php

defined('BASEPATH') OR exit('No direct script access allowed');

/**
 * CodeIgniter Linked API Class
 *
 *
 * @package         CodeIgniter
 * @subpackage      Libraries
 * @category        Libraries
 * @author          Muhamamd Hafeez
 */
class Linkedin {

  function __construct(){

  }

  public function getAuthorizationCode() {
    $params = array('response_type' => 'code',
        'client_id' => API_KEY,
        'scope' => SCOPE,
        'state' => uniqid('', true), // unique long string
        'redirect_uri' => REDIRECT_URI,
    );
    // Authentication request
    $url = 'https://www.linkedin.com/uas/oauth2/authorization?' . http_build_query($params);

    // Needed to identify request when it returns to us
    $_SESSION['state'] = $params['state'];

    // Redirect user to authenticate
    header("Location: $url");
    exit;
  }

   public function getAccessToken() {
    $params = array('grant_type' => 'authorization_code',
        'client_id' => API_KEY,
        'client_secret' => API_SECRET,
        'code' => $_GET['code'],
        'redirect_uri' => REDIRECT_URI,
    );
    // Access Token request
    $url = 'https://www.linkedin.com/uas/oauth2/accessToken?' . http_build_query($params);

    // Tell streams to make a POST request
    $context = stream_context_create(
            array('http' =>
                array('method' => 'POST',
                )
            )
    );

    // Retrieve access token information
    $response = file_get_contents($url, false, $context);

    // Native PHP object, please
    $token = json_decode($response);

    // Store access token and expiration time
    $_SESSION['access_token'] = $token->access_token; // guard this! 
    $_SESSION['expires_in'] = $token->expires_in; // relative time (in seconds)
    $_SESSION['expires_at'] = time() + $_SESSION['expires_in']; // absolute time
    return true;
  }

  public function fetch($method, $resource, $body = '') {
    $params = array('oauth2_access_token' => $_SESSION['access_token'],
        'format' => 'json',
    );

    // Need to use HTTPS
    $url = 'https://api.linkedin.com' . $resource . '?' . http_build_query($params);
    // Tell streams to make a (GET, POST, PUT, or DELETE) request
    $context = stream_context_create(
            array('http' =>
                array('method' => $method,
                )
            )
    );

    // Hocus Pocus
    $response = file_get_contents($url, false, $context);

    // Native PHP object, please
    return json_decode($response);
  }

}

/* End of file Linked.php */
/* Location: ./application/libraries/linkedin.php */

Please help me fix this. What am I doing wrong?

Was it helpful?

Solution

The problem is that your parameter list has 2 two ?'s. I would change the fetch method to take an optional $params parameter:

public function fetch($method, $resource, $params = array(), $body = '') {
    // Cast, just in case
    $params = (array)$params;
    // Add mandatory parameters
    $params['oauth2_access_token'] = $_SESSION['access_token'];
    $params['format'] = 'json';

    // Need to use HTTPS
    $url = 'https://api.linkedin.com' . $resource . '?' . http_build_query($params);
    // Tell streams to make a (GET, POST, PUT, or DELETE) request
    $context = stream_context_create(
            array('http' =>
                array('method' => $method,
                )
            )
    );

    // Hocus Pocus
    $response = file_get_contents($url, false, $context);

    // Native PHP object, please
    return json_decode($response);
}

And call it like so:

$groupData = $this->linkedin->fetch('GET', "/v1/groups/{id}/posts", array("count" => 20, "start" => 0));
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top