Skip to content

Serverless Mastodon bot

A Fediverse növekvő népszerűsége miatt úgy döntöttem, hogy megnézem, mit kínál ez a decentralizált közösségi hálózat a fejlesztőknek.

A Mastodon-t választottam elsődleges platformnak, mert ez a legnépszerűbb az összes közül. Választhatsz mást is, mivel ezek a hálózatok zökkenőmentesen tudnak egymással kommunikálni, függetlenül attól, hogy milyen szervert futtatnak.

A Twitter (ma: X) kereskedelmi vállalatként jogosult korlátozni vagy kereskedelmi forgalomba hozni az API-ját, ami nehézséget jelenthet a startupok vagy kis fejlesztők számára. A Mastodon nemcsak ingyenes és nyílt forráskódú, hanem sokkal fejlesztőbarátabb is. Az egyik ilyen funkció a botfiókok támogatása. Ezek a fióktípusok nincsenek korlátozva, sőt, bátorítják a használatukat. A Mastodon-ban külön megjelölhetjük, hogy egy fiók bot-e, így mindenki számára átláthatóbbá válik. 🫶

Az első lépés mindig a legnehezebb, a Mastodon szerver kiválasztása. Rengeteg közül választhatunk, némelyik speciális közösségek számára van fenntartva, némelyik pedig földrajzilag korlátozott. Ha bizonytalan vagy, maradj a legrégebbi mellett: mastodon.social.

Hozzonunk létre egy fiókot itt, és jelöljük be a This is an automated account (ez egy automatizált fiók) négyzetet a profilunk alatt. Ez tudatja a többiekkel, hogy ez egy botfiók. Az Under Development (fejlesztés alatt) hozzunk létre egy új alkalmazást, és válasszuk ki a megfelelő jogosultságokat. Mivel az én botom csak publikálni fog, csak a write:statuses opciót választottam.

Egy korábbi blogbejegyzésemben létrehoztam egy honlapot a magyar techkonferenciáknak. Ezt fogom használni input forrásként. Jelenleg ez az oldal nem kínál egyszerű módot az információk exportálására, ezért módosítottam a Jekyll kódot, hogy CSV fájlt generáljon a közelgő eseményekről. Így könnyebben tudom felhasználni az adatokat.

A serverless megközelítés

A bejegyzés címéből valószínűleg kitaláltad, hogy serverless megközelítést fogok alkalmazni. Nem akarok biztonsági frissítésekkel és javításokkal foglalkozni. Csak azt szeretném, hogy ez a bot nagyon kevés karbantartással működjön.

💡 Tipp: Válaszd az arm64-et Lambda architektúrát, mert annak olcsóbb a futtatása.

A Mastodonhoz egy maroknyi API kliens közül választhatunk. Mivel Node.js 18.x-et fogok használni, olyan klienst akartam találni, amely kompatibilis vele. A választásom a Masto.js-re esett, amelyet elég gyakran karbantartanak, és amely támogatja a Mastodon API legtöbb funkcióját.

A techconf.hu CSV-adatainak letöltéséhez az Axios-t fogom használni, mint a korábbi projektjeimben. A CSV adatok elemzésére a választásom a csv-pars-re esett (vigyázz, többféle CSV-parser létezik, egyes nevek csak kötőjellel különböznek egymástól). Ezután minden egyes funkcióhoz külön Layer-t hoztam létre, és csatoltam a Lambda függvényhez.

Az egészet működésre bírni

A kód nagyon egyszerű. Először letöltöm a CSV fájlt, és a csv-parse segítségével elemzem. Ezután beállítom a Tootot (a Mastodon kifejezése a Tweetre) és közzéteszem a Masto.js segítségével.

Az egyik probléma, amivel szembesültem, hogy a Mastodonban minden Tootnak van egy nyelvi változója. Ha nem állítod be külön, akkor a Mastodon fiókodban beállított nyelv lesz az alapértelmezett.

💡 Tipp: Mivel a Fediverse annyira decentralizált, jó ötlet, ha minden hozzászólásodat megjelölöd.

import { parse } from 'csv-parse';
import { login } from 'masto';
import axios from 'axios';

export const handler = async(event) => {
    var tweet = "Upcoming Hungarian Tech Conferences 🇭🇺\n\n";
    var conferencesThisWeek = false;
    const currentDate = new Date();
    const endOfWeek = new Date(new Date().setDate(new Date().getDate() + 7));
    currentDate.setHours(0,0,0,0);
    endOfWeek.setHours(0,0,0,0);
    var conferenceDate;
    var csv;
    
    await axios({
        url: 'https://techconf.hu/conferences.csv',
        method: 'GET',
        responseType: 'blob'
    }).then((response) => {
        csv = response.data;
    });
    
    const parser = parse(csv, {
        delimiter: ",",
        from_line: 2
    });
    
    for await (const record of parser) {
        conferenceDate = new Date(record[3]);
        if (currentDate <= conferenceDate && conferenceDate <= endOfWeek) {
            tweet += '👉 ' +record[0] + ' (' + record[2] + ')\n📅 ' + record[3] + ' - ' + record[4] + '\n🔗 ' + record[1] + '\n\n';
            conferencesThisWeek = true;
        }
    }
    
    if (conferencesThisWeek) {
        tweet += '#Hungary #Technology #Conference';
        
        const masto = await login({
            url: 'https://mastodon.social/api/v1/',
            accessToken: ''
        });
    
        await masto.v1.statuses.create({
            status: tweet,
            visibility: 'public',
            language: 'en'
        });
    }
    
    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

Időzítés

A Lambda függvény ütemezésének legegyszerűbb módja az Amazon EventBridge Scheduler (ütemező) használata. Egyszerűen válasszuk ki az ütemezési mintát és a Lambda függvényt célként, és a megadott időpontban végrehajtja a kódot.

Végső gondolatok

Említettem már a legjobb részt? Mindez ingyen van. Az általam használt szolgáltatások mindegyike az AWS Free Tier (ingyenes) szolgáltatási körébe tartozik (jelen íráskor).

Nyugodtan hozzatok létre hasonló botokat, vagy segítsetek jobbá tenni a kódomat, vagy csak kövessétek a botomat a következő címen: https://mastodon.social/@techconf

Published inOktatóanyag
0 0 votes
Article Rating
Subscribe
Visszajelzés
guest

Ez az oldal az Akismet szolgáltatást használja a spam csökkentésére. Ismerje meg a hozzászólás adatainak feldolgozását .

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments