Cómo crear un bot (útil) para Twitter
- Publicado el
- • 3 minutos • ––– lecturas
- Authors
- Name
- Brian Zuker
- @Brian_Zuker
“La dura respuesta de X a los dichos de Y”. “Los 5 mejores lugares de Z”. “Uno de los jugadores de este equipo podría pasar a este otro”.
Todos los que usamos alguna red social encontramos por todos lados títulos de este estilo. Clickbait. A mí siempre me dio bronca encontrarme con algo así, entonces intento evitar entrar a estas páginas. Pero… a veces me interesa qué dijo X sobre Y. O cuál es el mejor lugar para comer hamburguesas en Buenos Aires. Entonces entro. Pero entro con bronca.
Al mismo tiempo, me enteré que Chrome tiene una versión ‘headless’, es decir, para navegar de forma programática. La API se llama puppeteer y es open source. Se me ocurrió que podía combinar mi odio al clickbait con las ganas de aprender esta API y hacer algo con eso.
Creando (y hosteando) el Bot
Para crear el bot, hay que usar la API de Twitter. Acá un link con más información sobre cómo obtener la autorización necesaria y demás cuestiones técnicas.
Para hostearlo, yo decidí usar Glitch. Acá podés buscar proyectos que ya estén hechos y basarte en ellos para crear uno nuevo. A este concepto lo llaman ‘remix’ y podés agarrar cualquier proyecto público y hacerlo tuyo. Tienen el esqueleto armado para, por ejemplo, crear bots de Twitter, de Slack, etc.
La idea del bot es:
- ‘Escuchar’ cuando lo llaman.
- Encontrar el link y entrar a la página.
- Sacarle fotos.
- Postearlo, contestando al usuario que llamó.
Con el paquete twit, podemos escuchar un stream de tweets dirigidos a un usuario:
const stream = T.stream(‘statuses/filter’, { track: [‘@AhorroClick’] });
stream.on('tweet', saveClick);
De esta manera, vamos a ejecutar una función cada vez que llegue un nuevo tweet para esa cuenta.
El siguiente paso es extraer el link que se quiere ahorrar. Para eso, tenemos que obtener el tweet al que están contestando:
const parentTweet = await T.get(`statuses/show`, {
id: tweet.in_reply_to_status_id_str,
tweet_mode: "extended",
});
const url = parentTweet.data.entities.urls[0].expanded_url;
Ya tenemos la url, ahora tenemos que sacarle fotos. Acá es donde entra en acción puppeteer:
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(url, { timeout: 60000 });
const screenshot = await page.screenshot({
path: __dirname + "/.data/screenshot1.png",
clip: {
x: 0,
y: 0,
width: 700,
height: 2000,
},
});
Una vez que obtuvimos la foto, solamente nos queda postearla. Para eso hay que hacer 2 pasos, primero subir las fotos a Twitter y después postear:
// Esto no funciona exactamente así, pero es para ejemplificar.
const id = T.postMediaChunked({ file_path: filePath1 });
await T.post("statuses/update", {
media_ids: [id],
in_reply_to_status_id: tweet.id_str,
auto_populate_reply_metadata: true,
});
Y listo! Completamos la funcionalidad mínima que queríamos.
La cuenta @AhorroClick llegó a tener más de 30.000 seguidores de distintos puntos del mundo (Argentina, España, México, etc.). El clickbait es un fenómeno global y molesta en todos lados. Lamentablemente, Twitter decidió bloquear la cuenta.
Dejo el link para que puedan ver (y criticar) el código completo en Glitch: AhorroClick.
Hasta la próxima!