Post by YodaPiu' d'un anno fa il file "https://www.meteoam.it/messaggio-meteomar"
dell'Aeronautica Militare era in ASCII puro.
w3m -T txt/html -dump -cols 1000 https://www.meteoam.it/messaggio-meteomar
-cite-
You need to enable JavaScript to run this app.
Homepage
Aeronautica Militare
PREVISIONI
................
......cut.........
.................
Apple Store Google Play
Ministero della Difesa
-/cite-
La mia domanda e' che vorrei sapere se e come e' possibile abilitare
JavaScript in w3m grazie
Suppongo che più che eseguire javascript o usare w3m a te interessi
recuperare il messaggio tramite script da eseguire in terminale.
Quindi se per un attimo usi un browser grafico e con i dev tools guardi un
po' le richieste che fa, vedrai che a un certo punto fa una
richiesta di questo tipo:
https://cm.meteoam.it/content/published/api/v1.1/items?channelToken=7449487744984981831df3b6b37e73c9&fields=all&limit=1&orderBy=fields.date:desc&q=type%20eq%20%22Integration-Message%22%20and%20name%20sw%20%22MESSAGGI/MSG4/FXIY61%22%20and%20fields.date%20gt%20%222024-10-11T19:09:32.054Z%22
la cui risposta (json) contiene, tra le altre cose, il testo completo del
messaggio (si può estrarre con jq)
Nell'URL ci sono questi parametri:
channelToken: 7449487744984981831df3b6b37e73c9
fields: all
limit: 1
orderBy: fields.date:desc
q:
type%20eq%20%22Integration-Message%22%20and%20name%20sw%20%22MESSAGGI/MSG4/FXIY61%22%20and%20fields.date%20gt%20%222024-10-11T18:40:41.137Z%22
decodificando ulteriormente il q:
type eq "Integration-Message" and name sw "MESSAGGI/MSG4/FXIY61" and
fields.date gt "2024-10-11T19:09:32.054Z"
Quindi qui le cose importanti sembrano essere il channelToken (se lo togli
ti dà forbidden) e la data da mettere dentro la query in q, che sembra
essere nient'altro che la data attuale meno un giorno, convertita in UTC
(non sono pratico di mare né di meteo, quindi non so se questo ha un
significato).
Come succede spesso in questi casi, è molto probabile che le
informazioni vengano inviate dal server in qualcuno dei messaggi anteriori.
In effetti, nella risposta alla primissima richiesta
(https://www.meteoam.it/it/messaggio-meteomar), nell'HTML c'è quello che ci serve, alla linea 211 (tagliato un po'):
<script>
var message_6666601277624 =
{"validityHours":24,"AMItemsNumber":1,"query":"type eq
\"Integration-Message\" and name sw
\"MESSAGGI/MSG4/FXIY61\"","Title":"Meteomar",
"AMChannel":"7449487744984981831df3b6b37e73c9",
"Info":null,
"URL":"https://cm.meteoam.it/content/published/api/v1.1/items?channelToken=7449487744984981831df3b6b37e73c9&fields=all&limit=1&orderBy=fields.date:desc",
"labels"
...
</script>
dentro quell'oggetto javascript ci sono le nostre informazioni: "query" e
"URL".
Quindi con lo strumento che più ti piace puoi leggerti l'HTML ed estrarre
questi dati. A titolo di esempio, come cosa da NON fare se possibile, lo
faccio con sed e jq (non si usano regex per parsing di HTML e tutte quelle
flamewar dei bei tempi andati).
Salviamo il timestamp di 24 ore fa in UTC:
ts=$(TZ=UTC date -d '24 hours ago' '+%Y-%m-%dT%H:%M:%SZ')
Quindi il valore da usare per q sarà:
q="${query} and fields.date gt \"${ts}\""
Alla fine, con questi dati puoi adesso fare la richiesta ed avere il json
che contiene il testo che cerchi.
Script completo (da migliorare, come esercizio, la parte di estrazione
delle informazioni dall'HTML):
-------------------------
#!/bin/bash
curl -s https://www.meteoam.it/it/messaggio-meteomar > /tmp/meteomar
url=$(sed -n '/var message_/{s|var message_[^ ]* = *||; s/;//; p}' /tmp/meteomar | jq -r .URL)
query=$(sed -n '/var message_/{s|var message_[^ ]* = *||; s/;//; p}' /tmp/meteomar | jq -r .query)
ts=$(TZ=UTC date -d "24 hours ago" '+%Y-%m-%dT%H:%M:%S.010Z')
q="${query} and fields.date gt \"${ts}\""
curl -G -s "${url}" --data-urlencode "q=${q}" | jq -r '.items[0].fields.body'
-------------------------
Dopo avere fatto alcune prove, mi sembra che il channelToken sia sempre lo
stesso, quindi forse si potrebbe anche assumere sempre uguale e
semplificare il tutto in modo da passare solo la data:
-------------------------
#!/bin/bash
ts=$(TZ=UTC date -d "24 hours ago" '+%Y-%m-%dT%H:%M:%S.010Z')
q='type eq "Integration-Message" and name sw "MESSAGGI/MSG4/FXIY61" and fields.date gt "'${ts}'"'
url="https://cm.meteoam.it/content/published/api/v1.1/items?channelToken=7449487744984981831df3b6b37e73c9&fields=all&limit=1&orderBy=fields.date:desc"
curl -G -s "${url}" --data-urlencode "q=${q}" | jq -r '.items[0].fields.body'
-------------------------
--
Ciò che si vede, è.