
En el post anterior se ha visto la forma en la que se puede utilizar la librería python-twitter
para acceder al inmenso volumen de información almacenada en Twitter.
Dicha librería es capaz de utilizar los servicios REST que dispone
Twitter para que los desarrolladores puedan acceder a su plataforma de
forma programática. Así es posible extraer información sobre cuentas
públicas en Twitter y realizar búsquedas aplicando varios criterios. En
este artículo mencionaré otra librería frecuentemente utilizada en
procesos relacionados con OSINT, dicha librería es
“google-api-python-client”. Se trata de una librería que cuenta con
clases y utilidades para extraer información pública contenida en varios
de los servicios de Google.
El proceso de instalación de esta librería es bastante trivial y se
puede llevar a cabo utilizando “pip”, “easy_install” o tirando
directamente del código fuente que se encuentra alojado en la siguiente
ruta: https://github.com/google/google-api-python-client.
No obstante, además de instalar la librería también es necesario crear
una aplicación de consola de Google, para lo cual es necesario tener una
cuenta valida. Para aquellos que nunca han creado una aplicación desde
el gestor de de aplicaciones de Google, a continuación se explica el
procedimiento a seguir.
Creando una aplicación con Google Developers Console.
Con una cuenta de Google valida y estando autenticado en cualquiera
de sus servicios (como por ejemplo Gmail), es posible utilizar la
consola de administración de aplicaciones que Google dispone para los
desarrolladores. Dicha consola se encuentra disponible en el siguiente
enlace: https://console.developers.google.com
y como se puede apreciar en la siguiente imagen, después de pinchar
sobre el botón “Create Project” se debe poner un nombre al proyecto y un
identificador único. El identificador lo puede generar Google por ti o
puedes ingresar uno propio.

Una vez creada la aplicación, el siguiente paso consiste en activar
los servicios que se desea utilizar. La lista es bastante larga y cada
servicio corresponde a una temática muy concreta, por ejemplo, es
posible activar Calendar API, Books API, Drive API, BigQuery API, Custom
Search API, etc. Si el lector está interesando en ver todas las
aplicaciones a las que se puede acceder de forma programática utilizando
la librería, puede ver el listado del siguiente enlace: https://developers.google.com/api-client-library/python/apis/.
El proceso de activación de cualquiera de las APIs disponibles es
bastante simple y con una cuenta gratuita se incluyen varias
características que en la mayoría de los casos son más que suficientes.
Por ejemplo, el servicio de búsquedas de Google es “Custom Search API” y
tiene una limitación de 1000 búsquedas al día, algo que para fines no
comerciales, resulta muy aceptable. Otro servicio interesante es el
BigQuery API, en el que se puede utilizar la infraestructura de Google
para realizar procesos de minería de datos y Big Data, algo de lo que os
hablaré en un próximo artículo.
Para realizar las pruebas, se habilitará el servicio “Custom Search API”
y posteriormente, se debe crear el conjunto de claves para poder
consumir el servicio con las credenciales y la autorización necesaria.
Para ello existe la opción “Credentials” bajo el menú “APIs & auth”.

Tal como se puede apreciar en la imagen anterior, es posible utilizar
dos mecanismos de autenticación, por un lado podemos generar los tokens
de OAuth2 o crear un identificador único para el acceso. La diferencia
entre ambos mecanismos es que utilizando los tokens de OAuth se
gestionan detalles de acceso y autorización, algo que resulta vital para
ciertos servicios que requieren consentimiento por parte del creador de
la aplicación para que otros usuarios puedan utilizarla, mientras que
en el caso del identificador único de acceso, se hace una validación
simple y en cualquier caso, a servicios que no requieran autorización
previa, como es el caso de la ejecución de búsquedas simples utilizando
el buscador de Google. El servicio de Custom Search API no
necesariamente requiere autenticación Oauth, con lo cual se puede crear
una nueva API Key. A la fecha de redactar este artículo la creación de
una API solicita un tipo concreto de clave, entre los posibles valores a
seleccionar se encuentran: “Server”, “Browser”, “Android”, “iOS”. Se
debe seleccionar el tipo de clave dependiendo de la forma en la que la
aplicación (que evidentemente actuará como cliente) se conectará al
servicio de Google en cuestión. En este caso concreto se puede
seleccionar “Server” y en tal caso, se solicitará restringir el acceso
por dirección o segmento de direcciones IP, en el caso de no ingresar
ningún valor, la API admitirá cualquier cliente sin importar su
dirección IP.
Llegados a este punto, ya es posible comenzar a utilizar la librería y
para ello, es necesario crear una instancia de la API de google por
medio de la función “build” contenida en el módulo
“apiclient.discovery”.
La función “build” recibe como argumentos el nombre del servicio que
se desea utilizar, la versión y las credenciales de acceso al servicio.
Por ejemplo, para acceder al servicio de Books API y Custom Search API,
se utiliza la función de la siguiente forma:
1 2 3 | serviceBooks = build( 'books' , 'v1' , developerKey = ”<api_key>”)
serviceCustomSearch = build( "customsearch" , "v1" ,developerKey = "<api_key>" )
|
|
Como se puede apreciar, crear una instancia de cualquier servicio es
una tarea bastante simple, no obstante, no todos los servicios de Google
se gestionan de igual manera y algunos de ellos, como es el caso de
Custom Search API, es necesario crear un nuevo motor de búsqueda
personalizado contra un sitio web en Internet y posteriormente,
recuperar el identificador del motor creado o su URL pública para que
puedan ejecutarse las peticiones correctamente contra el servicio. Para
crear un motor de búsqueda personalizado de Google se debe ingresar al
sitio de administración de motores ubicado en la siguiente ruta: https://www.google.com/cse/all
Desde allí se puede crear un motor y tal como se enseña en las
siguientes imágenes, es necesario definir sobre cuáles sitios se deben
realizar las búsquedas.
Creación de un motor de búsqueda personalizado.
Motor de búsqueda creado.
El siguiente paso para poder utilizar la API desde
cualquier script en Python es el de obtener el identificador del motor
de búsqueda, que tal como se enseña en la siguiente imagen, se encuentra
disponible tras pinchar sobre el botón “ID de motor de búsqueda”.

Una vez obtenido el identificador del motor de búsqueda,
se puede utilizar la única función definida en el servicio
correspondiente a Custom Search API, la cual permitirá utilizar el motor
para realizar búsquedas sobre los dominios previamente definidos.
1 2 3 4 5 | from apiclient.discovery import build
service = build( "customsearch" , "v1" ,developerKey = "<api_key>" )
results = service.cse(). list (q = "python" ,
cx = "<id_engine>" ,num = 10 ).execute()
|
|
Como se puede apreciar, utilizar Python para realizar
una búsqueda sobre el servicio Custom Search API es bastante simple,
solamente es necesario especificar el criterio de búsqueda, el
identificador del motor y el número de resultados que se obtendrán de la
consulta. Estas búsquedas son dirigidas contra uno o varios sitios
concretos, lo que supone una ventaja a la hora de recolectar información
concreta sobre, por ejemplo, los usuarios de redes sociales como
Twitter o Facebook.
Los resultados devueltos se encuentran en formato JSON,
pero la API hace la labor de convertir la cadena devuelta por el
servicio en un diccionario que pueda ser tratado directamente desde
Python.
1 2 3 4 5 6 7 8 | from apiclient.discovery import build
service = build( "customsearch" , "v1" ,developerKey = "<api_key>" )
res = service.cse(). list (q = "python" , cx = "<id_engine>" ,num = 10 ).execute()
print res.keys()
print res[ 'url' ]
print res[ 'queries' ]
print res[ 'searchInformation' ]
|
|
Hasta este punto, solamente se han realizado búsquedas,
sin embargo esto solamente es la punta del iceberg, ya que faltan
labores mucho más complejas para analizar y relacionar la información
obtenida. En próximas entradas se hablará un poco más sobre esto.
Saludos y Happy Hack!
Adastra.