APIS y Python

· Bestiario de Robledo

Notas sobre la consecución de APIS en Python
#python #apis #web

En el Ordenador, la información adquiere mil vericuetos y no son pocas las formas de obtenerla, siempre que a alguien se le haya ocurrido constarla en bytes, normalmente en texto plano. Una de las formas más conocidas de obtener la información, no siempre obvia para profanos, es precisamente la API. ¿Qué es?

En primer lugar, una API es Application Programming Interface, esto es, una interfaz de programación de aplicaciones. ¿Y qué significa? Confiere a todo desarrollador y demás curiosos de la tecla una interfaz para comunicarte con programas, a través de subrutinas, funciones y procedimientos. Por ejemplo, cuando estoy en la consola de comandos, al utilizar el comando ls -lah para listar los archivos en un formato legible y detallado, incluyendo archivos ocultos, estoy llamando a la API de Bash que incluye programas con sus argumentos como éste o pwd, que imprime el directorio en el que me hallo. Cuando hago una página web, etiquetas como <strong>, que enfatiza el texto, forman parte de la API de HTML. La utilizo. Me comunico con la API del navegador, que me devuelve como negrita el texto encerrado entre las etiquetas mencionadas.

Y hablando de la web precisamente, hoy nos ocupan sobre todo las APIS REST, accesibles desde muchos medios, como el paquete requests en Python o cURL en la consola de comandos de Linux, Mac o Windows. En muchos casos implican autenticación a través de un token, que es una clave larga y generada aleatoriamente por regla general, normalmente acorde a los estándares de seguridad que se mueven hoy. En otros son gratis, pero la contrapartida es que implican un límite de accesos por un período determinado, sea hora, día o mes. Ya saben, nada es gratis en este orbe, incluso tráfico del que cuesta una pequeña fracción de céntimo por transacción. Cada API tiene su idiosincrasia, así que empápate bien de su documentación. Normalmente nos la devolverán en formato JSON (JavaScript Object Notation), en texto plano.

Podemos esperar algo así para el respetable (ejemplo de la API de Random User):

 1{
 2  "results": [
 3    {
 4      "gender": "female",
 5      "name": {
 6        "title": "Ms",
 7        "first": "Abril",
 8        "last": "Fonseca"
 9      },
10      "location": {
11        "street": {
12          "number": 7357,
13          "name": "Boulevard Aguascalientes"
14        },
15        "city": "San José Casas Caídas",
16        "state": "Guanajuato",
17        "country": "Mexico",
18        "postcode": 58755,
19        "coordinates": {
20          "latitude": "23.3139",
21          "longitude": "141.4394"
22        },
23        "timezone": {
24          "offset": "+4:00",
25          "description": "Abu Dhabi, Muscat, Baku, Tbilisi"
26        }
27      },
28      "email": "abril.fonseca@example.com",
29      "login": {
30        "uuid": "05b9b2b5-8957-4d5d-8ab5-ad0578f0644d",
31        "username": "goldenostrich877",
32        "password": "puppy",
33        "salt": "LxC1t2FN",
34        "md5": "276ca522b2721f6cfd3f781f23e276a3",
35        "sha1": "b53d6ef5f6efd1d44174b4a887727ddbc0e0c327",
36        "sha256": "bdbc03703e7a408ac46a7b90e7ad50cd159e5912da76c6a8029fd5754e8afdf4"
37      },
38      "dob": {
39        "date": "1945-09-22T13:02:54.825Z",
40        "age": 77
41      },
42      "registered": {
43        "date": "2008-09-03T05:55:56.198Z",
44        "age": 14
45      },
46      "phone": "(659) 042 3806",
47      "cell": "(688) 888 3383",
48      "id": {
49        "name": "NSS",
50        "value": "61 51 24 2391 7"
51      },
52      "picture": {
53        "large": "https://randomuser.me/api/portraits/women/47.jpg",
54        "medium": "https://randomuser.me/api/portraits/med/women/47.jpg",
55        "thumbnail": "https://randomuser.me/api/portraits/thumb/women/47.jpg"
56      },
57      "nat": "MX"
58    }
59  ],
60  "info": {
61    "seed": "e90910d3fde31e3c",
62    "results": 1,
63    "page": 1,
64    "version": "1.4"
65  }
66}
67

Asustante (sic), ¿verdad? Signos extraños encerrando datos, pero no os preocupéis. Con lenguajes como Python podemos extraer datos, ya que su estructura es muy similar a la de los diccionarios. Tenemos un diccionario con una o más llaves. Cada una de esas llaves puede contener una cadena de texto, un número, una lista o incluso otro diccionario, las posibilidades son muchas. Por ejemplo, para la API que nos ocupa, ¿cómo conocer su nombre? Lo almacenamos como diccionario, pongamos persona_random. Dado que los resultados son una lista, escribimos persona_random.json()['results'][0]. Cogemos el campo del nombre, persona_random.json()['results'][0]['name']['first']. Dado que el nombre es otro diccionario, vamos a por una de sus llaves, su nombre. Una cadena de texto lacónica, Out[168]: 'Luis'. Podemos sacar más datos, como el email.

Seguid experimentando, seguid mirando qué datos necesitáis y, sobre todo, pensad en a dónde os lo podéis llevar. Puede tomar la forma de una presentación para los deberes del colegio. Puede ser un email enviado automáticamente a tu madre con las previsiones del tiempo, programado cada día a las 8 de la mañana mientras sigan circulando electrones en tal ordenador. Puede ser el contenido de una pancarta. De todas las posibilidades que ofrece el Ordenador, el texto y cómo transportarlo a otro lado es de lo más básico, pero a su vez bastante profundo en su proceder. De un simple «Hola Mundo» a rellenar todo un portal de Internet. Y, desgraciadamente, hay aún webs sin su API como el refranero multilingüe del Instituto Cervantes. ¿Quién sabe si en el día de mañana tu amor platónico podría recibir una misiva con un refrán generado al azar en algún ordenador?

# Recursos adicionales