BronKOBOt (@bronkobot@botsin.space) - Faire un Bot Mastodon from scratch.

Tiens... et si je faisais un bot pour poster une citation par jour tirée des passages de romans que j'ai sélectionnés et stockés su ma Kobo ?!

C'est par ces mots que j'ai commencé à galérer... comme quoi, il suffit d'une idée à la con pour se lancer dans tout un merdier pourtant parfaitement facultatif ...

Le postulat de départ

Je veux qu'un BOT mastodon poste une citation de mes bookmarks de liseuse DONC il faut récupérer ces passages bookmarkés.

Donc, il faut trouver le fichier de base de donnée.

Puis il faut extraire les données intéressantes.

Puis utiliser ces données dans un BOT qui sera appelé une fois par jour.

Étape 1: trouver et comprendre les données sur la KoBo

En fouillant un peu, on trouve un fichier sqlite (JOIE) dont le chemin est .kobo/KoboReader.sqlite

Comment différencier la base de   livres des autres ?!    Ben elle pèse plus de 700mo...    C'est un signe.

Un passage par DBBrowser pour SQlite permet de jeter un oeil sur la structure des données.

Idéalement, il me faut deux informations: la citation et le titre du bouquin dont elle est extraite.

drame.jpeg

En fait les titres se trouvent dans la table content et les annotations dans la table Bookmark

deux tables

Je pourrais utiliser Calibre et chercher un moyen de faire un export complet de ces deux données uniquement. Pas sûr que ça marche. Ou alors faire un export via le DBexplorer pis me retaper le truc à chaque export...

Étape 2 : extraire les données et les préparer pour le Bot

En vieux programmeur qui bricole, je vois là un prétexte pour coder une petite appli en python qui se chargera de l'extraction.

Mon problème, c'est que je me sers des notes de la Kobo pour retenir des passages intéressants mais aussi, parfois, pour noter vite fait un mot de vocabulaire espagnol que je ne connaissais pas et dont je veux conserver la traduction. Mais ces mots de vocabulaire ne sont pas des citations: il faudrait donc les virer à la main à chaque fois. C'est chiant.

L'appli devra donc permettre de filtrer les citations avant de générer un fichier exploitable par le bot.

Pour faire court

J'ai fait l'appli en question: elle permet donc de récupérer les données, filtrer en fonction de la longueur de la citation ou du fait qu'elle est ou pas accompagnée d'une note personnelle...

Capture du 2022-12-03 15-57-22.png

On peut formater les données selon plusieurs modèles (HTML, Json, Markdown, TXT brut, BOT) voire même créer son propre format (genre %title:«%quote» )

Si ça intéresse quelqu'un,   contactez-moi vu que j'ai la  flemme de mettre ça là

Voilà le ZIP : Kobone : KOBO Note Extractor

Étape 3 : coder un bot en PHP afin de l'appeler par la suite avec un CRONJob.

Rien d'extraordinaire ici: je fais un script qui parse le fichier obtenu à l'étape précédente, tire une citation au hasard et la poste sur le compte Masto du Bot.

Le point le plus intéressant du bouzin est plutôt la fonction servant à poster sur un compte mastodon:


define('TOKEN','letokendesécuritéquetuchopesdansmastodon');
define('MASTODON_URL','https://botsin.space/'); // Ici, il faut coller l'url de votre serveur mastodon
define('HEADER',"Citation du jour:");
 function post2Mastodon($data=null){
        if (!$data){return false;}
        $headers = [
          'Authorization: Bearer '. TOKEN
        ];
        $data=[
            'status'=> HEADER.$data,
            'language'=>"fr",
            'visibility' => 'public'
        ];
        $ch_status = curl_init();
        curl_setopt($ch_status, CURLOPT_URL,  MASTODON_URL.'/api/v1/statuses');
        curl_setopt($ch_status, CURLOPT_POST, 1);
        curl_setopt($ch_status, CURLOPT_POSTFIELDS, $data);
        curl_setopt($ch_status, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch_status, CURLOPT_HTTPHEADER, $headers);
        $output_status = json_decode(curl_exec($ch_status));
        curl_close ($ch_status);
        return $output_status;
    }

Étape 4: Créer une appli Mastodon pour avoir un jeton d'utilisation

Aller sur le compte mastodon en question, puis dans les préférences.

Cliquer sur «developpement» puis «Nouvelle application».

Remplir le formulaire simplissime puis valider. Cliquez ensuite sur le nom de votre application dans la nouvelle page et copiez votre jeton d’accès. C'est celui-ci qu'il faut coller dans le script PHP (dans la constante TOKEN)

Étape 5 : Définir un Cronjob

Direction le panneau de config de votre hébergement, rubrique cronjob. Sur Cpanel c'est là :

Capture du 2022-12-03 16-11-42.png

Définissez la fréquence (pour moi une fois par jour) et l'heure (8:00).

Ensuite, il faut définir la commande qui va appeler le script du BOT: wget fera l'affaire...

wget -qO /dev/null http://xxxxxxxxxxx.xx/index.php

L'option -q pour quiet et -O /dev/null pour éviter d'avoir un fichier de sortie qui se crée à la racine.

Capture du 2022-12-04 11-10-50.png

Fin

Une fois tout ça terminé, j'ai bien un bot qui poste une citation à 8:00 tous les jours.

capture du bot

Bon, elles ne seront pas toujours bien formatées vu que la sélection de texte sur liseuse c'est un peu touchy... mais c'était plus pour apprendre à le faire qu'autre chose...

Pis ça m'a permis de me  remettre à Python...

https://botsin.space/@bronkobot

Installer Linux Mint sur un ACER Aspire ES17 ES1-732

Via un commentaire sur WDD:

  • 01 Pourquoi l'installation est KO
  • 02 Configuration du BIOS
  • 03 Configuration du BOOT avant
  • 04 Installer Linux Mint
  • 05 grub option acpi
  • 06 Réparer grub sans reboot
  • 07 Réparer grub avec reboot
  • 08 Terminer l'installation
  • 09 Ajouter Windows dans grub
  • 10 Configuration du BOOT après
  • 11 Mise à jour de Linux grub
  • 12 Mise à jour de Windows
  • 13 Divers commandes de grub
    Via https://warriordudimanche.net/article1111/5dac319388f1d#c1111-14

[GUIDE] List of bloatware on EMUI safe to remove | XDA Forums

Toutes les merdes que vous pouvez virer de votre Android. (et les trucs à pas virer )

Je débloate le p8lite de mon épouse vu que sur 16go, le système et les applis prennent...15.7go environ

Et pas possible de rooter vu que le fastboot est intouchable à cause de la politique de «saycuritay» de Huawei. Les bâtards refusent de filer le code de déblocage du fastboot depuis 2018.

Tu as acheté un appareil mais tu peux pas en faire ce que tu veux.

Pire, ils le bloatent à mort comme ça, quand tu peux plus l'utiliser parce qu'il est plein ben t'en achètes un autre.

Sauf que les couillons de chez huawei devraient se rappeler que dans ce cas, on N'ACHÈTE PLUS JAMAIS HUAWEI... Demandez à wiko

Bienvenue ! — Le Wiki d'Herminien

Un wiki à explorer... La page sur signal m'a convaincu.

  • Introduction : Pourquoi se protéger ?
  • Se protéger des G.A.F.A.M.
  • Protéger ses mails
  • Le cas des sms et des appels
  • Protéger ses documents
  • Protéger sa navigation sur internet
  • Le mot de passe
  • Quitter Facebook
  • Mes données ont-elles été piratées ? nouveau !
  • Se protéger des arnaques sur internet nouveau !
  • Ressources utiles

Advent of Code 2020 - 10 enseignements et bonnes pratiques en PHP

Un excellent article, très simple d'accès. Résumé pour mémoire mais je vous conseille d'aller lire le tout tant c'est clair et bien documenté:

1.Tout typer

... pour pouvoir compter sur le type des données

  • Les paramètres des fonctions function moncul(string $str) pour éviter de vérifier les paramètres puisqu'un type erroné provoquera une erreur
  • Les valeurs de retour des fonctions function moncul(string $str): int car en cas de retour d'un autre type, il y aura erreur. (pour les fonctions ne retournant rien, :void )
  • Les propriétés de classe : private int $mon_cul; pour qu'une erreur se déclenche en cas d'initialisation d'un type erroné.

2.Protéger ses classes par défaut

  • ajouter «final» à la déclaration de classe final class monCul(){ pour éviter tout héritage, même fortuit.
  • laisser ses propriétés en private par défaut
  • laisser ses méthodes en private par défaut jusqu'à ce qu'on ait besoin de les appeler de l'extérieur

3.Utiliser les comparaisons strictes

... pour éviter les confusions false/0 etc

4.Se passer des «if»

En utilisant l'opérateur ternaire condition ? valeur retournée si true : valeur retournée si false;

Pourquoi ? Parce que c'est plus court mais aussi parce qu'on peut placer la condition directement dans une assignation ou à la place d'un paramètre: $count += ($value === CONTROL_VALUE) ? 1 : 0;

Par contre, je trouve qu'on y perd BEAUCOUP en lisibilité et en organisation.

5.La fonction « sscanf »

Pour analyser une chaîne selon un format (et à la place d'un explode plus lourd). C'est l'inverse de printf(). ( https://www.php.net/manual/fr/function.sscanf.php )

6.L'inversion de valeurs en une ligne

et avec autant de valeurs qu'on veut

[$var1, $var2, $var3, $var4] = [$var4, $var3, $var2, $var1];

7. L’opérateur de décomposition « … »

$intersection = array_intersect(...$bigArray); au lieu de $intersection = array_intersect($bigArray[0], $bigArray[1], $bigArray[2]); // Etc.

8. Toujours ajouter un compteur de boucle pour sortir des while

Ça m'a rappelé un épisode de BigBang Theory dans lequel Sheldon est prisonnier d'une boucle dans son algorithme HowToMakeANewFriend... (c'est Howard qui l'en sort en implémentant un compteur comme condition de sortie).

$block++;
    if ($block > 1000) {
        break;
    }

9.Utiliser les fonctions liées aux tableaux

Je plussoie vigoureusement ce point particulier

Avant de se lancer dans un traitement de tableau en créant une fonction ou une méthode exprès, relisez la doc de toutes les fonctions commençant par Array_ ... histoire de ne pas réinventer la roue.

joebarteam6p43.jpg

10.Manipuler les tableaux avec les callbacks et les Collections

Pour manipuler un tableau, penser à utiliser array_map plutôt que foreach si c'est possible:

  • utilisation simple array_map('trim',$tableau)
  • fonction anonyme ```array_map(function($k){ code de traitement },$tableau);
  • avec une méthode array_map(array($instance, 'methode'), $tableau)

L’homme qui hululait à l’oreille des formulaires – 24 jours de web

En résumé

  • Contrôler la validité des champs avec trop d’enthousiasme : difficile de prendre en compte les spécificités de tout le monde...
  • Abuser de la validation côté client : éviter les situations bloquantes.
  • Imposer des contraintes fantaisistes sur les mots de passe : privilégier la longueur des mots de passe plutôt que leur complexité.
  • Obliger l’internaute à nettoyer lui-même ses données : privilégier le nettoyage côté serveur avant stockage.
  • Confondre les attributs labels et placeholder : label = nom du champ, placeholder = exemple de saisie
  • Recueillir des informations non-conformes : Moins on recueille d’informations sur l’utilisateur, mieux tout le monde se porte.
  • Obliger à utiliser la souris pour saisir des mots de passe
  • Ré-inventer des composants de formulaire : accessibilité ? compatibilité ? javascript bloqué ?
  • Reporter la complexité du processus sur l’utilisateur·ice : ex, les mini formulaires enchainés. Solution: proposer une alternative

Commandes GNU/Linux pour détecter une intrusion - Net-Security

En ultra résumé

  • w & who pour savoir qui est connecté,
  • last & lastb pour savoir qui a été connecté,
  • history (lancé depuis l'utilisateur à vérifier : su username) pour voir les traces laissées,
  • less /etc/passwd et cat /etc/passwd pour vérifier si on n'a pas créé un utilisateur à l'arrache,
  • ps et top pour vérifier s'il n'y a pas un processus malveillant,
  • ss & netstat pour vérifier les faiblesses réseau,
  • ip
  • crontab pour vérifier si une tâche cron n'est pas lancée régulièrement
  • find / -mtime -5 -ctime -5 pour vérifier les fichiers modifiés récemment,
  • cat /var/log/syslog, cat /var/log/syslog | less, tail -f -n 5 /var/log/syslog, cat /var/log/syslog | grep fail, tail -f /var/log/syslog pour les logs
    Via https://shaarli.sebw.info/?aU81yg
Fil RSS des articles