| Title: | Collect Posts and User Data from 'X' (Formerly 'Twitter') |
|---|---|
| Description: | Collects posts, user profiles, lists, followers and related metadata from the social network 'X' (formerly 'Twitter') and returns them as tidy data frames. Data are retrieved through a local 'Node.js' engine that drives a 'Chromium' browser with 'Playwright', reusing the sessions of the user's own accounts. Work can be distributed across several accounts of the user while respecting the per-endpoint rate limits reported by 'X'; the design of this account pool is ported from the 'Python' library 'twscrape' <https://github.com/vladkens/twscrape>. Also includes helpers to plot word, emoji and time frequencies, and optional sentiment and image analysis through the 'OpenAI' API. Documentation is written in Spanish. |
| Authors: | Agustín Nieto [aut, cre], vladkens [ctb, cph] (Author of 'twscrape'; the account pool logic is ported from it, see inst/COPYRIGHTS) |
| Maintainer: | Agustín Nieto <[email protected]> |
| License: | MIT + file LICENSE |
| Version: | 0.8.1.9000 |
| Built: | 2026-10-22 19:31:58 UTC |
| Source: | https://github.com/agusnieto77/TweetScraperR |
Lista las cuentas importadas con importSessionX(), si estan activas, en
pausa (y hasta cuando) por endpoint, y cuantas respuestas aportaron.
accountsX()accountsX()
Un tibble con una fila por cuenta y columnas: cuenta, usuario_x
(@usuario real, lo completa checkAccountsX()), activa, pausas (endpoints
en pausa y hora en que se liberan), requests (total de respuestas
obtenidas), requests_por_endpoint, ultimo_uso, proxy, error.
## Not run: accountsX() ## End(Not run)## Not run: accountsX() ## End(Not run)
Agregar varias cuentas al pool de una vez
addAccountsX(accounts)addAccountsX(accounts)
accounts |
Un data frame, o la ruta a un CSV, con las columnas
|
Invisiblemente, los nombres de las cuentas agregadas.
## Not run: # cuentas.csv: account,auth_token,ct0,proxy addAccountsX("cuentas.csv") accountsX() ## End(Not run)## Not run: # cuentas.csv: account,auth_token,ct0,proxy addAccountsX("cuentas.csv") accountsX() ## End(Not run)
Abre X con la sesion de cada cuenta y comprueba que siga autenticada,
registrando el @usuario real que hay detras (columna usuario_x de
accountsX()). Las cuentas con sesion vencida o bloqueada se desactivan;
las validas se reactivan. No consume cupo de los endpoints de recoleccion.
Si dos cuentas del pool resultan ser la misma cuenta de X (p. ej. la
"default" de versiones previas cargada de nuevo con otro nombre), se
reescribe: queda la agregada mas recientemente, con las pausas y
estadisticas de ambas.
checkAccountsX(accounts = NULL)checkAccountsX(accounts = NULL)
accounts |
Nombres de las cuentas a validar. Por defecto, todas (incluidas las desactivadas). |
Un tibble con una fila por cuenta y columnas cuenta, valida, usuario_x y motivo (por que no es valida).
## Not run: importSessionX(cookies = Sys.getenv("X2_COOKIES"), account = "cuenta2") checkAccountsX() ## End(Not run)## Not run: importSessionX(cookies = Sys.getenv("X2_COOKIES"), account = "cuenta2") checkAccountsX() ## End(Not run)
Ejecuta el comando doctor del motor y devuelve la informacion de versiones.
checkPlaywrightEngine()checkPlaywrightEngine()
Invisiblemente, una lista con ok, version de Playwright, version
de Node y ruta de Chromium. Lanza un error si el motor no responde.
## Not run: checkPlaywrightEngine() ## End(Not run)## Not run: checkPlaywrightEngine() ## End(Not run)
Esta función procesa un conjunto de tweets almacenados localmente y extrae información relevante de cada uno. Puede manejar tanto un dataframe como una lista que contenga el HTML de los tweets, sus URLs correspondientes y las fechas de captura.
extractTweetsData(data)extractTweetsData(data)
data |
Un dataframe o una lista que contiene tres elementos: 'art_html' (el contenido HTML de los tweets), 'url' (las URLs de los tweets) y 'fecha_captura' (la fecha y hora de captura de cada tweet). |
La función utiliza expresiones XPath y selectores CSS para extraer información específica de cada tweet. Procesa cada tweet individualmente y maneja posibles errores, permitiendo continuar con el procesamiento incluso si algunos tweets fallan. La función ahora puede manejar tanto URLs de Twitter como de X.com. Se han añadido nuevas extracciones, como enlaces a videos de YouTube y se ha mejorado la extracción de emoticones.
Un tibble con las siguientes columnas:
fecha: La fecha y hora del tweet.
username: El nombre de usuario del autor del tweet.
texto: El texto principal del tweet.
tweet_citado: El texto del tweet citado, si existe.
user_citado: El nombre de usuario del autor del tweet citado, si existe.
emoticones: Una lista de emoticones utilizados en el tweet.
links_img_user: El enlace a la imagen de perfil del usuario.
links_img_post: Una lista de enlaces a las imágenes incluidas en el tweet.
links_youtube: Una lista de enlaces a videos de YouTube mencionados en el tweet.
respuestas: El número de respuestas al tweet.
reposteos: El número de reposteos del tweet.
megustas: El número de "me gusta" del tweet.
metricas: Información adicional sobre las métricas del tweet.
urls: Una lista de URLs mencionadas en el tweet.
hilo: Indica si el tweet es parte de un hilo (basado en el número de respuestas).
url: La URL original del tweet.
fecha_captura: La fecha y hora en que se capturó la información del tweet (heredada de los datos de entrada).
## Not run: # Usando un dataframe tweets_data <- data.frame( art_html = c("<html>...</html>", "<html>...</html>"), url = c("https://twitter.com/user1/status/123", "https://x.com/user2/status/456"), fecha_captura = c("2023-01-01 12:00:00", "2023-01-02 13:00:00") ) resultados <- extractTweetsData(tweets_data) # Usando una lista tweets_list <- list( art_html = c("<html>...</html>", "<html>...</html>"), url = c("https://twitter.com/user1/status/123", "https://x.com/user2/status/456"), fecha_captura = c("2023-01-01 12:00:00", "2023-01-02 13:00:00") ) resultados <- extractTweetsData(tweets_list) ## End(Not run)## Not run: # Usando un dataframe tweets_data <- data.frame( art_html = c("<html>...</html>", "<html>...</html>"), url = c("https://twitter.com/user1/status/123", "https://x.com/user2/status/456"), fecha_captura = c("2023-01-01 12:00:00", "2023-01-02 13:00:00") ) resultados <- extractTweetsData(tweets_data) # Usando una lista tweets_list <- list( art_html = c("<html>...</html>", "<html>...</html>"), url = c("https://twitter.com/user1/status/123", "https://x.com/user2/status/456"), fecha_captura = c("2023-01-01 12:00:00", "2023-01-02 13:00:00") ) resultados <- extractTweetsData(tweets_list) ## End(Not run)
Recupera las cuentas que integran una Lista de X consultando la API
GraphQL interna de X (ListMembers). Requiere una sesion importada con
importSessionX().
getListMembersAPI(list_id, n_users = 100, dir = getwd(), save = FALSE)getListMembersAPI(list_id, n_users = 100, dir = getwd(), save = FALSE)
list_id |
Id numerico de la lista o su URL
( |
n_users |
Numero maximo de usuarixs a recuperar. Por defecto 100. |
dir |
Directorio de destino del RDS. Por defecto el de trabajo. |
save |
Logico. Si TRUE guarda el resultado en un RDS dentro de |
Un tibble con una fila por usuarix (mismas columnas que
getUsersDataAPI()).
## Not run: importSessionX(auth_token = "...", ct0 = "...") getListMembersAPI("53645372") ## End(Not run)## Not run: importSessionX(auth_token = "...", ct0 = "...") getListMembersAPI("53645372") ## End(Not run)
Recupera los tweets mas recientes de una Lista de X consultando la API
GraphQL interna de X (ListLatestTweetsTimeline). Requiere una sesion
importada con importSessionX().
getListTweetsAPI(list_id, n_tweets = 40, dir = getwd(), save = FALSE)getListTweetsAPI(list_id, n_tweets = 40, dir = getwd(), save = FALSE)
list_id |
Id numerico de la lista o su URL
( |
n_tweets |
Numero maximo de tweets a recuperar. Por defecto 40. |
dir |
Directorio de destino del RDS. Por defecto el de trabajo. |
save |
Logico. Si TRUE guarda el resultado en un RDS dentro de |
Un tibble con un tweet por fila (mismas columnas que
getUserTweetsAPI()).
## Not run: importSessionX(auth_token = "...", ct0 = "...") getListTweetsAPI("https://x.com/i/lists/53645372", n_tweets = 100) ## End(Not run)## Not run: importSessionX(auth_token = "...", ct0 = "...") getListTweetsAPI("https://x.com/i/lists/53645372", n_tweets = 100) ## End(Not run)
Recupera los datos de tweets a partir de sus URLs consultando la API
GraphQL interna de X (TweetDetail). Devuelve datos estructurados del JSON.
Es el reemplazo basado en API de getTweetsData(). Requiere una sesion
importada con importSessionX().
getTweetsDataAPI(urls_tweets, dir = getwd(), save = FALSE)getTweetsDataAPI(urls_tweets, dir = getwd(), save = FALSE)
urls_tweets |
Vector de URLs de tweets (formato https://x.com/u/status/123). |
dir |
Directorio de destino del RDS. Por defecto el de trabajo. |
save |
Logico. Si TRUE guarda el resultado en un RDS dentro de |
Un tibble con una fila por tweet (mismas columnas que getUserTweetsAPI).
## Not run: importSessionX(auth_token = "...", ct0 = "...") getTweetsDataAPI("https://x.com/sanchezcastejon/status/2111426246517072370") ## End(Not run)## Not run: importSessionX(auth_token = "...", ct0 = "...") getTweetsDataAPI("https://x.com/sanchezcastejon/status/2111426246517072370") ## End(Not run)
Esta función toma un dataframe de tweets y extrae todos los hashtags del campo 'texto' o 'tweet', añadiéndolos como una nueva columna al dataframe.
getTweetsHashtags(df)getTweetsHashtags(df)
df |
Un dataframe que contiene una columna 'texto' o 'tweet' con el contenido de los tweets. |
Un dataframe con una nueva columna 'hashtags' que contiene, para cada tweet,
un vector de caracteres con sus hashtags. Los tweets sin hashtags devuelven
character(0). Nota: en versiones anteriores los hashtags llegaban anidados en
una lista adicional (x[[i]][[1]]) y los tweets sin hashtags devolvían NA.
df1 <- data.frame( texto = c("Este es un #tweet con #hashtags", "Este no tiene hashtags", "Otro #ejemplo") ) getTweetsHashtags(df1) df2 <- data.frame( tweet = c("Este es un #tweet con #hashtags", "Este no tiene hashtags", "Otro #ejemplo") ) getTweetsHashtags(df2)df1 <- data.frame( texto = c("Este es un #tweet con #hashtags", "Este no tiene hashtags", "Otro #ejemplo") ) getTweetsHashtags(df1) df2 <- data.frame( tweet = c("Este es un #tweet con #hashtags", "Este no tiene hashtags", "Otro #ejemplo") ) getTweetsHashtags(df2)
Descarga todos los tweets de una busqueda en un periodo. Una sola consulta
de getTweetsSearchAPI() devuelve como mucho unos cientos de tweets (X deja
de paginar), asi que en periodos densos se pierde casi todo. Esta funcion
trocea el periodo en ventanas (mes, semana o dia segun su duracion) y,
cuando una ventana se satura, sigue pidiendo desde el tweet mas viejo
recibido hacia atras; si no avanza, la subdivide (6 h, 3 h, 1 h, 30 min).
La estrategia esta adaptada del modo "optimized search" de
t-hoarder-twscrape.
Limite de X: el buscador solo tiene completo el contenido de los
ultimos ~7 dias (desde las 00:00 UTC de hace 7 dias). Mas atras, la
pestania "Latest" devuelve un residuo (en las pruebas, 37 tweets en un dia
con miles). Para ese tramo la funcion usa "Destacados" (Top) en ventanas
fijas de 3 horas, que en las pruebas devolvio unas diez veces mas (410 en
el mismo dia). Aun asi es una muestra de lo que X considera relevante,
no el total: para eventos en curso, descarga mientras estan dentro de los 7
dias, o sigue el tema con getTweetsLiveAPI().
Guardado y reanudacion: con save = TRUE o db, cada consulta se
guarda en una base SQLite apenas llega (un corte no pierde lo confirmado).
Si la descarga se corta (Ctrl+C, error, falta de cuentas), se reanuda
llamando de nuevo con el mismo search y db = "<ruta>.sqlite": solo se
piden las ventanas pendientes, con el periodo y el plan de ventanas
guardados al crear la base, y una ventana saturada sigue desde la frontera
a la que habia llegado. Una ventana con alguna consulta fallida o
incompleta queda pendiente. Como X trunca respuestas al azar, una respuesta
corta no cierra la ventana: se sigue pidiendo lo anterior al tweet mas
viejo recibido. Antes de aceptar un vacio se verifica con una consulta
testigo que X no este frenando en silencio (tras muchas consultas devuelve
vacio todo sin avisar); si frena, la descarga se corta y queda pendiente
para reanudar mas tarde. Cada tweet ocupa unos 2 KB en la base.
getTweetsHistoricalAPI( search, since = NULL, until = NULL, n_per_window = 900, db = NULL, dir = getwd(), save = FALSE )getTweetsHistoricalAPI( search, since = NULL, until = NULL, n_per_window = 900, db = NULL, dir = getwd(), save = FALSE )
search |
Consulta de busqueda (soporta los operadores de X). |
since |
Comienzo del periodo: un dia |
until |
Fin del periodo, mismos formatos. Un dia incluye ese dia completo (hasta las 24:00 UTC). Por defecto, ahora (al reanudar, el fin guardado). |
n_per_window |
Tope de tweets por consulta. Una ventana que devuelve
500 o mas (o |
db |
Ruta a una base |
dir |
Directorio donde se crea la base cuando |
save |
Logico. Si TRUE y no se pasa |
Un tibble con un tweet por fila, del mas nuevo al mas viejo, solo
con tweets dentro del periodo (mismas columnas que getTweetsSearchAPI()).
Al reanudar incluye lo descargado en las corridas anteriores.
## Not run: importSessionX(auth_token = "...", ct0 = "...") tw <- getTweetsHistoricalAPI("milei", since = "2026-10-20", until = "2026-10-21", save = TRUE) # Si se corto: reanudar con la base que creo tw <- getTweetsHistoricalAPI("milei", db = "api_historical_milei_2026_10_21_22_43_04.sqlite") ## End(Not run)## Not run: importSessionX(auth_token = "...", ct0 = "...") tw <- getTweetsHistoricalAPI("milei", since = "2026-10-20", until = "2026-10-21", save = TRUE) # Si se corto: reanudar con la base que creo tw <- getTweetsHistoricalAPI("milei", db = "api_historical_milei_2026_10_21_22_43_04.sqlite") ## End(Not run)
Esta función analiza imágenes asociadas con tweets. Procesa un vector de URLs de imágenes o rutas de archivos locales, envía estas imágenes a la API de OpenAI para su análisis y devuelve un informe detallado sobre el contenido de cada imagen.
getTweetsImagesAnalysis( img_sources, modelo = "gpt-4o-mini", api_key = Sys.getenv("OPENAI_API_KEY"), dir = getwd(), save = FALSE )getTweetsImagesAnalysis( img_sources, modelo = "gpt-4o-mini", api_key = Sys.getenv("OPENAI_API_KEY"), dir = getwd(), save = FALSE )
img_sources |
Un vector de caracteres que contiene las URLs de las imágenes o rutas de archivos locales a analizar. |
modelo |
Una cadena de caracteres que contiene el modelo de OpenAI. Por defecto es "gpt-4o-mini". |
api_key |
Una cadena de caracteres que contiene la clave de API de OpenAI.
Por defecto es |
dir |
Una cadena de caracteres que especifica el directorio donde se
guardan los resultados cuando |
save |
Logico. Si TRUE guarda los resultados (totales y parciales) en
archivos RDS dentro de |
La función realiza los siguientes pasos:
Verifica la presencia de una clave de API válida.
Procesa el vector de URLs de imágenes o rutas de archivos locales, eliminando valores NA.
Convierte los archivos locales a formato base64 si es necesario.
Define un prompt de sistema detallado para la API de OpenAI, instruyéndola sobre cómo analizar las imágenes.
Para cada imagen:
Envía una solicitud a la API de OpenAI con la URL de la imagen o los datos base64.
Procesa la respuesta de la API para extraer los resultados del análisis.
Combina todos los resultados en un solo tibble.
Si save = TRUE, guarda los resultados como archivos RDS en el directorio especificado, con resultados parciales cada 7 imágenes si el total es mayor a 7.
El análisis de la imagen incluye:
Clasificación del tipo de imagen (por ejemplo, foto, meme, captura de pantalla)
Detección de texto en la imagen (limitado a 10 palabras si es extenso)
Identificación de contenido discriminatorio, violento, pornográfico o inapropiado
Una descripción detallada del contenido de la imagen
Generación de palabras clave descriptivas
Un tibble con las siguientes columnas:
clasificacion |
La clasificación de la imagen |
contiene_texto |
Un booleano que indica si la imagen contiene texto |
texto_contenido |
El contenido de texto de la imagen (si lo hay, limitado a 10 palabras) |
contenido_discriminatorio |
Un booleano que indica la presencia de contenido discriminatorio |
contenido_violento |
Un booleano que indica la presencia de contenido violento |
contenido_pornografico |
Un booleano que indica la presencia de contenido pornográfico |
contenido_inapropiado |
Un booleano que indica la presencia de contenido inapropiado |
descripcion |
Una descripción detallada de la imagen |
palabras_clave |
Una cadena de texto con 2 a 4 palabras clave separadas por punto y coma |
img |
La URL o nombre del archivo de la imagen analizada |
Esta función requiere una conexión a internet activa y una clave de API de OpenAI válida para funcionar correctamente. La función está diseñada para manejar errores y continuar procesando otras imágenes si una falla. El tiempo de espera para las solicitudes HTTP está configurado en 300 segundos (5 minutos). Tenga en cuenta que las imágenes analizadas (sus URLs o su contenido codificado en base64) se transmiten a la API de OpenAI (un servicio de terceros).
## Not run: # Ejemplo de uso con un vector de URLs de imágenes urls <- c("https://ejemplo.com/imagen1.jpg", "https://ejemplo.com/imagen2.jpg") resultados <- getTweetsImagesAnalysis(urls) # Ejemplo de uso con rutas de archivos locales archivos_locales <- c("./imagen1.jpg", "./imagen2.png") resultados_locales <- getTweetsImagesAnalysis(archivos_locales) ## End(Not run)## Not run: # Ejemplo de uso con un vector de URLs de imágenes urls <- c("https://ejemplo.com/imagen1.jpg", "https://ejemplo.com/imagen2.jpg") resultados <- getTweetsImagesAnalysis(urls) # Ejemplo de uso con rutas de archivos locales archivos_locales <- c("./imagen1.jpg", "./imagen2.png") resultados_locales <- getTweetsImagesAnalysis(archivos_locales) ## End(Not run)
Sigue una busqueda "hacia adelante": repite getTweetsSearchAPI() (pestania
"Latest") cada interval segundos durante duration segundos y acumula
solo los tweets nuevos. Desde la segunda ronda la consulta lleva el operador
since_id: con el ID mas reciente ya recolectado, asi que X devuelve solo lo
publicado despues y no se vuelve a gastar cupo en lo ya traido.
No es un streaming real: la granularidad es interval. Si en una ronda
aparecen n_tweets o mas tweets nuevos, los que exceden el tope quedan sin
recolectar (se avisa con un mensaje); en ese caso conviene bajar interval
o subir n_tweets. Un error en una ronda se informa y la captura sigue con
la proxima. Interrumpir con Esc / Ctrl+C termina la captura y devuelve lo
acumulado hasta ese momento.
Guardado y reanudacion: con save = TRUE o db, cada ronda se guarda
en una base SQLite apenas llega. Para continuar una captura cortada, llama
de nuevo con el mismo search y db = "<ruta>.sqlite": la primera ronda
pide lo posterior al tweet mas reciente guardado y duration cuenta desde
la nueva llamada.
getTweetsLiveAPI( search = "#RStats", interval = 300, duration = 3600, n_tweets = 100, max_tweets = Inf, db = NULL, dir = getwd(), save = FALSE )getTweetsLiveAPI( search = "#RStats", interval = 300, duration = 3600, n_tweets = 100, max_tweets = Inf, db = NULL, dir = getwd(), save = FALSE )
search |
Consulta de busqueda (soporta operadores de X, p.ej. "lang:es", "-filter:retweets"). Por defecto "#RStats". |
interval |
Segundos entre rondas. Minimo 60. Por defecto 300. |
duration |
Segundos totales de captura. Por defecto 3600 (una hora). |
n_tweets |
Tope de tweets por ronda. La primera ronda trae hasta
|
max_tweets |
La captura termina cuando la base llega a este total de
tweets. Por defecto |
db |
Ruta a una base |
dir |
Directorio donde se crea la base cuando |
save |
Logico. Si TRUE y no se pasa |
Un tibble con un tweet por fila, del mas nuevo al mas viejo (mismas
columnas que getTweetsSearchAPI()). Al continuar una captura incluye lo
guardado antes.
## Not run: importSessionX(auth_token = "...", ct0 = "...") # Una hora de captura, una ronda cada 5 minutos, guardando en cada ronda vivo <- getTweetsLiveAPI("#RStats", interval = 300, duration = 3600, save = TRUE) ## End(Not run)## Not run: importSessionX(auth_token = "...", ct0 = "...") # Una hora de captura, una ronda cada 5 minutos, guardando en cada ronda vivo <- getTweetsLiveAPI("#RStats", interval = 300, duration = 3600, save = TRUE) ## End(Not run)
Recupera el tweet y sus respuestas (hilo de conversacion) consultando la
API GraphQL interna de X. Devuelve datos estructurados del JSON. Requiere
una sesion importada con importSessionX().
getTweetsRepliesAPI(url, n_tweets = 40, dir = getwd(), save = FALSE)getTweetsRepliesAPI(url, n_tweets = 40, dir = getwd(), save = FALSE)
url |
URL del tweet del cual obtener las respuestas. |
n_tweets |
Numero maximo de tweets (tweet + respuestas) a recuperar. Por defecto 40. |
dir |
Directorio de destino del RDS. Por defecto el de trabajo. |
save |
Logico. Si TRUE guarda el resultado en un RDS dentro de |
Un tibble con un tweet por fila (mismas columnas que
getUserTweetsAPI(), incluyendo media, hashtags, menciones, etc.).
## Not run: importSessionX(auth_token = "...", ct0 = "...") getTweetsRepliesAPI("https://x.com/sanchezcastejon/status/2111426246517072370", n_tweets = 100) ## End(Not run)## Not run: importSessionX(auth_token = "...", ct0 = "...") getTweetsRepliesAPI("https://x.com/sanchezcastejon/status/2111426246517072370", n_tweets = 100) ## End(Not run)
Recupera lxs usuarixs que repostearon un tweet consultando la API GraphQL
interna de X (Retweeters). Requiere una sesion importada con importSessionX().
getTweetsRetweetsAPI(url, n_users = 100, dir = getwd(), save = FALSE)getTweetsRetweetsAPI(url, n_users = 100, dir = getwd(), save = FALSE)
url |
URL del tweet. |
n_users |
Numero maximo de usuarixs a recuperar. Por defecto 100. |
dir |
Directorio de destino del RDS. Por defecto el de trabajo. |
save |
Logico. Si TRUE guarda el resultado en un RDS dentro de |
Un tibble con una fila por usuarix (mismas columnas que getUsersDataAPI).
## Not run: importSessionX(auth_token = "...", ct0 = "...") getTweetsRetweetsAPI("https://x.com/sanchezcastejon/status/2111426246517072370", n_users = 100) ## End(Not run)## Not run: importSessionX(auth_token = "...", ct0 = "...") getTweetsRetweetsAPI("https://x.com/sanchezcastejon/status/2111426246517072370", n_users = 100) ## End(Not run)
Busca tweets que coinciden con una consulta consultando la API GraphQL
interna de X (en lugar de scrapear HTML). Devuelve datos estructurados del
JSON: texto completo, fecha exacta y metricas (respuestas, retweets, citas,
me gusta, vistas). Requiere una sesion importada con importSessionX().
getTweetsSearchAPI( search = "#RStats", n_tweets = 40, product = c("Latest", "Top", "Media"), since = NULL, until = NULL, dir = getwd(), save = FALSE )getTweetsSearchAPI( search = "#RStats", n_tweets = 40, product = c("Latest", "Top", "Media"), since = NULL, until = NULL, dir = getwd(), save = FALSE )
search |
Consulta de busqueda (soporta operadores de X, p.ej. "from:NASA", "#RStats", "lang:es"). Por defecto "#RStats". |
n_tweets |
Numero maximo de tweets a recuperar. Por defecto 40. |
product |
Pestania de resultados: "Latest" (recientes, por defecto), "Top" (destacados) o "Media". |
since |
Desde cuando (opcional). Un dia |
until |
Hasta cuando (opcional), mismos formatos que |
dir |
Directorio de destino del RDS. Por defecto el de trabajo. |
save |
Logico. Si TRUE guarda el resultado en un RDS dentro de |
Un tibble con un tweet por fila (mismas columnas que
getUserTweetsAPI(), incluyendo media, hashtags, menciones, etc.).
## Not run: importSessionX(auth_token = "...", ct0 = "...") tw <- getTweetsSearchAPI("#RStats", n_tweets = 100) getTweetsSearchAPI("from:NASA artemis", product = "Top") ## End(Not run)## Not run: importSessionX(auth_token = "...", ct0 = "...") tw <- getTweetsSearchAPI("#RStats", n_tweets = 100) getTweetsSearchAPI("from:NASA artemis", product = "Top") ## End(Not run)
Esta función toma un vector de tweets y utiliza la API de OpenAI para realizar un análisis de sentimiento detallado de cada tweet. El análisis incluye el tono, el sentimiento general, la presencia de expresiones de odio, si el tweet está direccionado a alguien específico y si contiene un llamado a la acción.
getTweetsSentiments( tweets, api_key = Sys.getenv("OPENAI_API_KEY"), model = "gpt-4o-mini", dir = getwd(), save = FALSE )getTweetsSentiments( tweets, api_key = Sys.getenv("OPENAI_API_KEY"), model = "gpt-4o-mini", dir = getwd(), save = FALSE )
tweets |
Un vector de caracteres que contiene los tweets a analizar. |
api_key |
Una cadena de caracteres con la clave de API de OpenAI. Por defecto, se intenta obtener de la variable de entorno OPENAI_API_KEY. |
model |
Una cadena de caracteres que especifica el modelo de OpenAI a utilizar. Por defecto es "gpt-4o-mini". |
dir |
Una cadena de caracteres que especifica el directorio donde se guardan
los archivos RDS con los resultados cuando |
save |
Logico. Si TRUE guarda los resultados (totales y parciales) en
archivos RDS dentro de |
La función realiza las siguientes operaciones:
Verifica que se haya proporcionado una clave de API válida.
Define un prompt detallado para el análisis de los tweets.
Define una función interna analyzeTweet que procesa cada tweet individualmente.
Procesa los tweets en lotes de 250 para manejar grandes volúmenes de datos.
Guarda resultados parciales cada 50 tweets procesados.
Devuelve los resultados como un tibble.
La función utiliza la API de OpenAI para realizar el análisis de sentimiento, por lo que requiere una conexión a Internet y una clave de API válida.
Un tibble con los resultados del análisis para cada tweet. Cada fila contiene el tweet original y los resultados del análisis (tono, sentimiento, presencia de expresiones de odio, si está direccionado, si contiene un llamado a la acción y una explicación detallada).
Esta función transmite el contenido de los tweets analizados a la API de OpenAI (un servicio de terceros). Tenga en cuenta esta transferencia de datos al trabajar con contenido de terceros o datos personales.
## Not run: tweets <- c( "¡Qué día tan maravilloso! \U0001f60a", "Odio este producto, nunca lo compren. \U0001f620" ) resultados <- getTweetsSentiments(tweets) print(resultados) ## End(Not run)## Not run: tweets <- c( "¡Qué día tan maravilloso! \U0001f60a", "Odio este producto, nunca lo compren. \U0001f620" ) resultados <- getTweetsSentiments(tweets) print(resultados) ## End(Not run)
A partir de tweets ya descargados (por ejemplo con getTweetsSearchAPI()
o getTweetsHistoricalAPI()), recupera la conversacion completa de
cada uno: respuestas, respuestas a las respuestas y asi a cualquier
profundidad. Todos los tweets de una conversacion comparten el
conversation_id del tweet que la inicio, asi que alcanza una busqueda
conversation_id:<id> por conversacion (troceada por ventanas como en
getTweetsHistoricalAPI(), para los hilos enormes).
Se omiten las conversaciones sin respuestas y cada conversacion se pide una
sola vez aunque varios tweets de entrada pertenezcan a ella. Un retweet se
sigue en el tweet original. Las conversaciones que empezaron hace mas de 7
dias quedan fuera del indice completo de X: sus respuestas son una muestra
(ver getTweetsHistoricalAPI()).
Con respuesta_a_id (el padre de cada respuesta) y conversation_id se
reconstruye el arbol.
Guardado y reanudacion: con save = TRUE o db, cada consulta se
guarda en una base SQLite apenas llega. Una conversacion se da por
terminada solo si todas sus consultas respondieron; las cortadas (Ctrl+C),
fallidas o incompletas quedan pendientes. Para reanudar, llama de nuevo con
db = "<ruta>.sqlite" (sin tweets, o con los mismos).
getTweetsThreadsAPI( tweets = NULL, n_per_window = 900, db = NULL, dir = getwd(), save = FALSE )getTweetsThreadsAPI( tweets = NULL, n_per_window = 900, db = NULL, dir = getwd(), save = FALSE )
tweets |
Un tibble de tweets (salida de las funciones |
n_per_window |
Tope de tweets por consulta, ver
|
db |
Ruta a una base |
dir |
Directorio donde se crea la base cuando |
save |
Logico. Si TRUE y no se pasa |
Un tibble con un tweet por fila (mismas columnas que
getTweetsSearchAPI()), ordenado por conversacion y fecha. Incluye el
tweet raiz de cada conversacion.
## Not run: importSessionX(auth_token = "...", ct0 = "...") tw <- getTweetsSearchAPI("#RStats", n_tweets = 100) hilos <- getTweetsThreadsAPI(tw, save = TRUE) ## End(Not run)## Not run: importSessionX(auth_token = "...", ct0 = "...") tw <- getTweetsSearchAPI("#RStats", n_tweets = 100) hilos <- getTweetsThreadsAPI(tw, save = TRUE) ## End(Not run)
Recupera y combina los timelines de varias cuentas consultando la API
GraphQL interna de X, en una sola sesion de navegador (batch). Util para
monitorear un conjunto curado de cuentas (lo que harias con una Lista de X,
pero sin necesitar un list_id). Devuelve un unico tibble ordenado por fecha
(mas reciente primero) y deduplicado. Requiere una sesion importada con
importSessionX().
getTweetsTimelinesAPI(usernames, n_tweets = 40, dir = getwd(), save = FALSE)getTweetsTimelinesAPI(usernames, n_tweets = 40, dir = getwd(), save = FALSE)
usernames |
Vector de nombres de usuarix (acepta "NASA", "@NASA" o la URL completa "https://x.com/NASA"). |
n_tweets |
Numero maximo de tweets a recuperar por cuenta. Por defecto 40. |
dir |
Directorio de destino del RDS. Por defecto el de trabajo. |
save |
Logico. Si TRUE guarda el resultado en un RDS dentro de |
Un tibble con un tweet por fila (mismas columnas que
getUserTweetsAPI()), combinado y ordenado por fecha.
## Not run: importSessionX(auth_token = "...", ct0 = "...") getTweetsTimelinesAPI(c("elravignani", "NucleoIdaes", "BNMMArgentina"), n_tweets = 100) ## End(Not run)## Not run: importSessionX(auth_token = "...", ct0 = "...") getTweetsTimelinesAPI(c("elravignani", "NucleoIdaes", "BNMMArgentina"), n_tweets = 100) ## End(Not run)
Recupera lxs seguidorxs de unx usuarix consultando la API GraphQL interna
de X (Followers). Requiere una sesion importada con importSessionX().
getUserFollowersAPI(username, n_users = 100, dir = getwd(), save = FALSE)getUserFollowersAPI(username, n_users = 100, dir = getwd(), save = FALSE)
username |
Nombre de usuarix (sin @). |
n_users |
Numero maximo de usuarixs a recuperar. Por defecto 100. |
dir |
Directorio de destino del RDS. Por defecto el de trabajo. |
save |
Logico. Si TRUE guarda el resultado en un RDS dentro de |
Un tibble con una fila por usuarix (mismas columnas que getUsersDataAPI).
## Not run: importSessionX(auth_token = "...", ct0 = "...") getUserFollowersAPI("rstatstweet", n_users = 200) ## End(Not run)## Not run: importSessionX(auth_token = "...", ct0 = "...") getUserFollowersAPI("rstatstweet", n_users = 200) ## End(Not run)
Recupera las cuentas que sigue unx usuarix consultando la API GraphQL
interna de X (Following). Requiere una sesion importada con importSessionX().
getUserFollowingAPI(username, n_users = 100, dir = getwd(), save = FALSE)getUserFollowingAPI(username, n_users = 100, dir = getwd(), save = FALSE)
username |
Nombre de usuarix (sin @). |
n_users |
Numero maximo de usuarixs a recuperar. Por defecto 100. |
dir |
Directorio de destino del RDS. Por defecto el de trabajo. |
save |
Logico. Si TRUE guarda el resultado en un RDS dentro de |
Un tibble con una fila por usuarix (mismas columnas que getUsersDataAPI).
## Not run: importSessionX(auth_token = "...", ct0 = "...") getUserFollowingAPI("rstatstweet", n_users = 200) ## End(Not run)## Not run: importSessionX(auth_token = "...", ct0 = "...") getUserFollowingAPI("rstatstweet", n_users = 200) ## End(Not run)
Recupera los tweets con media (fotos/videos) de unx usuarix consultando la
API GraphQL interna de X (UserMedia). Devuelve datos estructurados del
JSON. Requiere una sesion importada con importSessionX().
getUserMediaAPI(username = "NASA", n_tweets = 40, dir = getwd(), save = FALSE)getUserMediaAPI(username = "NASA", n_tweets = 40, dir = getwd(), save = FALSE)
username |
Nombre de usuarix (sin @). Por defecto "NASA". |
n_tweets |
Numero maximo de tweets a recuperar. Por defecto 40. |
dir |
Directorio de destino del RDS. Por defecto el de trabajo. |
save |
Logico. Si TRUE guarda el resultado en un RDS dentro de |
Un tibble con un tweet por fila (mismas columnas que getUserTweetsAPI).
## Not run: importSessionX(auth_token = "...", ct0 = "...") getUserMediaAPI("NASA", n_tweets = 100) ## End(Not run)## Not run: importSessionX(auth_token = "...", ct0 = "...") getUserMediaAPI("NASA", n_tweets = 100) ## End(Not run)
Recupera la ficha "Acerca de esta cuenta" de unx o varixs usuarixs
consultando la API GraphQL interna de X (AboutAccountQuery): el pais
desde el que opera la cuenta, cuantas veces cambio de nombre de usuarix,
desde cuando esta verificada, etc. Util para estudiar redes de cuentas
coordinadas o de origen extranjero. Requiere una sesion importada con
importSessionX(). X no publica todos los campos para todas las cuentas;
los ausentes quedan en NA.
getUsersAboutAPI(usernames, dir = getwd(), save = FALSE)getUsersAboutAPI(usernames, dir = getwd(), save = FALSE)
usernames |
Vector de nombres de usuarix (acepta "NASA", "@NASA" o la URL completa). |
dir |
Directorio de destino del RDS. Por defecto el de trabajo. |
save |
Logico. Si TRUE guarda el resultado en un RDS dentro de |
Un tibble con una fila por usuarix y columnas user, nombre, user_id, pais_cuenta, ubicacion_precisa, cambios_usuario, ultimo_cambio_usuario, afiliada_a, origen_cuenta, identidad_verificada, verificada_desde, fecha_creacion y url.
## Not run: importSessionX(auth_token = "...", ct0 = "...") getUsersAboutAPI(c("NASA", "rstatstweet")) ## End(Not run)## Not run: importSessionX(auth_token = "...", ct0 = "...") getUsersAboutAPI(c("NASA", "rstatstweet")) ## End(Not run)
Recupera los datos de perfil de unx o varixs usuarixs consultando la API
GraphQL interna de X (UserByScreenName). Requiere una sesion importada con
importSessionX().
getUsersDataAPI(usernames, dir = getwd(), save = FALSE)getUsersDataAPI(usernames, dir = getwd(), save = FALSE)
usernames |
Vector de nombres de usuarix (sin @). |
dir |
Directorio de destino del RDS. Por defecto el de trabajo. |
save |
Logico. Si TRUE guarda el resultado en un RDS dentro de |
Un tibble con una fila por usuarix y columnas user, nombre, user_id, descripcion, seguidores, siguiendo, tweets, favoritos, verificado, ubicacion, sitio_web, imagen_perfil, banner, fecha_creacion, url, tweets_media, protegida y tipo_verificacion.
## Not run: importSessionX(auth_token = "...", ct0 = "...") getUsersDataAPI(c("NASA", "rstatstweet")) ## End(Not run)## Not run: importSessionX(auth_token = "...", ct0 = "...") getUsersDataAPI(c("NASA", "rstatstweet")) ## End(Not run)
Busca cuentas (pestania "Personas" del buscador de X) consultando la API
GraphQL interna de X (SearchTimeline). Requiere una sesion importada con
importSessionX().
getUsersSearchAPI(search, n_users = 40, dir = getwd(), save = FALSE)getUsersSearchAPI(search, n_users = 40, dir = getwd(), save = FALSE)
search |
Consulta de busqueda (nombre, tema, etc.). |
n_users |
Numero maximo de usuarixs a recuperar. Por defecto 40. |
dir |
Directorio de destino del RDS. Por defecto el de trabajo. |
save |
Logico. Si TRUE guarda el resultado en un RDS dentro de |
Un tibble con una fila por usuarix (mismas columnas que getUsersDataAPI).
## Not run: importSessionX(auth_token = "...", ct0 = "...") getUsersSearchAPI("rstats", n_users = 50) ## End(Not run)## Not run: importSessionX(auth_token = "...", ct0 = "...") getUsersSearchAPI("rstats", n_users = 50) ## End(Not run)
Recupera los tweets del timeline de unx usuarix consultando la API GraphQL
interna de X (en lugar de scrapear HTML). Devuelve datos estructurados
directamente del JSON: texto completo (sin truncar), fecha exacta, y metricas
(respuestas, retweets, citas, me gusta, vistas). Requiere una sesion
importada con importSessionX().
getUserTweetsAPI(username = "NASA", n_tweets = 40, dir = getwd(), save = FALSE)getUserTweetsAPI(username = "NASA", n_tweets = 40, dir = getwd(), save = FALSE)
username |
Nombre de usuarix (sin @). Por defecto "NASA". |
n_tweets |
Numero maximo de tweets a recuperar. Por defecto 40. |
dir |
Directorio de destino del RDS. Por defecto el de trabajo. |
save |
Logico. Si TRUE guarda el resultado en un RDS dentro de |
Un tibble con un tweet por fila y columnas: fecha, user, texto (completo, tambien en tweets largos), idioma, respuestas, retweets, citas, megustas, views, emoticones (lista), hashtags (lista), menciones (lista), urls_externas (lista), media (lista de URLs), media_tipo (lista: photo/video/animated_gif), es_retweet, es_cita, tweet_citado_id, conversation_id, url, tweet_id, user_id (autorx), respuesta_a_id, respuesta_a_user, retweet_id (tweet original de un retweet), guardados, fuente (app de publicacion), sensible, editado, lugar y pais (geoetiqueta, si la hay).
## Not run: importSessionX(auth_token = "...", ct0 = "...") tw <- getUserTweetsAPI("NASA", n_tweets = 100) ## End(Not run)## Not run: importSessionX(auth_token = "...", ct0 = "...") tw <- getUserTweetsAPI("NASA", n_tweets = 100) ## End(Not run)
Esta función crea una visualización HTML interactiva de imágenes analizadas, mostrando cada imagen junto con su clasificación, descripción, palabras clave y banderas de contenido en un diseño responsivo con un carrusel y miniaturas.
HTMLImgReport(results, output_file)HTMLImgReport(results, output_file)
results |
Un data frame o tibble que contiene los resultados del análisis de imágenes de la función
|
output_file |
Una cadena de caracteres con el nombre (o la ruta) del archivo HTML de salida. Es obligatorio: la funcion no escribe archivos en una ubicacion por defecto. |
La función crea una página HTML responsiva utilizando Bootstrap para el diseño. Cada imagen se presenta en una tarjeta que incluye la imagen, su clasificación, descripción, palabras clave y banderas de contenido potencialmente problemático. El diseño se ajusta automáticamente a diferentes tamaños de pantalla.
La visualización incluye:
Un título centrado que menciona la función getTweetsImagesAnalysis
Un carrusel de tarjetas de imágenes
Una vista de miniaturas de todas las imágenes
Banderas de colores para contenido problemático
Estilos CSS personalizados para mejorar la presentación
Invisiblemente, la ruta normalizada del archivo HTML generado. Como
efecto secundario escribe el archivo en output_file y muestra un mensaje
de confirmacion.
## Not run: # Asumiendo que tienes un data frame llamado 'resultados_analisis' HTMLImgReport(resultados_analisis, output_file = file.path(tempdir(), "visualizacion_imagenes.html")) ## End(Not run)## Not run: # Asumiendo que tienes un data frame llamado 'resultados_analisis' HTMLImgReport(resultados_analisis, output_file = file.path(tempdir(), "visualizacion_imagenes.html")) ## End(Not run)
La via recomendada para autenticarse es iniciar sesion a mano en tu
navegador habitual y pasarle a esta funcion las cookies auth_token y ct0
de tu sesion (las encontras en DevTools -> Application/Almacenamiento ->
Cookies -> x.com). La sesion queda guardada en el pool de cuentas (en
tools::R_user_dir("TweetScraperR", "data")) y todas las funciones de
recoleccion la reusan sin volver a loguearse.
importSessionX( auth_token, ct0, account = "default", proxy = NULL, cookies = NULL )importSessionX( auth_token, ct0, account = "default", proxy = NULL, cookies = NULL )
auth_token |
Valor de la cookie |
ct0 |
Valor de la cookie |
account |
Nombre local de la cuenta en el pool. Por defecto "default". Reimportar con el mismo nombre renueva la sesion y reactiva la cuenta, conservando su proxy y estadisticas. |
proxy |
Proxy opcional de esta cuenta ("http://host:puerto",
"usuario:clave@host:puerto" o "socks5://host:puerto"). Tiene prioridad
sobre el proxy global |
cookies |
Alternativa a |
Importando varias cuentas propias (con distintos account) se arma un
pool que distribuye la carga de trabajo entre ellas: cada cuenta respeta
los limites de uso que X informa por endpoint (p. ej. 50 busquedas cada 15
minutos) y, cuando una llega a su limite, queda en pausa hasta que X lo
renueve mientras la recoleccion continua con otra cuenta disponible. Ver
accountsX().
Invisiblemente, el nombre de la cuenta.
## Not run: importSessionX(auth_token = "...", ct0 = "...") importSessionX(cookies = "auth_token=...; ct0=...", account = "cuenta2", proxy = "http://usuario:clave@host:8080") ## End(Not run)## Not run: importSessionX(auth_token = "...", ct0 = "...") importSessionX(cookies = "auth_token=...; ct0=...", account = "cuenta2", proxy = "http://usuario:clave@host:8080") ## End(Not run)
Instala una skill (formato Agent Skills) que le enseña a un agente de IA a usar TweetScraperR de forma conversacional: puesta a punto del motor y la sesión, qué función corresponde a cada pedido, columnas devueltas, recetas de análisis y solución de errores frecuentes.
Pensada en particular para Posit Assistant (el agente nativo de RStudio
y Positron), que la carga automáticamente cuando el pedido trata de X/Twitter
y también la expone como el comando /tweetscraperr. Sirve para cualquier
cliente compatible con Agent Skills.
installAgentSkill( agent = "posit", scope = c("user", "project"), path = NULL, overwrite = FALSE )installAgentSkill( agent = "posit", scope = c("user", "project"), path = NULL, overwrite = FALSE )
agent |
Agente(s) destino. Uno o más de:
|
scope |
|
path |
Carpeta de skills personalizada. Si se indica, ignora |
overwrite |
Lógico. Si |
En Windows la carpeta personal es %USERPROFILE% (no la carpeta Documentos
que R usa como ~), que es donde los agentes buscan sus skills. Las versiones
antiguas de Posit Assistant usaban ~/.positai/skills/: si tenés una de esas
versiones, usá path = "~/.positai/skills" o actualizá el asistente.
La skill queda disponible en la siguiente conversación del agente.
Invisiblemente, las rutas de las carpetas de la skill instaladas.
## Not run: # Posit Assistant, para todos los proyectos installAgentSkill() # Posit Assistant y Claude Code, solo en el proyecto actual installAgentSkill(c("posit", "claude"), scope = "project") # Actualizar la skill tras reinstalar el paquete installAgentSkill(overwrite = TRUE) ## End(Not run)## Not run: # Posit Assistant, para todos los proyectos installAgentSkill() # Posit Assistant y Claude Code, solo en el proyecto actual installAgentSkill(c("posit", "claude"), scope = "project") # Actualizar la skill tras reinstalar el paquete installAgentSkill(overwrite = TRUE) ## End(Not run)
Copia el motor (inst/node) a la carpeta de cache del usuario
(tools::R_user_dir("TweetScraperR", "cache")) y ejecuta alli
npm install, que instala 'Playwright', 'playwright-extra' y su plugin
'stealth' (ajustes de compatibilidad para que el navegador automatizado se
presente como un 'Chromium' de escritorio estandar) y descarga el navegador
'Chromium'. Nada de esto ocurre al instalar el paquete: hay que llamar a esta
funcion explicitamente, una vez por maquina, antes de usar las funciones de
recoleccion. Requiere 'Node.js' (>= 18) con 'npm' y conexion a internet.
installPlaywrightEngine(npm = "npm")installPlaywrightEngine(npm = "npm")
npm |
Ruta al binario de npm (por defecto "npm" del PATH). |
Invisiblemente, el codigo de salida de npm (0 si todo salio bien).
## Not run: installPlaywrightEngine() ## End(Not run)## Not run: installPlaywrightEngine() ## End(Not run)
Abre un navegador 'Chromium' controlado por 'Playwright', realiza el login
en X/Twitter con el flujo del modal actual y guarda la sesion autenticada
(cookies + storage) como una cuenta del pool. Las demas funciones del
paquete reusan esa sesion sin volver a loguearse, lo que evita inicios de
sesion repetidos. La via recomendada es importSessionX(), que reutiliza la
sesion de tu navegador habitual.
loginX( xuser = Sys.getenv("TWITTER_USER", Sys.getenv("USER")), xpass = Sys.getenv("TWITTER_PASS", Sys.getenv("PASS")), email = Sys.getenv("TWITTER_EMAIL", ""), headless = TRUE, account = "default", proxy = NULL )loginX( xuser = Sys.getenv("TWITTER_USER", Sys.getenv("USER")), xpass = Sys.getenv("TWITTER_PASS", Sys.getenv("PASS")), email = Sys.getenv("TWITTER_EMAIL", ""), headless = TRUE, account = "default", proxy = NULL )
xuser |
Usuario de X/Twitter. Por defecto la variable de entorno TWITTER_USER (con fallback a USER). |
xpass |
Contrasena de X/Twitter. Por defecto la variable de entorno TWITTER_PASS (con fallback a PASS). |
email |
Correo para el paso de verificacion de identidad, si X lo pide. Por defecto la variable de entorno TWITTER_EMAIL. |
headless |
Logico. Si TRUE (por defecto) corre el navegador sin interfaz. Pone FALSE para ver/depurar el login. |
account |
Nombre local de la cuenta en el pool. Por defecto "default". |
proxy |
Proxy opcional para rutear el trafico (p. ej. en redes que exigen salir por un proxy). Acepta un string "http://host:puerto" o "usuario:clave@host:puerto", o una lista list(server=, username=, password=). Si es un string queda guardado como proxy de la cuenta. |
Invisiblemente, el nombre de la cuenta. Lanza un error si el login falla o si X limita el intento.
## Not run: loginX(xuser = "mi_usuario", xpass = Sys.getenv("TWITTER_PASS"), headless = FALSE) ## End(Not run)## Not run: loginX(xuser = "mi_usuario", xpass = Sys.getenv("TWITTER_PASS"), headless = FALSE) ## End(Not run)
Esta función toma un dataframe de tweets y crea un gráfico de barras mostrando la frecuencia de los emoticones utilizados en los tweets.
plotEmojis(df, top_n = 10, fill = "skyblue", color = "grey30")plotEmojis(df, top_n = 10, fill = "skyblue", color = "grey30")
df |
Un dataframe que contiene una columna 'emoticones' con listas de emoticones. |
top_n |
Número de emoticones más frecuentes a mostrar (por defecto 10). |
fill |
Color de las barras en el gráfico (por defecto "skyblue"). |
color |
Color de los bordes de las barras en el gráfico (por defecto "grey30"). |
Un objeto ggplot con el gráfico de barras.
## Not run: df <- data.frame(emoticones = I(list( c("\U0001F60A", "\U0001F602", "\U0001F602"), c("\U0001F60A"), c("\U0001F602", "\U0001F60D"), character(0) ))) plotEmojis(df) ## End(Not run)## Not run: df <- data.frame(emoticones = I(list( c("\U0001F60A", "\U0001F602", "\U0001F602"), c("\U0001F60A"), c("\U0001F602", "\U0001F60D"), character(0) ))) plotEmojis(df) ## End(Not run)
Esta función toma un dataframe de tweets y crea un gráfico de barras mostrando la frecuencia de los emoticones en colores utilizados en los tweets.
plotEmojisPNG(df, top_n = 10, fill = "skyblue", color = "grey30")plotEmojisPNG(df, top_n = 10, fill = "skyblue", color = "grey30")
df |
Un dataframe que contiene una columna 'emoticones' con listas de emoticones. |
top_n |
Número de emoticones más frecuentes a mostrar (por defecto 10). |
fill |
Color de las barras en el gráfico (por defecto "skyblue"). |
color |
Color de los bordes de las barras en el gráfico (por defecto "grey30"). |
Un objeto ggplot con el gráfico de barras.
## Not run: df <- data.frame(emoticones = I(list( c("\U0001F60A", "\U0001F602", "\U0001F602"), c("\U0001F60A"), c("\U0001F602", "\U0001F60D"), character(0) ))) plotEmojisPNG(df) ## End(Not run)## Not run: df <- data.frame(emoticones = I(list( c("\U0001F60A", "\U0001F602", "\U0001F602"), c("\U0001F60A"), c("\U0001F602", "\U0001F60D"), character(0) ))) plotEmojisPNG(df) ## End(Not run)
Esta función toma un dataframe de tweets y crea un gráfico de líneas mostrando la frecuencia de tweets a lo largo del tiempo, con opciones para agrupar por hora, día, semana, mes o año.
plotTime(df, group_by = "hour", color = "blue")plotTime(df, group_by = "hour", color = "blue")
df |
Un dataframe que contiene una columna 'fecha' con las fechas de los tweets. |
group_by |
Una cadena que indica cómo agrupar las fechas. Opciones válidas son "hour", "day", "week", "month", "year". |
color |
Color de la línea en el gráfico (por defecto "blue"). |
Un objeto ggplot con el gráfico de líneas.
df <- data.frame(fecha = c( seq(as.POSIXct("2023-01-02 00:00:00"), by = "hour", length.out = 3), seq(as.POSIXct("2023-01-02 01:00:00"), by = "hour", length.out = 2), seq(as.POSIXct("2023-01-02 03:00:00"), by = "hour", length.out = 3), seq(as.POSIXct("2023-01-02 01:00:00"), by = "hour", length.out = 2), seq(as.POSIXct("2023-01-02 03:00:00"), by = "hour", length.out = 3), seq(as.POSIXct("2023-01-02 01:00:00"), by = "hour", length.out = 2), seq(as.POSIXct("2023-01-02 03:00:00"), by = "hour", length.out = 3) )) plotTime(df, group_by = "hour")df <- data.frame(fecha = c( seq(as.POSIXct("2023-01-02 00:00:00"), by = "hour", length.out = 3), seq(as.POSIXct("2023-01-02 01:00:00"), by = "hour", length.out = 2), seq(as.POSIXct("2023-01-02 03:00:00"), by = "hour", length.out = 3), seq(as.POSIXct("2023-01-02 01:00:00"), by = "hour", length.out = 2), seq(as.POSIXct("2023-01-02 03:00:00"), by = "hour", length.out = 3), seq(as.POSIXct("2023-01-02 01:00:00"), by = "hour", length.out = 2), seq(as.POSIXct("2023-01-02 03:00:00"), by = "hour", length.out = 3) )) plotTime(df, group_by = "hour")
Esta función toma un dataframe de tweets y crea una nube de palabras basada en el contenido de la columna 'texto' o 'tweet'.
plotWords( df, min_freq = 3, max_words = 100, random_order = FALSE, colors = "random-dark", size = 0.3, lang = "es", sw = NULL )plotWords( df, min_freq = 3, max_words = 100, random_order = FALSE, colors = "random-dark", size = 0.3, lang = "es", sw = NULL )
df |
Un dataframe que contiene una columna 'texto' o 'tweet' con el contenido de los tweets. |
min_freq |
Frecuencia mínima de palabras para incluir en la nube (por defecto 3). |
max_words |
Número máximo de palabras a incluir en la nube (por defecto 100). |
random_order |
Booleano, si las palabras deben ordenarse aleatoriamente (por defecto FALSE). |
colors |
Vector de colores para las palabras (por defecto 'random-dark'). |
size |
Tamaño de la fuente (por defecto 0.3). |
lang |
idioma para las stopwords 'es', 'en', 'de', 'pt', etc. (por defecto 'es'). |
sw |
vector de palabras extras para sumar a la lista de stopwords (por defecto NULL). |
Un objeto de tipo wordcloud2.
df <- data.frame(texto = c("Este es un tweet de ejemplo", "Otro tweet para la nube de palabras")) plotWords(df, min_freq = 1)df <- data.frame(texto = c("Este es un tweet de ejemplo", "Otro tweet para la nube de palabras")) plotWords(df, min_freq = 1)
Una cuenta se desactiva cuando X rechaza su sesion o la limita. Si fue un
falso positivo (o ya se resolvio desde el navegador), se reactiva con esta
funcion. Si la sesion vencio, conviene reimportarla con importSessionX().
reactivateAccountX(accounts)reactivateAccountX(accounts)
accounts |
Nombres de las cuentas a reactivar. |
Invisiblemente, la cantidad de cuentas reactivadas.
## Not run: reactivateAccountX("cuenta2") ## End(Not run)## Not run: reactivateAccountX("cuenta2") ## End(Not run)
Lee los tweets guardados en la base SQLite de getTweetsHistoricalAPI(),
getTweetsLiveAPI() o getTweetsThreadsAPI() (con save = TRUE o db),
sin volver a descargar nada. Sirve tambien para revisar lo recolectado por
una descarga cortada antes de reanudarla.
readTweetsDB(db)readTweetsDB(db)
db |
Ruta al archivo |
Un tibble con un tweet por fila, del mas nuevo al mas viejo (mismas
columnas que getTweetsSearchAPI()).
## Not run: tw <- readTweetsDB("api_historical_milei_2026_10_21_22_43_04.sqlite") ## End(Not run)## Not run: tw <- readTweetsDB("api_historical_milei_2026_10_21_22_43_04.sqlite") ## End(Not run)
Borra las cuentas y sus archivos de sesion.
removeAccountX(accounts)removeAccountX(accounts)
accounts |
Nombres de las cuentas a eliminar. |
Invisiblemente, la cantidad de cuentas eliminadas.
## Not run: removeAccountX("cuenta2") ## End(Not run)## Not run: removeAccountX("cuenta2") ## End(Not run)
Util si una recoleccion se corto a la fuerza (Ctrl+C, error) y dejo cuentas tomadas o pausas desactualizadas.
resetLocksX()resetLocksX()
Invisiblemente, la cantidad de cuentas afectadas.
## Not run: resetLocksX() ## End(Not run)## Not run: resetLocksX() ## End(Not run)
Cambia el proxy de cuentas ya cargadas sin tocar su sesion (no hace falta volver a pegar las cookies). Conviene que cada cuenta salga siempre por la misma IP: usa proxies "sticky" (IP fija), no rotativos.
setProxyX(accounts, proxy, validate = TRUE)setProxyX(accounts, proxy, validate = TRUE)
accounts |
Nombres de las cuentas. |
proxy |
Direccion del proxy: "http://usuario:clave@host:puerto",
"usuario:clave@host:puerto" o "socks5://host:puerto". Chromium no admite
SOCKS5 con usuario y clave: para proxies autenticados usa la direccion
HTTP del proveedor. NULL (o "") quita el proxy y la cuenta pasa a usar el
global ( |
validate |
Logico. Si TRUE (por defecto) valida cada cuenta a traves
del proxy nuevo con |
Invisiblemente, el resultado de checkAccountsX() si validate
es TRUE, o los nombres de las cuentas si no.
## Not run: setProxyX("cuenta2", "http://usuario:[email protected]:10000") setProxyX("cuenta2", NULL) # quitarlo ## End(Not run)## Not run: setProxyX("cuenta2", "http://usuario:[email protected]:10000") setProxyX("cuenta2", NULL) # quitarlo ## End(Not run)
Asistente interactivo para armar el pool de cuentas sin escribir codigo ni
dejar las cookies en el historial de R: pide el nombre de cada cuenta, su
auth_token y su ct0 (la entrada queda oculta) y un proxy opcional, la
importa con importSessionX() y la valida en el momento con
checkAccountsX(). Se termina dejando el nombre vacio.
setupAccountsX(validate = TRUE)setupAccountsX(validate = TRUE)
validate |
Logico. Si TRUE (por defecto) valida cada cuenta apenas se carga. |
En el campo auth_token tambien se puede pegar el header completo de
cookies ("auth_token=...; ct0=...") o el JSON de una extension como
Cookie-Editor; en ese caso no se pide ct0.
Para obtener las cookies de varias cuentas, abri cada una en un perfil de
navegador distinto (o en una ventana de incognito aparte) y cerra la
ventana sin cerrar sesion: cerrar sesion invalida el auth_token.
Invisiblemente, el estado del pool (accountsX()).
## Not run: setupAccountsX() ## End(Not run)## Not run: setupAccountsX() ## End(Not run)