Va ser a primer de desembre que @soctonyo@mastodont.cat va preguntar quan hi hauria un bot per les notícies d’Apunt. I em va picar la curiositat i vaig començar a documentar-me. Com que encara no he arribat a l’habilitat de @spla@mastodont.cat, l’administrador de la instància, programar en python, vaig acudir al que recordava del php. Un llenguatge que és molt útil per a generar respostes dinàmiques a les planes web i, també, funciona el línia de comandaments.

El primer pas de tota documentació és veure que han fet d’altres que ja han recorregut el mateix camí. Soc dels que pensa que no cal inventar la roda cada volta. Amb una miqueta de cerca vaig trobar un model que, en un principi, em va permetre descobrir i aprofitar les característiques de l’API de mastodon. L’autor és groundcat, i el repositori que em va interessar té el nom de mastodon-rss-bot.
Ara, cercant els enllaços per a l’article veig que també en té un per a saludar els comptes que es creen a una instància, cosa que ja funciona i molt bé amb @mastodontcat@mastodont.cat
Tot anava bé fins que vaig veure que el bot triat només en publicava una noticia cada volta i només la primera de la sindicació de notícies (RSS). Per tant, estava al criteri de la redacció que triara com a primera notícia i només que apareguera a la portada o primera plana del RSS per a que es publicara a mastodont.cat. Una quantitat de publicacions, al meu parer, massa incompleta i sota el criteri dels redactors del web.
A partir d’aquí va ser quan vaig començar a crear bot_plus, ja que la base es diu bot i, crec, que ara fa més coses que aniré detallant en els articles.
El primer pas va ser trobar un bon esquema per convertir els fitxers RSS en un text ben codificat – això ho recordarà bé @spla@mastodont.cat, i finalment vaig trobar el camí per que tot es quedara en utf-8 que és el joc de caràcters que utilitza, també, el meu servidor.
Quan vaig ser conscient de les limitacions i vaig entendre el funcionament, vaig anar a fer una cerca més directa i la troballa va ser a la web daniweb, concretament a l’apartat de programació, clar. Es l’article explica com convertir el contingut de planes xml, l’habitual a les fonts de sindicació de notícies (RSS), en una matriu de dades i així poder manipular i treballar amb elles.
Encara que em va costar trobar el camí, finalment vaig fer el següent esquema de directoris per aconseguir el funcionament actual
/bot_plus
| — configuració
|– fitxers
|– gifis
|– lib
|– log
|– proves
|–utils
El php carrega amb facilitat els fitxers dels subdirectoris però hi ha que incloure una utilitat si volem que trobe un fitxer en una carpeta a una carpeta diferent al mateix nivell que on es troba la execució actual. M’explique: un fitxer a utils té dificultats per trobar un altre que es trobe a configuració. La solució que he implementat al funcionar en la línia de comandaments, cli, ha sigut enviar el paràmetre d’ublicació en les ordres d’execució com a argv i arreplagar-ho en cada fitxer que cal amb el següent codi:
// Comprova els arguments, en cas de no existir presenta l'ajuda.
if (!empty($_SERVER["argv"][1])){
$argument = $_SERVER["argv"][1];
} else {
// Presenta l'ajuda
echo "NO HE REBUT la variable";
exit;
}
Amb això ja tenim solucionat com enviar correctament la ubicació per trobar els fitxers que volem i necessitem fer funcionar.
Ara mirem els punts més destacats del bot des del principi.
# indicar l'autor
# indicar la font // inici del document
$temps = microtime(true);
Ja tenim l’inici amb un rellotge que ens contarà en microsegons, el temps d’execució de determinades tasques i, fins i tot el total del fitxer.
include("configuracio/bot_plus_cfg.php");
include("lib/exportrss.php");
include("utils/bot_plus_funcions.php");
if ($pres_et == 1) {
require_once("utils/bot_plus_etiquetes.php");
}
require_once("class/logger.php");
// inicia el log
$log = new Logging();
//$log->lfile("/var/log/mastodon_bot.log");
$log->lfile("".$f_log."");
//defineix on es troba el fitxer a executar
$lloc = realpath(dirname(FILE));
En les línies de damunt carrega els fitxer de configuració, el que converteix els fitxer rss i les funcions que, a poc a poc, he anat agrupant per no repetir línies de codi que, encara -som a la versió 0.4.1β,- queda per anar netejant.
El primer condicional activa les etiquetes que figuraran en els toots segons el contingut de les paraules i eixa utilitat encara té un gran nombre d’errades i que ja comentaré el motiu més endavant.
La següent inclusió és el fitxer que permet fer un registre o log amb les indicacions que estimes convenients. Les següents línies inicien el fitxer del log. A partir d’este moment, totes les línies que comencen per $log -> lwrite("aquí el que vulgues que aparega");
s’escriuran al fitxer log. Amb això podràs controlar el funcionament, les errades i les necessitats de millora.
La darrera – $lloc
– és una variable que serà molt útil per fer utilitats modulars que podràs activar o desactivar a voluntat amb el fitxer de configuració. Això també permetrà que pugues ampliar determinades utilitats que et vinguen al cap. De moment hem cobert la part inicial del fitxer. Anem a les funcions més sensibles que son les de interactuar amb l’API de mastodon per publicar missatges de text i, amb més passos, incloure una imatge en la publicació.
Per començar, necessites tindre instal·lada la llibreria curl del php que et permet connectar amb llocs web i tant enviar com rebre la informació que vulgues obtindre. Una mostra:
$bot_status = curl_init();
curl_setopt($bot_status, CURLOPT_URL, $base_url . "/api/v1/statuses/");
curl_setopt($bot_status, CURLOPT_RETURNTRANSFER, true);
curl_setopt($bot_status, CURLOPT_HTTPHEADER, $headers);
$resposta = (curl_exec($bot_status));
$resposta_json = json_decode(curl_exec($bot_status),true);
curl_close ($bot_status);
Una explicació ràpida de cada línia:
La primera inicia la connexió.
Les tres següents configuren les opcions, quin serà el directori per connectar, si volem que en conteste la connexió i l’enviament de les capçaleres.
Les que inicien amb $resposta
obtenen i donen format a la informació obtinguda en format json des del servidor.
Finalment tanquem la connexió.
I a la segona part, revisaré la resta de utilitats necessàries per fer un fitxer modular que permeta ampliacions i execucions segons l’esquema que he seguit.