Gérer un compte Twitch partagé entre plusieurs personnes pose un problème concret : le code de double authentification (2FA) change toutes les 30 secondes et n’est accessible que sur l’appareil de la personne qui a configuré le compte. Ce bot Discord résout ce problème simplement — les membres autorisés tapent une commande et reçoivent instantanément leur code 2FA, sans avoir à contacter quelqu’un ou accéder au serveur. Le tout fonctionne en continu sur un VPS, disponible à tout moment depuis n’importe quel appareil connecté à Discord.

Sur le plan technique, le bot est développé en Python avec discord.py et utilise pyotp pour générer les codes TOTP (Time-based One-Time Password), le même standard ouvert qu’Authy ou Google Authenticator. Le secret TOTP n’est jamais stocké en clair : il est chiffré au repos avec cryptography.Fernet (chiffrement symétrique AES-128-CBC), et la clé de chiffrement est isolée dans un fichier .env exclu du dépôt git via .gitignore. Ce choix répond directement au principe de sécurité par séparation des secrets : même si le dépôt était compromis, le secret TOTP resterait inaccessible sans la clé Fernet — une pratique alignée sur les standards d’isolation des services et de journalisation structurée. L’accès à la commande /twitchcode est restreint par rôle Discord, et la réponse est envoyée en message éphémère — visible uniquement par l’utilisateur qui a lancé la commande, invisible pour le reste du salon. Le bot est déployé et géré via PM2, un gestionnaire de processus qui assure le redémarrage automatique en cas de crash et la persistance au reboot du serveur — une approche plus légère qu’un service systemd complet pour un projet de cette taille, tout en garantissant la résilience du processus. L’ensemble des fichiers sensibles (.env, secrets.json) est exclu du versionnement, et le secret TOTP peut être remplacé à tout moment via init_secret.py sans toucher au code du bot — une séparation claire entre configuration et logique applicative qui facilite la maintenance et la rotation des secrets.