Mar 052015
 
Artículo PHP

Un sitio web que contiene información relativa a una determinada área geográfica puede encontrar interesante complementar su contenido con una relación de lugares, puntos de interés, negocios y servicios cercanos al área sobre la que trata.

Yelp es uno de los APIs existentes, junto con Google Places, Facebook, etc. que permite obtener este tipo de información. En este artículo se explica cómo implementar un listado de lugares en una página web utilizando la librería PHP del API de Yelp.

Características del servicio de Yelp

Con el API de Yelp se pueden realizar búsquedas geográficas de negocios, servicios y puntos de referencia cercanos a un punto, o de lugares contenidos en un rectángulo, y filtrar los resultados por categorías.

El servicio es gratuito, con un límite de 10,000 búsquedas al dia.

Por otra parte, Yelp tiene un programa de afiliación a través de Commision Junction mediante el cual un sitio web puede ganar dinero publicando Ofertas de negocios que se publicitan en Yelp.

Obtener claves de acceso

Los accesos al API de yelp requieren autentificación OAuth, por lo que el primer paso para hacer uso del mismo es obtener estas claves de la página “Manage API Access” del sitio web de Yelp para desarrolladores.

En primer lugar, accedemos a https://www.yelp.com/signup y procedemos a registrarnos como usuario de Yelp.

A continuación, accedemos a https://www.yelp.com/developers. El alta como desarrollador se realiza automáticamente, y se envía un email de confirmación a la dirección de correo que hemos indicado al darnos de alta. Para continuar, deberemos hacer click sobre el enlace que aparece en el mensaje recibido.

A continuación, accedemos a “Manage API Access“, en donde se nos presenta un formulario en el que se solicitan algunos datos para realizar el alta, que deberemos rellenar:

register-oauth

Con esto, se presentan en pantalla las claves de acceso, que copiaremos y guardaremos en lugar seguro:

oauth-keys

Descarga e instalación de la librería PHP

Los accesos al API de yelp requieren autentificación OAuth, por lo que es necesario disponer de una librería que implemente este protocolo. La manera más sencilla de obtener la librería es descargar el paquete yelp-api-master.zip desde la página del api de yelp en github.

Al descomprimirlo, se crea un árbol de directorios que contiene ejemplos para muchos lenguajes de programación, incluyendo Java, C#, perl, y PHP.

En concreto, la librería OAuth en PHP se encuentra en yelp-api-master/v2/php/lib/OAuth.php. En el paquete descargado también se incluye un ejemplo de uso del API, en el fichero yelp-api-master/v2/php/sample.php

Realizar una consulta sencilla

Podemos analizar el contenido del script de ejemplo “sample.php” ver la manera de realizar una consulta al API desde un programa PHP.

En este ejemplo realizaremos la búsqueda de sitios para cenar en San Francisco, California. Para ello, realizaremos un acceso autentificado a la url:

http://api.yelp.com/v2/search/?term=dinner&location=San+Francisco%2C+CA&limit=3

(En donde “San+Francisco%2c+CA” es el string “San Francisco, CA” transformado para convertirlo en una URL válida).

En primer lugar, cargamos la librería OAuth, y definimos una serie de variables:

require_once('lib/OAuth.php');

$CONSUMER_KEY = YELP_CONSUMER_KEY;
$CONSUMER_SECRET = YELP_CONSUMER_SECRET;
$TOKEN = YELP_TOKEN;
$TOKEN_SECRET = YELP_TOKEN_SECRET;


$API_HOST = 'api.yelp.com';
$DEFAULT_TERM = 'dinner';
$DEFAULT_LOCATION = 'San Francisco, CA';
$SEARCH_LIMIT = 3;
$SEARCH_PATH = '/v2/search/';
$BUSINESS_PATH = '/v2/business/';

A continuación, creamos la solicitud OAuth firmada con las credenciales:

$unsigned_url = "http://api.yelp.com/v2/search/?term=dinner&location=San+Francisco%2C+CA&limit=3";

// Crear los objetos token y consumer
$token = new OAuthToken($GLOBALS['TOKEN'], $GLOBALS['TOKEN_SECRET']);
$consumer = new OAuthConsumer($GLOBALS['CONSUMER_KEY'], $GLOBALS['CONSUMER_SECRET']);

// Crear la solicitud OAuth
$oauthrequest = OAuthRequest::from_consumer_and_token(
        $consumer, $token, 'GET', $unsigned_url
);

// Firmar la solicitud
$signature_method = new OAuthSignatureMethod_HMAC_SHA1();
$oauthrequest->sign_request($signature_method, $consumer, $token);

// Obtener la url firmada
$signed_url = $oauthrequest->to_url();

Por último, realizamos la llamada al API con la URL firmada, utilizando la librería curl. Obtenemos la respuesta en formato JSON, y la volcamos a standard output:

$ch = curl_init($signed_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, 0);
$data = curl_exec($ch);
curl_close($ch);

print_r(json_decode($data));

Con esto, obtenemos en pantalla un volcado de la estructura de datos recibida, de la forma:

stdClass Object
(
    [region] => stdClass Object
        (
            [span] => stdClass Object
                (
                    [latitude_delta] => 0.014647263950323
                    [longitude_delta] => 0.016024466605387
                )

            [center] => stdClass Object
                (
                    [latitude] => 37.784977898311
                    [longitude] => -122.40405513651
                )

        )

    [total] => 6245
    [businesses] => Array
        (
            [0] => stdClass Object
                (
                    [is_claimed] => 1
                    [rating] => 4
                    [mobile_url] => http://m.yelp.com/biz/marlowe-san-francisco-2
                    [rating_img_url] => http://s3-media4.fl.yelpcdn.com/...
                    [review_count] => 1346
                    [name] => Marlowe
                    [snippet_image_url] => http://s3-media3.fl.yelpcdn.com/photo/...
                    [rating_img_url_small] => http://s3-media4.fl.yelpcdn.com/assets/...
                    [url] => http://www.yelp.com/biz/marlowe-san-francisco-2
                    [menu_date_updated] => 1421227117
                    [phone] => 4157771413
                    ...
                )
            [1] => stdClass Object
            ...
      )

Búsqueda por coordenadas

En el sencillo ejemplo que hemos presentado, la localización sobre la que se realiza la búsqueda se especificó con un parámetro “location=San+Francisco%2C+CA”.

En su lugar, podemos utilizar un parámetro “ll” para especificar unas coordenadas del punto alrededor del cual queremos realizar la búsqueda. Normalmente, utilizaremos también un parámetro “radius_filter” para especificar la distancia máxima en metros desde el punto indicado sobre la cual realizar la búsqueda:

ll=latitude,longitude,radius_filter=2000

O bien, utilizar un parámetro “bounds”, para especificar las coordenadas mínima y máxima de un rectángulo en el interior del cual realizar la búsqueda:

bounds=sw_latitude,sw_longitude|ne_latitude,ne_longitude

Filtrar por categoría

A cada entrada de la base de datos de Yelp se le asigna una o varias categorías de entre las más de 1000 categorías reconocidas. La lista completa de categorías se puede consultar en https://www.yelp.com/developers/documentation/v2/all_category_list.

Se puede utilizar el parámetro “category_filter” para limitar la búsqueda a una determinada categoría.

Buscar ofertas

Los negocios en la base de datos de Yelp pueden crear ofertas para los usuarios: descuentos, promociones, etc. Para limitar la búsqueda únicamente a negocios que tienen alguna oferta activa, podemos utilizar el parámetro “deals_filter”:

deals_filter=true

Referencias

 Publicado por en 11:30 am

 Deja un comentario

(requerido)

(requerido)