Instagram es una aplicación gratuita para compartir fotos en la cual los usuarios pueden aplicar efectos fotográficos como filtros y marcos a su vez que distribuyen las mismas por las diferentes redes sociales. Como en varios servicios de redes sociales como Twitter acceder a los recursos y cuenta de cada usuario se realiza utilizando el protocolo OAuth, así que vamos a ponernos en acción y construir un ejemplo sencillo de como conectarnos a esta popular red.

 

Que necesitamos

Vamos a construir nuestra propia clase que implemente el protocolo OAuth, pero antes es recomendable indicar  el flujo de trabajo de una petición OAuth y en particular el modelo que sigue Instagram para conceder permisos para entender como funciona el script que construiremos:

  • Petición de Autorización:  Debemos solicitar la autorización de acceso a Instagram (a través de las credenciales key, secret y callback).
  • Obtención de código de acceso: Instagram nos retornará un codigo de acceso que debemos pasar como parámetro cuando solicitemos el Token de acceso.
  • Petición de Autorización a los recursos: Debemos solicitar como aplicación cliente a Instagram (a través de credenciales Key , Secret, callback y el código obtenido el paso anterior) que nos permita utilizar su Api, actuando en nombre del dueño de los recursos (recordemos que en este modelo el dueño de los recursos y el cliente pueden no ser el mismo).
  • Obtención del Token previa autorización: El servidor de los recursos nos otorgará unas credenciales (Access token) para que nuestro cliente pueda utilizar su API en nombre del dueño del recurso.
  • Utilización del API por parte del cliente: Nuestro cliente enviará estas credenciales (y la información a actualizar) cada vez que necesite utilizar algún servicio de Instagram.

[box title=”Nota” type=”warning” width=”600px” ] Tal vez te preguntaras ¿Si he definido la url de callback al crear la aplicacion en Instagram por que me la piden en las llamadas?.  Instagram realizar validaciones continuas para asegurarse que las url coinciden con las definidas, en caso de discrepar no se concede el Access token.[/box]

 

Registrando nuestra aplicación en Instagram

Debemos  hacernos con las credenciales Client ID y Client Secret, estas credenciales especifican al servidor de recursos  que existe una aplicación (nuestro script) que utilizará sus servicios. Se obtienen en la página de desarrollo de Instagram al momento de registrar nuestra aplicación.

registrar Cliente

registrar Cliente

Para dar de alta nuestra aplicación, debemos suministrar unos pocos parámetros:

  • Application Name: Nombre de la aplicación.
  • Description: Descripcion de la aplicación.
  • Website: Sitio Web de nuestra aplicación (si la tenemos claro).
  • OAuth Redirect_url: Es la url de callback, en la que se redireccionará una vez que Instagram valide nuestras credenciales. Aquí debemos definir nuestro script. (Para nuestro ejemplo lo hemos llamado indexInstagram.php).

Una vez cumplimentados estos datos, nos registramos y obtendremos las respectivas Client ID y Client Secret:

 

Datos Cliente

 

 

Clase Instagram

Es nuestra clase base para realizar las peticiones a Instagram, comenzamos por lo más sencillo y poco a poco añadiremos funcionalidades.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<!--?php </p-->

class Instagram {

const REQUEST_TOKEN_URL="https://api.instagram.com/oauth/authorize";
const ACCESS_TOKEN_URL = 'https://api.instagram.com/oauth/access_token';
const API_URL = 'https://api.instagram.com/v1/';
// clave de acceso
private $_apikey;
// constraseña de acceso
private $_apisecret;
// url de callback
private $_callbackurl;
private $_access_token;
// el tipo de acceso server-side (code) o client-side (token)
private $_codeType;

// Constructor
public function __construct($apiKey, $apiSecret, $callBackUrl,$codeType) {
$this->setApiKey($apiKey);
$this->setApiSecret($apiSecret);
$this->setCallBackUrl($callBackUrl);
$this->setCodeType($codeType);
}

// retorna el link a la pagina para loggearnos en Instagram
public function getLoginURL(){
return self::REQUEST_TOKEN_URL.'?client_id='.$this->getApiKey().'&redirect_uri='.$this->getCallBackUrl().'&response_type='.$this->getCodeType();
}

// busca las fotos recientes subidas por el
public function getUserMedia($userId, $max = 0) {
return $this->_oAuthCall('users/'.$userId.'/media/recent', true, array('count' => $max));
}

// obtenemos el access_token para realizar las operaciones
public function getAccess_Token($code){
$data = array(
'grant_type' => 'authorization_code',
'client_id' => $this->getApiKey(),
'client_secret' => $this->getApiSecret(),
'redirect_uri' => $this->getCallBackUrl(),
'code' => $code
);
$result= $this->oAuthCall($data);
$this->setAccessToken($result->access_token);
return $result;
}

// metodo para realizar las llamadas a los servicios de instagram
// algunos no es necesario estar loggeado
private function _oAuthCall($url,$requireAuth=false,$parametros = null){

if (false === $requireAuth) {
// Si no se necesita autenticacion pasamos la clave de acceso
$metodoAuth = '?client_id='.$this->getApiKey();
} else {
// si necesita autenticacion
if (true === isset($this->_access_token)) {
$metodoAuth = '?access_token='.$this->getAccessToken();
} else {
throw new Exception("Error: $url - Se necesita autenticacion.");
}
}

if (isset($parametros) && is_array($parametros)) {
$parametros = '&'.http_build_query($parametros);
} else {
$parametros = "";
}

$urlFinal = self::API_URL.$url.$metodoAuth.$parametros;

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $urlFinal);
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/json'));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 8);

$json= curl_exec($curl);
curl_close($curl);
return json_decode($json);
}
// Metodo para realizar la peticion HTTP del Accesstoken y variables post
private function oAuthCall($arrayData) {
$host = self::ACCESS_TOKEN_URL;

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $host);
curl_setopt($curl, CURLOPT_POST, count($arrayData));
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($arrayData));
curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/json'));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

$json = curl_exec($curl);
curl_close($curl);

return json_decode($json);
}

// Metodos set y get
public function setApiKey($apiKey) {

$this->_apikey = $apiKey;
}

public function getApiKey() {
return $this->_apikey;
}

public function setApiSecret($apiSecret) {
$this->_apisecret = $apiSecret;
}

public function getApiSecret() {
return $this->_apisecret;
}

public function setCallBackUrl($callbackurl) {
$this->_callbackurl = $callbackurl;
}

public function getCallBackUrl() {
return $this->_callbackurl;
}

public function setCodeType($codeType) {
$this->_codeType = $codeType;
}

public function getCodeType() {
return $this->_codeType;
}

public function setAccessToken($access_token) {
$this->_access_token = $access_token;
}

public function getAccessToken() {
return $this->_access_token;
}

}
?>

Hemos definido 3 constantes:

  •  REQUEST_TOKEN_URL: Es la url que utilizaremos para solicitar la autorización.
  • ACCESS_TOKEN_URL : Es la url que utilizaremos para solicitar el access_token.
  • API_URL: Url base para los servicios de consulta de Instagram.

Nada fuera de lo normal al crear el constructor, el cual inicializará las variables que hemos pasado por parámetros cuando creamos el objeto en el script principal. El método getLoginURL(), nos construye la url en la que Instagram nos preguntará por nuestras credenciales y de estar todo correcto nos retornará nuevamente.También definimos los métodos que realizarán las peticiones HTTP tanto para el método de obtener el Access_Token como para llamar a los servicios (oAuthCall() y _oAuthCall()) ambos solo para uso exclusivo de la clase (privados). Por último hemos definido un método que solicitará las imágenes recientemente añadidas por nuestro usuario (getUserMedia()), valiendonos para ello en la documentación de API suministrada por Instagram.

 

Script principal

Desde aquí llamaremos a nuestra clase para realizar tanto el inicio de sesión como obtener las imágenes recientes.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<!--?php <br ?--> session_start();
include 'Instagram.class.php';
$key='API_Key';
$secret='secret';
$callback='http://www.elclubdelprogramador.com/wp-content/resources/live_examples/instagram/indexInstagram.php';
$codeType='code';

$instagramObj = new Instagram($key,$secret,$callback,$codeType);
$checker = $_GET[$codeType];
if($checker == '')
{
// Solicitamos autorizacion
$url=$instagramObj->getLoginURL();

echo "<a class="button blue" href="$url">Inicia sesion en Instagram</a>";
}else {
//solicitamos access_token
$info=$instagramObj->getAccess_Token($checker);
echo "
<div style="
float: left; margin-right: 10px;"><img src="\"{$info-" alt="" />user->profile_picture}\" ></div>
<div style="
float: left;">";
echo '<b>Name:</b> '.$info->user->full_name.'';
echo '<b>Username:</b> '.$info->user->username.'';
echo '<b>User ID:</b> '.$info->user->id.'';
echo '<b>Bio:</b> '.$info->user->bio.'';
echo '<b>Website:</b> '.$info->user->website.'';</div>
// utilizamos un servicio
$media = $instagramObj->getUserMedia($info->user->id);

foreach ($media->data as $data) {
echo "<img src="\"{$data-" alt="" />";
}

}

?>

Vamos a ir definiendo más métodos en artículos posteriores para ir extendiendo las funcionalidades de nuestra clase.

 

¡Pruebalo!   

Codigo

 

 

(Visited 2,953 times, 1 visits today)