andregri / fantacalcio-voti-live

1 stars 1 forks source link

javascript exception quando tento di prendere i voti live #7

Closed FabioLuporini closed 12 months ago

FabioLuporini commented 12 months ago

Ciao Andrea,

Ti dice per caso niente il seguente messaggio di errore?

/fantacalcio-voti-live/node_modules/protobufjs/src/reader.js:382
            throw Error("invalid wire type " + wireType + " at offset " + this.pos);
            ^

Error: invalid wire type 4 at offset 1
    at BufferReader.Reader.skipType (/fantacalcio-voti-live/node_modules/protobufjs/src/reader.js:382:19)
    at Type.LiveMessage$decode [as decode] (eval at Codegen (/fantacalcio-voti-live/node_modules/@protobufjs/codegen/index.js:50:33), <anonymous>:15:5)
    at Type.decode_setup [as decode] (/fantacalcio-voti-live/node_modules/protobufjs/src/type.js:507:25)
    at Object.<anonymous> (/fantacalcio-voti-live/decode_livemessage_pb.js:12:17)
    at Module._compile (internal/modules/cjs/loader.js:999:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10)
    at Module.load (internal/modules/cjs/loader.js:863:32)
    at Function.Module._load (internal/modules/cjs/loader.js:708:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:60:12)
    at internal/main/run_main_module.js:17:47
Traceback (most recent call last):
  File "/fantacalcio-voti-live/matchday.py", line 272, in <module>
    data = get_live_data()
  File "/fantacalcio-voti-live/matchday.py", line 144, in get_live_data
    data_live = decode_protobuf_live_msg(encoded)
  File "/fantacalcio-voti-live/utils.py", line 67, in decode_protobuf_live_msg
    return json.loads(out.decode())
  File "/usr/local/lib/python3.9/json/__init__.py", line 346, in loads
    return _default_decoder.decode(s)
  File "/usr/local/lib/python3.9/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/local/lib/python3.9/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Sto usando:

npm protobufjs --version
7.5.2

Questo lo ottengo eseguendo:

python3 utils.py

Questo dopo aver fatto le seguenti (ovvie) modifiche:

https://github.com/FabioLuporini/fantacalcio-voti-live/tree/reproducer

Ciao, grazie mille, e scusa se stupida domanda !

andregri commented 12 months ago

Scusa mancava un pezzo in utils.py! Adesso dovrebbe funzionare python3 utils.py 😄

andregri commented 12 months ago

@FabioLuporini nel frattempo ho lavorato a un cli tool separato scritto esclusivamente in javascript, così da evitare uno script python che richiama nodejs. Se vuoi darci un'occhiata, spero ti possa tornare utile!

FabioLuporini commented 12 months ago

bella roba! lo provo a brevissimo con piacere, potrebbe effettivamente tornarmi utile

poi, spero nel giro di ore/giorni, ti faccio vedere cosa sto facendo con tutto questo anche se dubito potra' esserti utile :)

FabioLuporini commented 12 months ago

Ciao Andrea, intanto chiudo l'issue perchè è risolto e funziona! Grazie mille ancora 👍

Ora non tocco più il codice fino a prossimo venerdì per ovvie ragioni lavorative :)

Comunque il nostro obiettivo era questo: https://fabioluporini.github.io/fantagag.live/ Fantacalcio in modalità formula 1.

Ci accodo una domanda: ogni quanto ti senti confidente a prelevare i dati da api.fantacalcio ? al momento ho intervalli di 20-30 minuti solo nelle fasce delle partite

Stavo pensando, se (e solo se) la frequenza di polling si rivelasse un problema, potremmo centralizzare il tutto deployando il programma JS che hai fatto te su GitHub Actions nelle fasce delle partite

Ciao, buona settimana, e grazie per ora :)

andregri commented 12 months ago

Progetto molto interessante! Mi piace anche l'interfaccia!

In teoria si potrebbe fare una richiesta ogni minuto. Infatti se apri gli strumenti da sviluppatore del browser, fantacalcio.it fa un polling dell'api con questa frequenza più o meno.

Inoltre, essendo un api pubblica che viene utilizzata da ogni utente che visualizza i voti live di fantacalcio.it non ci dovrebbero essere limitazioni sul numero di richieste.

L'idea delle github actions non è male ma bisognerebbe leggere i limiti dei runner pubblici di github. Però con un polling ogni 30 minuti potrebbe funzionare.

Per fare un polling più rapido, si potrebbe pensare di far girare lo script su qualche ambiente serverless.

Stavo facendo qualche esperimento con il serverless di cloudflare ma avevo problemi di compatibilità con la libreria protobufjs.

Volevo fare ancora una prova con le lambda functions di aws sfruttando il free tier.

andregri commented 12 months ago

Ho trovato questa guida di Github per vedere il report sull'utilizzo delle Github Actions.

Il limite degli account free è di 2,000 Actions minutes/month.

FabioLuporini commented 12 months ago

Ottimo grazie!

Per quanto riguardo il nostro progetto al momento...

Sì, Actions lo usiamo parecchio a lavoro (sia github-hosted che self-hosted). Al momento una run dura 2 minuti e 30 secondi di media, di cui 2 minuti solo per installare 😂 una volta che ho pushato la docker image sull'hub in teoria i tempi li dimezziamo o forse anche di piu'.

Ah, non posso banalmente aggiungere una sleep in python perchè devo fare il deployment su un altro repo (effettivamente una git push sul repo che hosta https://fabioluporini.github.io/fantagag.live/), e questo lo faccio da Actions stesso. Quindi l'installazione la sto pagando ad ogni giro...

Comunque, 2000 minuti al mese vuol dire una 30ina di ore. Se ci sono 5 giornate in un mese (caso pessimo), questo vuol dire 6 ore per giornata. Quindi a meno di non fare aggiornamenti troppo frequenti, non avremmo grossissimi problemi.

 Detto cio', per quanto riguarda questo:

Per fare un polling più rapido, si potrebbe pensare di far girare lo script su qualche ambiente serverless.

Maggiore la frequenza di polling, più ovviamente l'esperienza di gioco sarebbe migliore, quindi sarei aperto ad opzioni... 🤪

Detto cio', il solo esser arrivati a questo punto per me/noi è sostazialmente un mission accomplished!

Ci sono pero' tantissimi dati che mi è venuto in mente potremmo mostrare (numero di giocatori che hanno giocato vs non giocato, grafici vari, etc). Una volta che hai accesso al live in questo formato, ovviamente si apre un mondo!

andregri commented 12 months ago

Si può iniziare con un polling più lento delle github actions. Eventualmente riducendo all'osso l'immagine docker per ridurre i tempi di download.

Nel frattempo continuo a sperimentare con il serverless per trovare una soluzione più performante (e gratuita possibilmente!). Se trovo qualcosa di interessante ti informo.

Concordo che una volta che si hanno a disposizione i dati, ci sono tantissime informazioni che si potrebbero estrarre 😄