Feedly est mon outil de veille depuis maintenant 6 ans. C’est un aggrégateur de flux qui propose des options payantes (comme Leo, l’assistant filtrant les articles de notre choix) mais gratuit de base.

Note : vous trouverez la liste des abonnements ici, personnellement j’ai un abonnement Pro+.

Comme sur tous les aggrégateurs de flux RSS, il est possible d’exporter la liste que l’on a créé au fur et à mesure du temps dans un fichier afin d’en faire une sauvegarde ou tout simplement pour le réimporter ailleurs. Par exemple, moi, toutes les semaines, j’en exporte une liste pour la conserver.

Et là, j’en arrive au problème : je fais une action récurrente/régulière, donc ça me pompe l’air et il faut que je l’automatise. J’ai donc sorti mes dix petits dix doigts et ai codé un script, feedly2s3.

Pour l’utiliser, il faut vous munir de :

  • un bucket AWS S3, ainsi que des credentials utilisables par boto3 : ceux d’un utilisateur IAM possédant au moins le droit AmazonS3FullAccess
  • un token d’API Feedly, que vous pouvez générer ici

J’en ai simplifié l’installation au maximum via un script qui vous demandera ces deux informations, puis les insérera dans le script préalablement placé dans /opt/bin.

Concrètement, comment ça marche ? J’aime faire simple et efficace. Il s’agit d’une classe ne comprenant qu’une méthode en plus de son constructeur.

Dans ledit constructeur, je récupère quelques infos comme le token Feedly, le nom du bucket S3, l’URL de la route qui m’intéresse dans l’API, etc. J’en profite aussi pour forger les noms de fichiers, ainsi que les futurs headers HTTP de ma requête :

class Feedly2S3(object):
    def __init__(self):
        self.token = TOKEN
        self.bucket = BUCKET
        self.url = 'https://cloud.feedly.com/v3/opml'
        self.headers = {'Authorization': 'OAuth '+self.token}
        self.exporter = boto3.client('s3')
        self.filename = "/tmp/feedly-"+datetime.today().strftime('%Y%m%d')+".opml"
        self.objectname = "feedly-"+datetime.today().strftime('%Y%m%d')+".opml"

Dans la méthode principale, je vais récupérer en premier lieu le fichier OPML via une requête exécutée avec requests. Ma requête HTTP prend en paramètre l’URL et les headers que j’ai forgé dans mon constructeur, notamment mon token Feedly permettant l’accès à l’API. Je conserve ensuite ce fichier dans un répertoire temporaire.

    def backup(self):
        self.opml = requests.get(url=self.url, headers=self.headers).text
        with open(self.filename, "a") as tmpfile:
            tmpfile.write(self.opml)

Une fois cela fait, cette même méthode va utiliser le module boto3 pour uploader ledit fichier dans le bucket choisi, puis détruire le fichier temporaire :

        try:
           self.exporter.upload_file(self.filename, self.bucket, self.objectname)
        except S3Error as e:
           print(e)
        delete_file(self.filename)

Et… C’est tout. Je vous l’ai dit, simple et efficace. Une fois installé via le script fourni, il s’utilise sans arguments.

➜ /opt/bin/feedly2s3 

Vous pouvez également le mettre en cron, comme moi, ou le lancer de temps en temps à votre guise. Mon but était de ne plus le faire à la main, je l’ai donc mis en cron tous les deux jours.

Je ne sais pas si cela servira à d’autres que moi, mais comme d’habitude le code est sur mon Github, ainsi qu’un chouette README. Le tout en GPLv3+.