Prima provala: apri la cartolina dall'orbita e premi il pulsante. Dopo qualche secondo ti arriva una cartolina spedita dalla Stazione Spaziale Internazionale, proprio dal punto che sta sorvolando in quel momento.
Sulla cartolina trovi la vera immagine satellitare della zona sotto la ISS, il nome del luogo, quota, velocità, l'ora locale laggiù e da due a quattro frasi di saluti scritte da un'AI nella tua lingua. Ogni cartolina ha un link tutto suo da condividere, e sulla pagina c'è una bacheca con le ultime cartoline di tutti i visitatori.
Cosa succede dietro
Il lavoro lo fa un workflow n8n sul mio server, sette nodi da sinistra a destra. Se n8n è nuovo per te, la mia introduzione a n8n spiega le basi.
- Besucher-Knopf (Webhook): il pulsante chiama prima il PHP del mio sito. Controlla i limiti, crea un id casuale per la cartolina e chiama il webhook con quell'id e la tua lingua.
- Wo ist die ISS?: una GET HTTP a
api.wheretheiss.at/v1/satellites/25544. Restituisce latitudine, longitudine, quota (circa 420 km), velocità (circa 27.600 km/h) e se la stazione è al sole o nell'ombra della Terra. - Was liegt darunter?: geocodifica inversa con OpenStreetMap Nominatim, livello di zoom 5 (regione e Paese), nella tua lingua.
- Postkarte schreiben: un nodo Code. Raccoglie i fatti e ne ricava il prompt con regole chiare.
- KI schreibt (IONOS): un modello linguistico compatibile con OpenAI (gpt-oss-120b, ospitato da IONOS in Germania) risponde con un JSON:
{greeting, text}. - Antwort prüfen: un secondo nodo Code. Se la risposta è vuota o rotta usa una cartolina di riserva. Quindi una cartolina arriva sempre.
- An die Seite senden: una POST HTTP con un token segreto verso il mio sito. Lì il PHP scarica l'immagine satellitare, salva cartolina e immagine e la appende alla bacheca.
I nomi dei nodi sono in tedesco perché il workflow è lo stesso della pagina tedesca; alla logica non importa.
I dettagli interessanti
L'immagine è un composito. Viene da NASA GIBS (Global Imagery Browse Services): è l'immagine a colori reali dello strumento MODIS sul satellite Terra. Uso quella di ieri, perché quella di oggi si completa solo nel corso della giornata. Anche quella di ieri ha dei buchi: Terra scansiona la Terra a strisce, e vicino all'equatore tra due passaggi restano spicchi senza dati. Per questo sotto c'è NASA Blue Marble, un mosaico senza nuvole. Dove MODIS ha visto qualcosa, vedi le nuvole di ieri; dove no, la Terra senza nuvole. Il riquadro è di circa 12° × 8°, più o meno 1.300 × 900 km, con la posizione della ISS al centro.
L'oceano lo nomina il codice. La ISS fa un giro della Terra circa ogni 92 minuti, e quasi sempre sotto c'è acqua. Lì Nominatim non trova niente. Così il nodo Code assegna la posizione a un oceano con dei riquadri di coordinate approssimativi:
const { latitude: lat, longitude: lon } = $('Wo ist die ISS?').first().json;
const now = new Date();
const solar = ((now.getUTCHours() + now.getUTCMinutes() / 60 + lon / 15) % 24 + 24) % 24;
const clock = String(Math.floor(solar)).padStart(2, '0') + ':' + String(Math.floor(solar % 1 * 60)).padStart(2, '0');
function ocean(lat, lon) {
if (lat < -55) return 'southern';
if (lat > 66) return 'arctic';
if (lon > 20 && lon < 147 && lat < 30) return 'indian';
if (lon > -100 && lon <= 20 && (lat > 8 || lon > -70)) return 'atlantic';
return 'pacific';
}
const geo = $('Was liegt darunter?').first().json;
const place = geo.error ? OCEANS[lang][ocean(lat, lon)] : geo.display_name;
L'ora locale è l'ora solare: UTC più la longitudine divisa per 15. Non è l'ora dei telefoni laggiù, ma dice onestamente se sotto è mattina, mezzogiorno o notte.
L'AI resta onesta e gentile. Il prompt contiene solo fatti e regole: da due a quattro frasi, giocose, numeri esattamente come forniti, niente di inventato sul luogo oltre la cultura generale. Nessuna battuta su guerre, catastrofi o tragedie; se il luogo è legato a una di queste, il testo resta neutro. Il nodo di controllo successivo non si fida della risposta a occhi chiusi.
Limiti contro gli abusi. Ogni clic costa una chiamata all'AI. Quindi: al massimo una cartolina ogni 20 secondi per tutti insieme, cinque all'ora per visitatore, più un tetto giornaliero. Il PHP lo controlla prima che n8n ne sappia qualcosa.
Il sito scarica l'immagine da sé. Potrei incorporare l'immagine direttamente dalla NASA. Ma allora ogni browser che guarda una cartolina manderebbe una richiesta, con il suo indirizzo IP, a un server esterno. E dovrei aprire la Content Security Policy a fonti di immagini esterne. Così resta img-src 'self', e la cartolina avrà lo stesso aspetto anche tra un anno.
A cosa serve lo schema
La cartolina è un gioco. Lo schema dietro invece è serio: su richiesta, trasformare dati live in un contenuto personale, controllarlo e salvarlo con un link fisso. Così si costruiscono, per esempio:
- un report che il cliente richiede da solo, con i suoi numeri aggiornati;
- attestati di partecipazione dopo un corso, con nome e data;
- schede di onboarding per i nuovi colleghi, con team, referenti e primo appuntamento;
Altri esempi di questo tipo sono nella mia serie settimanale su n8n, e se preferisci guardare un workflow al rallentatore, premi il pulsante nella demo live di n8n.
Provalo tu
Puoi scaricare qui il workflow in JSON. I segreti sono sostituiti da segnaposto.
- In n8n scegli “Import from File” dal menu in alto a destra e carica il file.
- Nel nodo “KI schreibt (IONOS)” crea una credenziale di tipo Header Auth: nome
Authorization, valoreBearerpiù la tua chiave API di un fornitore compatibile con OpenAI. Se serve, adatta URL di base e modello. - Nel nodo “An die Seite senden” sostituisci i segnaposto di URL e token con la tua destinazione, per esempio un tuo webhook, una mail o un file.
- Attiva il workflow e chiama una volta l'URL del webhook con
{"id": "test000001", "lang": "it"}.
E poi torna alla cartolina dall'orbita: intanto la ISS è già qualche migliaio di chilometri più in là.