Get Even More Visitors To Your Blog, Upgrade To A Business Listing >>

La API de Amazon (II)

En el primer capítulo de la serie hablé de cómo funciona la API de Amazon, cómo se puede utilizar, qué parámetros necesita, etc. En este segundo capítulo lo voy a orientar a cómo podemos utilizar la API utilizando el lenguaje Java y hacer una mini aplicación que nos muestre un listado de productos.

Por otra parte, las noticias de hace unas semanas relacionadas con Amazon y su API es el corte del servicio de la página Pricenoia . Pricenoia era una página que te buscaba el mejor precio de un producto de Amazon entre todas sus tiendas. Hay que Tener en cuenta lo peligroso que puede llegar a ser tener unos ingresos dependientes de una empresa tan grande como Amazon, que en cualquier momento te cierran el grifo y con ello todo su sustento.

Ahora hablaré de cómo se puede implementar de una manera sencilla un mini motor que rastree un pequeño catálogo de productos de Amazon.

Lo que debemos tener en cuenta es la estructura de una petición:

http://webservices.amazon.com/onca/xml?
Service=AWSECommerceService&
Operation=ItemSearch&
AWSAccessKeyId=[Access Key ID]&
AssociateTag=[ID]&
SearchIndex=Apparel&
Keywords=Shirt
&Timestamp=[YYYY-MM-DDThh:mm:ssZ]
&Signature=[Request Signature]

Debemos meter cada valor en un Map, de esta manera:

private Map params = new HashMap();
        params.put("Service", "AWSECommerceService");
        params.put("Version", "2011-08-01");
        params.put("AssociateTag", );
        params.put("Operation", "ItemSearch");
        params.put("SearchIndex", "Kitchen");
        params.put("Keywords", "Singer Simple 2250"); 
        params.put("BrowseNode", "599391031");
        params.put("ResponseGroup", "ItemAttributes,Medium");

Con esto ya tendremos una gran parte de la estructura mapeada en una estructura de Datos, sólo nos quedaría añadirle la fecha y hora, establecer la firma de la petición y por último, construir la URL de la misma.

/**
     * This method signs requests in hashmap form. It returns a URL that should
     * be used to fetch the response. The URL returned should not be modified in
     * any way, doing so will invalidate the signature and Amazon will reject
     * the request.
     */
    public String sign(Map params) {
        // Let's add the AWSAccessKeyId and Timestamp parameters to the request.
        params.put("AWSAccessKeyId", this.awsAccessKeyId);
        params.put("Timestamp", this.timestamp());

        // The parameters need to be processed in lexicographical order, so we'll
        // use a TreeMap implementation for that.
        SortedMap sortedParamMap = new TreeMap(params);
        
        // get the canonical form the query string
        String canonicalQS = this.canonicalize(sortedParamMap);
        
        // create the string upon which the signature is calculated
        String toSign =
                ApiUtils.REQUEST_METHOD + "\n"
            + this.endpoint + "\n"
            + ApiUtils.REQUEST_URI + "\n"
            + canonicalQS;

        // get the signature
        String hmac = this.hmac(toSign);
        String sig = this.percentEncodeRfc3986(hmac);

        // construct the URL
        String url =
            "http://" + this.endpoint + ApiUtils.REQUEST_URI + "?" + canonicalQS + "&Signature=" + sig;

        return url;
    }

Este último trozo de código está disponible para descargar desde la página de Amazon  y es esencial para poder procesar la petición.

Es importante saber que la cadencia que tiene Amazon para realizar sus peticiones es de 1 segundo, es decir, que sólo nos dejará hacer 3600 peticiones a la hora. Por tanto, entre petición y petición debemos ponerle un retardo de al menos, 1 segundo.

Thread.sleep (1000);

Una vez realizada la petición, debemos de obtener los datos de la misma y procesarlos como queramos. Para ello, debemos realizar los siguientes pasos:

private Document docSearch;
            private DocumentBuilder dbSearch;   

            docSearch = dbSearch.parse(requestUrl);
            Node totalResultsNode = docSearch.getElementsByTagName("TotalResults").item(0);
            int totalResults = Integer.parseInt(totalResultsNode.getTextContent());
            Node totalPageNode = docSearch.getElementsByTagName("TotalPages").item(0);
            Node titleNode = docSearch.getElementsByTagName("Title").item(0);
            Node asinNode = docSearch.getElementsByTagName("ASIN").item(0);
            Node detailPageURLNode = docSearch.getElementsByTagName("DetailPageURL").item(0);

De esta manera, podremos obtener cada parámetro de la respuesta (Title, ASIN, price, etc.). Con el código de ejemplo obtendríamos el primer valor de todos los devueltos, con iterar esa lista sería suficiente para ir obteniendo los restantes.

Y con esto tenemos una pequeña aplicación con la que realizar peticiones a la API de Amazon y poder obtener los datos para luego procesarlos. En mi caso, lo que hago con esos datos es insertarlos en una base de datos y los utilizo para alimentar los datos de las páginas de productos. De esta manera, cada vez que se ejecute el proceso se consigue tener todos los precios actualizados en nuestra página Web y evitamos tener que andar revisando los productos y los precios manualmente que se hace una tarea muy pesada y que lo más probable es que consigamos dejar de hacerlo.

La entrada La API de Amazon (II) aparece primero en MiAfiliado.



This post first appeared on Blog De Afiliados, please read the originial post: here

Share the post

La API de Amazon (II)

×

Subscribe to Blog De Afiliados

Get updates delivered right to your inbox!

Thank you for your subscription

×