Retour à l'accueil

Créer un flux RSS sur base d'un channel Discord

J’aime bien le Discord Codinglab. Mais Discord a tendance à m’aspirer quand je m’y connecte.

La perle de ce serveur, c’est le channel #cool-links (qui est un channel dans lequel tout le monde poste les liens qu’il trouve intéressant, c’est une véritable mine d’or).

Sauf que si j’évite Discord, j’évite cool-links, et ça, c’est pas cool.

l'alcool, c'est pas cool?

Update du 26/09/2022: il s’avère, sans surprise, que le token expire après un certains temps. Dans mon cas, je pense que je vais juste le mettre à jour au besoin jusqu’à en avoir marre !

Update du 16/10/2022: en fait je crois comprendre que le token est révoqué quand je me déconnecte de Discord (ce qui est logique en fait).

Le RSS, la SEULE SOLUTION à tous vos problèmes

En pleine période de fanatisme pour le RSS, j’ai donc décidé de créer mon propre flux RSS qui prendrait ses éléments de ce channel.

Bon, il n’existe pas de méthode officielle pour y parvenir. J’ai donc dû me la jouer apprenti socier et checker les requêtes effectuées pour trouver le point d’API appelé pour récupérer les messages.

Ca tombe bien, il existe un point d’API dédié à récupérer les messages d’un chan précis.

https://discord.com/api/v9/channels/[CHANNEL_ID]/messages?limit=50

Il suffit de lui passer un header Authorization avec votre token (que j’ai trouvé dans la requête)

token discord

Créer une app Deno avec Oak

J’ai choisi de créer mon app avec Deno et le framework Oak, simplement pour bénéficier de deno deploy qui est un service gratuit pour host du deno.

const req = await fetch(endpoint, {
  method: "GET",
  headers: {
    Authorization: Deno.env.get("TOKEN"),
  },
});

La requête qui me permet de récupérer les messages du channel

const getRSS = (items) => {
  let content = `<?xml version="1.0" encoding="UTF-8"?>
    <rss version="2.0">
       <channel>
          <title><![CDATA[#cool-links]]></title>
          <description><![CDATA[Flux RSS du channel Discord]]></description>
          <link>https://codinglab.io</link>`;

  items.forEach((current) => {
    if (current.embeds.length > 0) {
      content =
        content +
        `   <item>
        <title><![CDATA[${
          current.embeds[0].title ?? current.embeds[0].description
        } (${current.author.username})]]></title>
        <link>${current.embeds[0].url.split("?")[0]}</link>
        <guid>${current.embeds[0].url.split("?")[0]}</guid>
        <description><![CDATA[<p>${
          current.embeds[0].description
        }</p>]]></description>
        <pubDate>${current.timestamp}</pubDate>
     </item>`;
    }
  });

  content = content + `</channel></rss>`;
  return content;
};

Je passe mes messages dans une fonction qui va à la fois me créer la structure XML et y ajouter les éléments.

Au passage, je vérifie sur les messages ont bien des liens. Si ce n’est pas le cas, je n’en ai pas besoin dans mon flux.

ctx.response.headers.set("Content-Type", "application/xml");
ctx.response.body = getRSS(data);

Il en me reste plus qu’à définir le type de contenu dans le header, et voilà! Un joli flux RSS qui utiliser mon token Discord.

screenshot du flux rss

Tout ça est opensource et consultable sur mon GitHub. Le code n’est pas forcément très clean, c’était plus un truc pour voir. Je le nettoierai potentiellement plus tard !