TwitterAutoPost
Una piccola app containerizzata che pubblica ogni giorno una foto casuale, presa da una cartella sul NAS, su un account Twitter/X — tutto guidato da un file di configurazione YAML.
L’idea
Avevo una cartella di foto sul NAS e volevo che ne venisse pubblicata una a caso al giorno su un account Twitter/X, senza doverci pensare. Ne è nata una piccola app in un container Docker: la accendi una volta e va da sola.
Cosa fa
- Sceglie una foto a caso a ogni esecuzione (i doppioni sono ammessi — nessuno stato salvato).
- Scandaglia le sottocartelle, con una lista di esclusioni, e filtra per estensione.
- Orario e fuso configurabili per la pubblicazione giornaliera.
- Didascalia opzionale (testo fisso e/o nome del file).
- Comodità da riga di comando:
--dry-run(sceglie e stampa senza pubblicare) e--once(pubblica subito una volta ed esce).
Come funziona
Il container esegue uno scheduler in-process: calcola la prossima occorrenza dell’orario
impostato nel fuso scelto, dorme fino a quel momento, sceglie un’immagine idonea e la
pubblica. L’upload usa l’endpoint media v1.1 di Twitter, mentre il tweet vero e
proprio passa dall’endpoint v2 (via tweepy). In caso di errore logga e aspetta il
giorno dopo, così il demone resta sempre in piedi; restart: unless-stopped lo riporta
su dopo un riavvio.
Scelte di progetto
- Tutto in YAML: estensioni, esclusioni, orario, fuso, didascalia. I segreti (le
chiavi API) stanno però nel file
.env, che ha la precedenza sulla configurazione — così non finiscono mai nel file YAML. - Nessuno stato: scelta puramente casuale a ogni giro, ripetizioni accettate.
- Accesso al NAS: la share SMB viene montata sull’host e poi bind-mounted nel container, invece di montarla dentro al container.
- Rotazione dei log delegata al driver
json-filedi Docker (niente systemd o logrotate).
Note e trabocchetti
- L’API di X è a pagamento: pubblicare consuma crediti acquistati (un post semplice costa pochissimo, un post con link parecchio di più) — una cosa da tenere a mente prima di automatizzare.
- Per caricare un’immagine servono i token utente OAuth 1.0a (non OAuth 2.0), e tutte e quattro le chiavi devono provenire dalla stessa app, altrimenti si ottiene un errore 401.
- Su Docker Desktop con WSL2 conviene montare la share come volume CIFS: un semplice bind di un percorso UNC può risultare silenziosamente vuoto.
Stack
Python · tweepy · Docker · API Twitter/X