Twitter, así como muchas otras páginas, ofrece acceso a sus datos a través de su API. Si miramos la documentación, veremos cómo acceder a los endpoints directamente después de registrarnos. Sin embargo, Twitter es ilustrativo de API alrededor de las cuales los desarrolladores ofrecen paquetes que gestionan inteligentemente las conexiones y los datos, pensando en los usos más frecuentes. Dicho de otro modo, aunque sea posible acceder a la Twitter de API a través de estructuras como las que hemos visto antes, es más práctico usar paquetes como, por ejemplo twitteR.

library(twitteR)

Antes de nada, tenemos que completar el registro de una nueva aplicación. Para eso, nos dirigimos a la página de desarrolladores asociada a nuestra cuenta y obtenemos las credenciales. Como siempre, guardaremos las credenciales en un archivo separado de nuestro código

creds <- readLines("./credentials-twitter.txt")
consumer_key <- creds[1]
consumer_secret <- creds[2]
access_token <- creds[3]
access_secret <- creds[4]

Ahora podemos conectar nuestra sesión a nuestra cuenta de Twitter:

setup_twitter_oauth(consumer_key,
                    consumer_secret,
                    access_token,
                    access_secret)

Con eso, podemos acceder a varios tipos de funciones. Por ejemplo, podemos acceder a un endpoint de la Search API que recupera tweets que contienen los términos que pasamos en el argumento.

tweets <- searchTwitter("Lacalle Pou", n=20)
tweets[[1]]

Aquí es donde vemos el valor de usar un paquete como twitteR. Si por ejemplo pedimos más información sobre el objeto, vemos que en realidad contiene más que simplemente el tweet que hemos recuperado. Al inspeccionar el objeto vemos que en realidad contiene los datos relativos al tweet, como cuándo fue escrito, por quién, a qué hora, …

str(tweets[[1]])

No solo eso, también nos ofrece un grupo de funciones para interactuar con esa información sin tener que buscar a través de la lista de datos. Por ejemplo, nos permite acceder al número de gente que ha hecho favorite a este tweet, la identidad de los usuarios que lo han retuiteado, o a través de qué plataforma se ha emitido el tweet. Es importante tener en cuenta la peculiar forma de acceder a esta información, como método aplicado a cada objeto de la lista:

tweets[[1]]$getFavoriteCount()
tweets[[1]]$statusSource

También tenemos funciones especializadas en capturar información acerca de usuarios:

myself <- getUser("griverorz")
myself
str(myself)

que nos ofrecen también la posibilidad de acceder a información adicional sobre ese tipo de objeto

myself$getDescription()

Lo más interesante es ver cómo es posible “encadenar” este tipo de funciones. Por ejemplo, podemos recuperar quiénes son mis seguidores en Twitter

followers <- myself$getFollowerIDs()
head(followers)

y ver que el nuevo objeto followers nos permite acceder a información de cada uno de ellos como usuario

getUser(followers[123])

lo cual nos da la posibilidad de reconstruir la red de mis seguidores y sus seguidores. En la próxima sesión veremos las herramientas necesarias para llevar a cabo este tipo de análisis.

Finalmente, twitteR también nos da acceso a los timelines a través de userTimeline con la posibilidad de controlar cuántos tweets recuperar, si incluir retweets, o replies.

mytm <- userTimeline("griverorz")
length(mytm)
mytm[[1]]

Y también nos permite interactuar con la lista de trending topics, para lo cual tenemos que seleccionar la geografía en la que estamos interesados

head(availableTrendLocations())
head(getTrends(468739)) ## Buenos Aires
LS0tIAp0aXRsZTogIkNhcHR1cmFyIGRhdG9zIGRlIGxhIEFQSSBkZSBUd2l0dGVyIgpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclQiAlZCwgJVknKWAiCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0UsIGNhY2hlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZXZhbCA9IEZBTFNFKSAKYGBgCgpUd2l0dGVyLCBhc8OtIGNvbW8gbXVjaGFzIG90cmFzIHDDoWdpbmFzLCBvZnJlY2UgYWNjZXNvIGEgc3VzIGRhdG9zIGEgdHJhdsOpcyBkZSBzdQpBUEkuIFNpIG1pcmFtb3MgbGEgZG9jdW1lbnRhY2nDs24sIHZlcmVtb3MgY8OzbW8gYWNjZWRlciBhIGxvcyBfZW5kcG9pbnRzXwpkaXJlY3RhbWVudGUgZGVzcHXDqXMgZGUgcmVnaXN0cmFybm9zLiBTaW4gZW1iYXJnbywgVHdpdHRlciBlcyBpbHVzdHJhdGl2byBkZSBBUEkKYWxyZWRlZG9yIGRlIGxhcyBjdWFsZXMgbG9zIGRlc2Fycm9sbGFkb3JlcyBvZnJlY2VuIHBhcXVldGVzIHF1ZSBnZXN0aW9uYW4KaW50ZWxpZ2VudGVtZW50ZSBsYXMgY29uZXhpb25lcyB5IGxvcyBkYXRvcywgcGVuc2FuZG8gZW4gbG9zIHVzb3MgbcOhcwpmcmVjdWVudGVzLiBEaWNobyBkZSBvdHJvIG1vZG8sIGF1bnF1ZSBzZWEgcG9zaWJsZSBhY2NlZGVyIGEgbGEgVHdpdHRlciBkZSBBUEkgYQp0cmF2w6lzIGRlIGVzdHJ1Y3R1cmFzIGNvbW8gbGFzIHF1ZSBoZW1vcyB2aXN0byBhbnRlcywgZXMgbcOhcyBwcsOhY3RpY28gdXNhcgpwYXF1ZXRlcyBjb21vLCBwb3IgZWplbXBsbyBgdHdpdHRlUmAuIAoKYGBge3J9CmxpYnJhcnkodHdpdHRlUikKYGBgCgpBbnRlcyBkZSBuYWRhLCB0ZW5lbW9zIHF1ZSBjb21wbGV0YXIgZWwgcmVnaXN0cm8gZGUgdW5hIG51ZXZhIGFwbGljYWNpw7NuLiBQYXJhCmVzbywgbm9zIGRpcmlnaW1vcyBhIGxhIFtww6FnaW5hIGRlIGRlc2Fycm9sbGFkb3Jlc10oaHR0cHM6Ly9kZXYudHdpdHRlci5jb20vKQphc29jaWFkYSBhIG51ZXN0cmEgY3VlbnRhIHkgb2J0ZW5lbW9zIGxhcyBjcmVkZW5jaWFsZXMuIENvbW8gc2llbXByZSwKZ3VhcmRhcmVtb3MgbGFzIGNyZWRlbmNpYWxlcyBlbiB1biBhcmNoaXZvIHNlcGFyYWRvIGRlIG51ZXN0cm8gY8OzZGlnbwogICAgICAgICAgICAKYGBge3J9CmNyZWRzIDwtIHJlYWRMaW5lcygiLi9jcmVkZW50aWFscy10d2l0dGVyLnR4dCIpCmNvbnN1bWVyX2tleSA8LSBjcmVkc1sxXQpjb25zdW1lcl9zZWNyZXQgPC0gY3JlZHNbMl0KYWNjZXNzX3Rva2VuIDwtIGNyZWRzWzNdCmFjY2Vzc19zZWNyZXQgPC0gY3JlZHNbNF0KYGBgCgpBaG9yYSBwb2RlbW9zIGNvbmVjdGFyIG51ZXN0cmEgc2VzacOzbiBhIG51ZXN0cmEgY3VlbnRhIGRlIFR3aXR0ZXI6CgpgYGB7cn0Kc2V0dXBfdHdpdHRlcl9vYXV0aChjb25zdW1lcl9rZXksCiAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJfc2VjcmV0LAogICAgICAgICAgICAgICAgICAgIGFjY2Vzc190b2tlbiwKICAgICAgICAgICAgICAgICAgICBhY2Nlc3Nfc2VjcmV0KQpgYGAKCkNvbiBlc28sIHBvZGVtb3MgYWNjZWRlciBhIHZhcmlvcyB0aXBvcyBkZSBmdW5jaW9uZXMuIFBvciBlamVtcGxvLCBwb2RlbW9zCmFjY2VkZXIgYSB1biBlbmRwb2ludCBkZSBsYSBTZWFyY2ggQVBJIHF1ZSByZWN1cGVyYSB0d2VldHMgcXVlIGNvbnRpZW5lbiBsb3MKdMOpcm1pbm9zIHF1ZSBwYXNhbW9zIGVuIGVsIGFyZ3VtZW50by4gCgpgYGB7cn0KdHdlZXRzIDwtIHNlYXJjaFR3aXR0ZXIoIkxhY2FsbGUgUG91Iiwgbj0yMCkKdHdlZXRzW1sxXV0KYGBgCgpBcXXDrSBlcyBkb25kZSB2ZW1vcyBlbCB2YWxvciBkZSB1c2FyIHVuIHBhcXVldGUgY29tbyBgdHdpdHRlUmAuIFNpIHBvciBlamVtcGxvCnBlZGltb3MgbcOhcyBpbmZvcm1hY2nDs24gc29icmUgZWwgb2JqZXRvLCB2ZW1vcyBxdWUgZW4gcmVhbGlkYWQgY29udGllbmUgbcOhcyBxdWUKc2ltcGxlbWVudGUgZWwgdHdlZXQgcXVlIGhlbW9zIHJlY3VwZXJhZG8uIEFsIGluc3BlY2Npb25hciBlbCBvYmpldG8gdmVtb3MgcXVlCmVuIHJlYWxpZGFkIGNvbnRpZW5lIGxvcyBkYXRvcyByZWxhdGl2b3MgYWwgdHdlZXQsIGNvbW8gY3XDoW5kbyBmdWUgZXNjcml0bywgcG9yCnF1acOpbiwgYSBxdcOpIGhvcmEsIC4uLiAKCmBgYHtyfQpzdHIodHdlZXRzW1sxXV0pCmBgYAoKTm8gc29sbyBlc28sIHRhbWJpw6luIG5vcyBvZnJlY2UgdW4gZ3J1cG8gZGUgZnVuY2lvbmVzIHBhcmEgaW50ZXJhY3R1YXIgY29uIGVzYQppbmZvcm1hY2nDs24gc2luIHRlbmVyIHF1ZSBidXNjYXIgYSB0cmF2w6lzIGRlIGxhIGxpc3RhIGRlIGRhdG9zLiBQb3IgZWplbXBsbywgbm9zCnBlcm1pdGUgYWNjZWRlciBhbCBuw7ptZXJvIGRlIGdlbnRlIHF1ZSBoYSBoZWNobyBfZmF2b3JpdGVfIGEgZXN0ZSB0d2VldCwgbGEKaWRlbnRpZGFkIGRlIGxvcyB1c3VhcmlvcyBxdWUgbG8gaGFuIHJldHVpdGVhZG8sIG8gYSB0cmF2w6lzIGRlIHF1w6kgcGxhdGFmb3JtYQpzZSBoYSBlbWl0aWRvIGVsIHR3ZWV0LiBFcyBpbXBvcnRhbnRlIHRlbmVyIGVuIGN1ZW50YQpsYSBwZWN1bGlhciBmb3JtYSBkZSBhY2NlZGVyIGEgZXN0YSBpbmZvcm1hY2nDs24sIGNvbW8gbcOpdG9kbyBhcGxpY2FkbyBhIGNhZGEKb2JqZXRvIGRlIGxhIGxpc3RhOgoKYGBge3J9CnR3ZWV0c1tbMV1dJGdldEZhdm9yaXRlQ291bnQoKQp0d2VldHNbWzFdXSRzdGF0dXNTb3VyY2UKYGBgCgpUYW1iacOpbiB0ZW5lbW9zIGZ1bmNpb25lcyBlc3BlY2lhbGl6YWRhcyBlbiBjYXB0dXJhciBpbmZvcm1hY2nDs24gYWNlcmNhIGRlCnVzdWFyaW9zOgoKYGBge3J9Cm15c2VsZiA8LSBnZXRVc2VyKCJncml2ZXJvcnoiKQpteXNlbGYKc3RyKG15c2VsZikKYGBgCnF1ZSBub3Mgb2ZyZWNlbiB0YW1iacOpbiBsYSBwb3NpYmlsaWRhZCBkZSBhY2NlZGVyIGEgaW5mb3JtYWNpw7NuIGFkaWNpb25hbCBzb2JyZQplc2UgdGlwbyBkZSBvYmpldG8KCmBgYHtyfQpteXNlbGYkZ2V0RGVzY3JpcHRpb24oKQpgYGAKCkxvIG3DoXMgaW50ZXJlc2FudGUgZXMgdmVyIGPDs21vIGVzIHBvc2libGUgImVuY2FkZW5hciIgZXN0ZSB0aXBvIGRlIGZ1bmNpb25lcy4KUG9yIGVqZW1wbG8sIHBvZGVtb3MgcmVjdXBlcmFyIHF1acOpbmVzIHNvbiBtaXMgc2VndWlkb3JlcyBlbiBUd2l0dGVyCgpgYGB7cn0KZm9sbG93ZXJzIDwtIG15c2VsZiRnZXRGb2xsb3dlcklEcygpCmhlYWQoZm9sbG93ZXJzKQpgYGAKeSB2ZXIgcXVlIGVsIG51ZXZvIG9iamV0byBgZm9sbG93ZXJzYCBub3MgcGVybWl0ZSBhY2NlZGVyIGEgaW5mb3JtYWNpw7NuIGRlIGNhZGEKdW5vIGRlIGVsbG9zIGNvbW8gdXN1YXJpbwoKYGBge3J9CmdldFVzZXIoZm9sbG93ZXJzWzEyM10pCmBgYApsbyBjdWFsIG5vcyBkYSBsYSBwb3NpYmlsaWRhZCBkZSByZWNvbnN0cnVpciBsYSByZWQgZGUgbWlzIHNlZ3VpZG9yZXMgeSBzdXMKc2VndWlkb3Jlcy4gRW4gbGEgcHLDs3hpbWEgc2VzacOzbiB2ZXJlbW9zIGxhcyBoZXJyYW1pZW50YXMgbmVjZXNhcmlhcyBwYXJhIGxsZXZhcgphIGNhYm8gZXN0ZSB0aXBvIGRlIGFuw6FsaXNpcy4KCkZpbmFsbWVudGUsIGB0d2l0dGVSYCB0YW1iacOpbiBub3MgZGEgYWNjZXNvIGEgbG9zIF90aW1lbGluZXNfIGEgdHJhdsOpcyBkZQpgdXNlclRpbWVsaW5lYCBjb24gbGEgcG9zaWJpbGlkYWQgZGUgY29udHJvbGFyIGN1w6FudG9zIHR3ZWV0cyByZWN1cGVyYXIsIHNpCmluY2x1aXIgcmV0d2VldHMsIG8gX3JlcGxpZXNfLgoKYGBge3J9Cm15dG0gPC0gdXNlclRpbWVsaW5lKCJncml2ZXJvcnoiKQpsZW5ndGgobXl0bSkKbXl0bVtbMV1dCmBgYAoKWSB0YW1iacOpbiBub3MgcGVybWl0ZSBpbnRlcmFjdHVhciBjb24gbGEgbGlzdGEgZGUgdHJlbmRpbmcgdG9waWNzLCBwYXJhIGxvIGN1YWwKdGVuZW1vcyBxdWUgc2VsZWNjaW9uYXIgbGEgZ2VvZ3JhZsOtYSBlbiBsYSBxdWUgZXN0YW1vcyBpbnRlcmVzYWRvcwoKYGBge3J9CmhlYWQoYXZhaWxhYmxlVHJlbmRMb2NhdGlvbnMoKSkKaGVhZChnZXRUcmVuZHMoNDY4NzM5KSkgIyMgQnVlbm9zIEFpcmVzCmBgYAo=