Προς το περιεχόμενο

Documentation για ΟΠΑΠ web services (ποδόσφαιρο)


masteripper

Προτεινόμενες αναρτήσεις

1 ώρα πριν, Predatorkill είπε

Παντως επειδη ειναι πολυ ευκολο να αλλαξουν κατι και να στα διαλυσει ολα καλο θα ηταν να βαλεις κανενα health check να χτυπανε τα endpoints 1-2 φορες τη μερα. Με αυτη τη λογικη θα πρεπει να βρεις και εναν ευκολο μηχανισμο να μπορεις να τα αλλαζεις μπαμ μπαμ.

Αν μπορούσες να δώσεις καμμιά κατεύθυνση

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
1 ώρα πριν, masteripper είπε

Αν μπορούσες να δώσεις καμμιά κατεύθυνση

Φτιαξε ενα script που να χτυπαει τα endpoint το καθε ενα ξεχωριστα. Ξερεις παντα ποια ειναι τα object keys που επιστρεφει καθως και τι τυπος ειναι το property (πχ array, object, boolean, string), τσεκαρε και τα nested objects ή τα objects μεσα στο array. 
 

Φτιαξε ενα τσεκ που να ελενγχει αν οντως αυτα που ερχονται ειναι αυτα που περιμενεις (ενα jest ισως ηταν το καλυτερο)
 

φτιαξε ενα cron που θα τρεχει 1-2-3 φορες τη μερα και αμα βρει αναντιστοιχια να σου στελνει ενα email ή ενα μνμ στο discord/slack ή να φτιαχνει ενα issue στο github. 
 

επιπονη διαδικασια αλλα θα γλυτωσεις σκασιματα που μπορει να μην τα επαιρνες χαμπαρι ποτε εκτος και αν βαλεις sentry ή bugsnag
 

Ετσι το φανταζομαι, αν εχει κανενας καμμια καλυτερη προσεγγιση ας την ριξει.

3 ώρες πριν, Predatorkill είπε

Με αυτη τη λογικη θα πρεπει να βρεις και εναν ευκολο μηχανισμο να μπορεις να τα αλλαζεις μπαμ μπαμ.

Εδω δε μπορω να φανταστω υλοποιηση ισως και να μην γινεται. Θα πρεπει να το κανεις χερατα το refactor.

Επεξ/σία από Predatorkill
  • Like 2
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Επισκέπτης
Δημοσ. (επεξεργασμένο)
Στις 30/6/2021 στις 6:15 ΜΜ, Predatorkill είπε

Παντως επειδη ειναι πολυ ευκολο να αλλαξουν κατι και να στα διαλυσει ολα καλο θα ηταν να βαλεις κανενα health check να χτυπανε τα endpoints 1-2 φορες τη μερα. Με αυτη τη λογικη θα πρεπει να βρεις και εναν ευκολο μηχανισμο να μπορεις να τα αλλαζεις μπαμ μπαμ.

Οπως και να έχει θα πρέπει όποιες αλλαγές συμβούν στα contract να κάνεις update στην πλευρά σου.

Αν έχεις γράψει εξαρχής guards για τα δεδομένα που σε ενδιαφέρουν ώστε να μην σκάει το σύμπαν από τα null και έχεις logging και alerts στις κλήσεις που κάνεις και επιστρέφουν 400 η 404 απλά θα καταλάβεις πως κάτι τρέχει και ίσως πρέπει να το ψάξεις.

Αλλιώς στήνεις API gateway/proxy ώστε η εφαρμογή σου πάντα να μιλάει με σταθερά δικά σου contract και endpoints και όποιες αλλαγές γίνονται upstream τις χειρίζεται το gateway/proxy

Επεξ/σία από morehp
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Θέλει πολύ περισσότερο ψάξιμο από το αν υπάρχουν null τιμές.

Το json του ΟΠΑΠ έχει πολλές φορές και λογικά λάθη, όχι απλά λάθη σύνταξης. Ίσως για αυτόν που το φτιάχνει και ξέρει τι σημαίνουν τα κλειδιά είναι αστείο, αλλά για κάποιον που το ψάχνει, δεν είναι και τόσο αστείο...

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ψάχνοντας στο παρελθόν δεδομένα για live scores στο basket, αναγκάστηκα να πληρώσω συνδρομή σε κάποιο site. Δεν κατάφερα να βρω κάποιο αξιόπιστο δωρεάν. Μάλιστα είχε ξεχωριστές χρεώσεις για το refresh rate. Το δικό μου κόστιζε 150€ τον μήνα αν θυμάμαι καλά για να έχω αποτελέσματα με 1 λεπτό καθυστέρηση. Το "live" στοίχιζε τριπλάσια τιμή.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 9 μήνες μετά...
Δημοσ. (επεξεργασμένο)

Πρώτα από όλα από την στιγμή που έχουνε JSON data θα αποφύγουμε τον πειρασμό για χρήση selenium (από την μεριά μπροστά της οθόνης) και γενικά browser automation (δε τι σνομπάρω καθόλου) αλλά αφού δεν έχουμε κάποια εξωτική javascript που πρέπει να εκτελεστεί ή heavily obfuscated data πχ fromChar(43,56) δεν υπάρχει λόγος να μπλέξουμε με explicit implicit delays time.sleep() κτλ μιλώντας πάντα για python και πάμε από την μεριά του δικτύου με την χρήση των βιβλιοθηκών requests json κτλ

Φίλε μου όπως έχουν πει και παραπάνω με τα Developer Tools του Google Chrome μπορούμε να δούμε το XHR request και το API το θέμα ειναι ότι μας δίνει την δυνατότητα για να ένα εξάμηνο μόνο πρίν (κατά την ημέρα ανάρτησης του post η μέγιστη προηγούμενη ημερομηνια είναι 2021-10-11, τραβάω τα δεδομένα μια μια ημέρα fromDate=2021-10-11 toDate=2021-10-11)

Αυτή είναι και η σελίδα που βλέπει αμέσως ενας χρήστης και έψαξα για endpoints.
(https://api.opap.gr/sb/sport/soccer/coupon?locale=el&onlyLive=false&marketIds=1%2C2%2C31%2C21%2C18%2C18%2C18%2C14&fromDate=2022-04-12&toDate=2022-04-12)

Οι μεταβλητές στο XHR request για το JSON είναι:
?locale=en

&onlyLive=false

&marketIds=1%2C2%2C31%2C21%2C18%2C18%2C18%2C14&

fromDate=2022-04-12

&toDate=2022-04-12

Ξεκάθαρα το fromDate και το toDate τι είναι.. To locale είναι η γλώσσα τον αποτελεσμάτων (el,en) το marketlds δε το πειράζω το αφήνω έτσι.

το onlyLive αν το παραλείψεις εντελώς επιστρέφει ένα τρελό αριθμό αποτελεσμάτων κάτι που θα δοκιμάσω να το πιάσω μέσω Burp και να δω τι πίνακα μου επιστρέφει! (το JSON είναι καλό για μεταφορά και όχι για απεικόνιση)

Να σημειώσω ότι επιλογές όπως "Αναζήτηση με Διοργάνωση, Κωδικός Αγώνα , Αγώνες Εκτός Κουπονιού δεν κάνουν κάποιο επιπλέον XHR GET HTTP Request για επιστροφή JSON απλά έχουν κατέβει όλα τα δεδομένα και φιλτράρονται στον Client.

 

image.png.ac9cf060272157ac770701d957e2d7dd.png


Στην τελική δεν πειράζω τίποτα απο το αρχικό request του πρώτου endpoint (https://api.opap.gr/sb/sport/soccer/coupon?locale=el&onlyLive=false&marketIds=1%2C2%2C31%2C21%2C18%2C18%2C18%2C14&fromDate=2022-04-12&toDate=2022-04-12) απλά αλλάζω ημερομηνίες, αλλα σαν ψυχαναγκαστικός θα παραλείψω το onlyLive απο το Burp να δω τι θα μου δείξει ο Chrome. Θα μου πεις γιατί να μη δοκιμάσω μόνο του True/False αλλά να το παραλείψω? Επειδή θέλω να πάρει τα default στον server μπας και επιστρέψει κάτι παραπάνω. Αλλά θέλω να το περάσω στον Chrome μετά απο τον Burp ώστε η Javascript να τα μεταμορφώσει σε πίνακα και να δω τις διαφορές. (Είπαμε τα δεδομένα του JSON για να καταναλωθούν χρειάζονται table εμ τι στο χέρι??? (προγραμματιστικό χιούμορ) Πάντως με μια πρώτη σκέψη πιστεύω ότι το λογισμικό της Olisoft δίνει και σε άλλες εταιρίες και έτσι επιστρέψει πρωταθλήματα και παιχνίδια που δεν αφορούνε τον ΟΠΑΠ

Παρακάτω είναι intercept χωρίς το onlyLive (φαγώθηκα ο άπληστος :P) :

image.png.cf856864ec2a110f23f37e7959daec11.png

Εδώ με τo onlyLive=false:

image.png.42dd3364dea4dd1cd6044862917ad531.png

Βλέπω λιγότερα και οχι περίεργα πρωταθλήματα. (Ιδανικό θα ήταν να πήγαιναν στον Chrome να τα βλέπαμε στο πινακάκι :( )

Βέβαια μπορώ να γράφω ένα script στην python με την βιβλιοθήκη request και με την βοήθεια αυτού του site : https://jsonpathfinder.com/ (το αντίστοιχο XPATH για HTML elements! Αν δεν είχα την βοήθεια του δε θα εκανα τίποτα και να ψάξω για το πεδίο με τις αποδόσεις 1 Χ 2 αν σε πολλά παιχνίδια είναι κενές τότε υπάρχει θέμα..
 

image.png.079b4cf723ac6c17bb030d9e0ff16c97.png

Φυσικά με τα κατάλληλα headers για να φαινόμαστε νόμιμοι :P (δε μου αρέσουν τα '^\\^ κτλ θα δω μήπως μπορώ να τα βγάλω και να το αφήσω σαν απλό λεξικό key:value

image.png.40ca67ffcd2acd099171dfea963de2dd.png
 

Κάτι βρήκα πάνω σε αυτό το θέμα αλλά το ψάχνω:

image.png.9a38ed7e50486f54b5d65d6d720e93f0.png

Αλλά θέλει να πατήσεις Save σε κάθε αλλαγή και να σιγουρευτείς ότι το πάνω δεξιά κουμπί ON ειναι ενεργοποιημένο (Σε λίγο θα ανοίξουμε Developer Tools μέσα στο Developer Tools lol)

Μετά απο μια σύγκριση pdf βλέπω ότι με την μεταβλητή να λείπει εντελώς δεν υπάρχει καλή αντιστοίχηση σημείου και απόδοσης, αρά το αφήνουμε..

Ψάχνοντας λίγο παραπάνω βρήκα και αυτό: https://ds.opap.gr/web_soccer/index.html  (μάλλον για προγραμματιστές αν κρίνω απο το ds.opap (ds = developers) αλλά δεν ξέρω τι σημαίνει το pregame CDS κτλ οπότε δε θα ασχοληθώ, άσε που έχει και αρκετά κανάλια όπως το Production, UAT (User Acceptance Testing) όπως έμαθα αλλά κάνε κλικ στο κουμπί ALL GAMES και ρίξε μια ματιά.

 

image.png.85cbc5970cd4dd9b08d5bc70d493cc21.png

Καλή επιτυχία!

 

 

image.png

Επεξ/σία από geovena87
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

16 ώρες πριν, geovena87 είπε

Πρώτα από όλα από την στιγμή που έχουνε JSON data θα αποφύγουμε τον πειρασμό για χρήση selenium (από την μεριά μπροστά της οθόνης) και γενικά browser automation (δε τι σνομπάρω καθόλου) αλλά αφού δεν έχουμε κάποια εξωτική javascript που πρέπει να εκτελεστεί ή heavily obfuscated data πχ fromChar(43,56) δεν υπάρχει λόγος να μπλέξουμε με explicit implicit delays time.sleep() κτλ μιλώντας πάντα για python και πάμε από την μεριά του δικτύου με την χρήση των βιβλιοθηκών requests json κτλ

Φίλε μου όπως έχουν πει και παραπάνω με τα Developer Tools του Google Chrome μπορούμε να δούμε το XHR request και το API το θέμα ειναι ότι μας δίνει την δυνατότητα για να ένα εξάμηνο μόνο πρίν (κατά την ημέρα ανάρτησης του post η μέγιστη προηγούμενη ημερομηνια είναι 2021-10-11, τραβάω τα δεδομένα μια μια ημέρα fromDate=2021-10-11 toDate=2021-10-11)

Αυτή είναι και η σελίδα που βλέπει αμέσως ενας χρήστης και έψαξα για endpoints.
(https://api.opap.gr/sb/sport/soccer/coupon?locale=el&onlyLive=false&marketIds=1%2C2%2C31%2C21%2C18%2C18%2C18%2C14&fromDate=2022-04-12&toDate=2022-04-12)

Οι μεταβλητές στο XHR request για το JSON είναι:
?locale=en

&onlyLive=false

&marketIds=1%2C2%2C31%2C21%2C18%2C18%2C18%2C14&

fromDate=2022-04-12

&toDate=2022-04-12

Ξεκάθαρα το fromDate και το toDate τι είναι.. To locale είναι η γλώσσα τον αποτελεσμάτων (el,en) το marketlds δε το πειράζω το αφήνω έτσι.

το onlyLive αν το παραλείψεις εντελώς επιστρέφει ένα τρελό αριθμό αποτελεσμάτων κάτι που θα δοκιμάσω να το πιάσω μέσω Burp και να δω τι πίνακα μου επιστρέφει! (το JSON είναι καλό για μεταφορά και όχι για απεικόνιση)

Να σημειώσω ότι επιλογές όπως "Αναζήτηση με Διοργάνωση, Κωδικός Αγώνα , Αγώνες Εκτός Κουπονιού δεν κάνουν κάποιο επιπλέον XHR GET HTTP Request για επιστροφή JSON απλά έχουν κατέβει όλα τα δεδομένα και φιλτράρονται στον Client.

 

image.png.ac9cf060272157ac770701d957e2d7dd.png


Στην τελική δεν πειράζω τίποτα απο το αρχικό request του πρώτου endpoint (https://api.opap.gr/sb/sport/soccer/coupon?locale=el&onlyLive=false&marketIds=1%2C2%2C31%2C21%2C18%2C18%2C18%2C14&fromDate=2022-04-12&toDate=2022-04-12) απλά αλλάζω ημερομηνίες, αλλα σαν ψυχαναγκαστικός θα παραλείψω το onlyLive απο το Burp να δω τι θα μου δείξει ο Chrome. Θα μου πεις γιατί να μη δοκιμάσω μόνο του True/False αλλά να το παραλείψω? Επειδή θέλω να πάρει τα default στον server μπας και επιστρέψει κάτι παραπάνω. Αλλά θέλω να το περάσω στον Chrome μετά απο τον Burp ώστε η Javascript να τα μεταμορφώσει σε πίνακα και να δω τις διαφορές. (Είπαμε τα δεδομένα του JSON για να καταναλωθούν χρειάζονται table εμ τι στο χέρι??? (προγραμματιστικό χιούμορ) Πάντως με μια πρώτη σκέψη πιστεύω ότι το λογισμικό της Olisoft δίνει και σε άλλες εταιρίες και έτσι επιστρέψει πρωταθλήματα και παιχνίδια που δεν αφορούνε τον ΟΠΑΠ

Παρακάτω είναι intercept χωρίς το onlyLive (φαγώθηκα ο άπληστος :P) :

image.png.cf856864ec2a110f23f37e7959daec11.png

Εδώ με τo onlyLive=false:

image.png.42dd3364dea4dd1cd6044862917ad531.png

Βλέπω λιγότερα και οχι περίεργα πρωταθλήματα. (Ιδανικό θα ήταν να πήγαιναν στον Chrome να τα βλέπαμε στο πινακάκι :( )

Βέβαια μπορώ να γράφω ένα script στην python με την βιβλιοθήκη request και με την βοήθεια αυτού του site : https://jsonpathfinder.com/ (το αντίστοιχο XPATH για HTML elements! Αν δεν είχα την βοήθεια του δε θα εκανα τίποτα και να ψάξω για το πεδίο με τις αποδόσεις 1 Χ 2 αν σε πολλά παιχνίδια είναι κενές τότε υπάρχει θέμα..
 

image.png.079b4cf723ac6c17bb030d9e0ff16c97.png

Φυσικά με τα κατάλληλα headers για να φαινόμαστε νόμιμοι :P (δε μου αρέσουν τα '^\\^ κτλ θα δω μήπως μπορώ να τα βγάλω και να το αφήσω σαν απλό λεξικό key:value

image.png.40ca67ffcd2acd099171dfea963de2dd.png
 

Κάτι βρήκα πάνω σε αυτό το θέμα αλλά το ψάχνω:

image.png.9a38ed7e50486f54b5d65d6d720e93f0.png

Αλλά θέλει να πατήσεις Save σε κάθε αλλαγή και να σιγουρευτείς ότι το πάνω δεξιά κουμπί ON ειναι ενεργοποιημένο (Σε λίγο θα ανοίξουμε Developer Tools μέσα στο Developer Tools lol)

Μετά απο μια σύγκριση pdf βλέπω ότι με την μεταβλητή να λείπει εντελώς δεν υπάρχει καλή αντιστοίχηση σημείου και απόδοσης, αρά το αφήνουμε..

Ψάχνοντας λίγο παραπάνω βρήκα και αυτό: https://ds.opap.gr/web_soccer/index.html  (μάλλον για προγραμματιστές αν κρίνω απο το ds.opap (ds = developers) αλλά δεν ξέρω τι σημαίνει το pregame CDS κτλ οπότε δε θα ασχοληθώ, άσε που έχει και αρκετά κανάλια όπως το Production, UAT (User Acceptance Testing) όπως έμαθα αλλά κάνε κλικ στο κουμπί ALL GAMES και ρίξε μια ματιά.

 

image.png.85cbc5970cd4dd9b08d5bc70d493cc21.png

Καλή επιτυχία!

 

 

image.png

Ευχαριστώ πολύ φίλε μου ..ευτυχώς ένα άλλο παιδί με βοήθησε πολύ και εχω βγάλει άκρη...αλλά με τόσο αναλυση όλο και κατι θα κερδίσω...

Ευχαριστώ και πάλι..

Τώρα βέβαια έχω προχωρήσει στο API του football-api 

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)
9 ώρες πριν, masteripper είπε

Ευχαριστώ πολύ φίλε μου ..ευτυχώς ένα άλλο παιδί με βοήθησε πολύ και εχω βγάλει άκρη...αλλά με τόσο αναλυση όλο και κατι θα κερδίσω...

Ευχαριστώ και πάλι..

Τώρα βέβαια έχω προχωρήσει στο API του football-api 

Να είσαι καλά και σε ευχαριστώ για τα καλά σου λόγια!!! Αυτο που εκανα ειναι να κατεβαζω ενα προς ενα το καθε JSON και να το αποθηκευω σε αρχειο με σκοπο κάποτε να το περάσω σε μια βάση (το έκανα σπαστά πρώτα σε αρχείο και μετά διαβασμα του αρχείου, δε το αποθηκευσα απευθεις οπως ηταν στην μνήμη στην βάση.

Θέλω να διευκρινήσω σχετικά με τα Request Headers (απο το Developer Tools του Google Chrome :

Στο κανονικό βλέπουμε ότι υπάρχει το πεδίο If-None-Match και είναι για caching απο οτι καταλαβα (μπορεί να μην ειναι στο πρώτο πρωτο request αλλα το φοβήθηκα ότι αλλάζει τιμές)

Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,el;q=0.8,tr;q=0.7
Connection: keep-alive
Host: api.opap.gr
If-None-Match: "0ddb1caf6a0aca15fe5b9ae4927791bd7"
Origin: https://pamestoixima.opap.gr
Referer: https://pamestoixima.opap.gr/
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36

Κάνοντας force τον Google Chrome απο την καρτέλα Network να κανει Disable Cache βλέπουμε την αλλάγη στο Cache-Control:no-cache και στο Pragma: no-cache για να είμαι σίγουρος οτι θα πάρω παντα το αρχείο!

Accept: application/json, text/javascript, */*; q=0.01
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,el;q=0.8,tr;q=0.7
Cache-Control: no-cache
Connection: keep-alive
Host: api.opap.gr
Origin: https://pamestoixima.opap.gr
Pragma: no-cache
Referer: https://pamestoixima.opap.gr/
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36

 Πρώτα απο όλα κάνουμε import τις παρακάτω βιβλιοθήκες, σε περίπτωση που δεν τις έχουμε κάνουμε εγκατάσταση με το pip install <library_name>

import requests
import json


Στην βιβλιοθήκη requests δημιουργούμε ένα λεξικο key:value όπως εδω:

headers = {
    'Accept': 'application/json, text/javascript, */*; q=0.01'
	'Accept-Encoding': 'gzip, deflate, br'
	'Accept-Language': 'en-US,en;q=0.9,el;q=0.8,tr;q=0.7'
	'Cache-Control': 'no-cache'
	'Connection': 'keep-alive'
	'Host': 'api.opap.gr'
	'Origin': 'https://pamestoixima.opap.gr'
	'Pragma': 'no-cache'
	'Referer': 'https://pamestoixima.opap.gr/'
	'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="100", "Google Chrome";v="100"'
	'sec-ch-ua-mobile': '?0'
	'sec-ch-ua-platform': '"Windows"'
	'Sec-Fetch-Dest': 'empty'
	'Sec-Fetch-Mode': 'cors'
	'Sec-Fetch-Site': 'same-site'
	'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36',
}

Έπειτα ενα αντικείμενο Session (για να κραταει και cookies)
 

s = requests.Session()

Καάνουμε το GET Request μέσω του Session και αποθηκεύουμε το αποτελεσμα σε μια μεταβλητη πχ data:
 

req = s.get("https://api.opap.gr/sb/sport/soccer/coupon?locale=el&onlyLive=false&marketIds=1%2C2%2C31%2C21%2C18%2C18%2C18%2C14&fromDate=2022-04-13&toDate=2022-04-13", headers=headers)

*Στο URL δεν αλλαξα τιποτα πέρα απο τις ημερομηνιες ουτε παρέλειψα κάτι

Μετά ζητάς την json αναπαρασταση απο το req:

 

data = req.json()


Και αναλογα το γραφεις σε αρχειο με το json.dump() ή το εμφανιζεις στην οθόνη..

with open('filename.json', 'w') as f:
    json.dump(data, f)

Φυσικά αυτό μπορεί να γινει επαναληπτικα αρκει να βρεις το σωστο ευρος ημερομηνιών (περιπου 6 μήνες, το καταλαβαίνεις όταν δεν επιστρέφει το JSON {"errorCode":"1502"} και δημιουργώντας μια range απο ημερομηνιες

 

from datetime import date, timedelta

def daterange(start_date, end_date):
    for n in range(int((end_date - start_date).days)):
        yield start_date + timedelta(n)

start_date = date(2021, 10, 13) //ΠΕΡΙΠΟΥ ΕΚΕΙ
end_date = date(2022, 4, 12) // ΜΕΧΡΙ ΧΤΕΣ
for single_date in daterange(start_date, end_date):
    print(single_date.strftime("%Y-%m-%d"))


Το κλείσιμο του αρχείου γινεται αυτόματα.

Συγνώμη για τις παραλήψεις και τα λάθη απλα ετυχε να πέσω πανω στο θέμα αυτό στην δική μου αναζητηση.

Και πάλι σε ευχαριστώ για τον χρόνο σου. Με την πρώτη ευκαιρια θα παραθεσω ολοκληρο των κωδικα μου και για το ποδοσφαιρο και για το μπασκετ μιας και μοιαζουν πολύ

Επεξ/σία από geovena87
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...