masteripper Δημοσ. 30 Ιουνίου 2021 Μέλος Δημοσ. 30 Ιουνίου 2021 1 ώρα πριν, Predatorkill είπε Παντως επειδη ειναι πολυ ευκολο να αλλαξουν κατι και να στα διαλυσει ολα καλο θα ηταν να βαλεις κανενα health check να χτυπανε τα endpoints 1-2 φορες τη μερα. Με αυτη τη λογικη θα πρεπει να βρεις και εναν ευκολο μηχανισμο να μπορεις να τα αλλαζεις μπαμ μπαμ. Αν μπορούσες να δώσεις καμμιά κατεύθυνση
Predatorkill Δημοσ. 30 Ιουνίου 2021 Δημοσ. 30 Ιουνίου 2021 (επεξεργασμένο) 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. Επεξ/σία 30 Ιουνίου 2021 από Predatorkill 2
Επισκέπτης Δημοσ. 2 Ιουλίου 2021 Δημοσ. 2 Ιουλίου 2021 (επεξεργασμένο) Στις 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 Επεξ/σία 2 Ιουλίου 2021 από morehp
Lanike71 Δημοσ. 2 Ιουλίου 2021 Δημοσ. 2 Ιουλίου 2021 Θέλει πολύ περισσότερο ψάξιμο από το αν υπάρχουν null τιμές. Το json του ΟΠΑΠ έχει πολλές φορές και λογικά λάθη, όχι απλά λάθη σύνταξης. Ίσως για αυτόν που το φτιάχνει και ξέρει τι σημαίνουν τα κλειδιά είναι αστείο, αλλά για κάποιον που το ψάχνει, δεν είναι και τόσο αστείο... 1
Hotman Δημοσ. 2 Ιουλίου 2021 Δημοσ. 2 Ιουλίου 2021 Ψάχνοντας στο παρελθόν δεδομένα για live scores στο basket, αναγκάστηκα να πληρώσω συνδρομή σε κάποιο site. Δεν κατάφερα να βρω κάποιο αξιόπιστο δωρεάν. Μάλιστα είχε ξεχωριστές χρεώσεις για το refresh rate. Το δικό μου κόστιζε 150€ τον μήνα αν θυμάμαι καλά για να έχω αποτελέσματα με 1 λεπτό καθυστέρηση. Το "live" στοίχιζε τριπλάσια τιμή.
masteripper Δημοσ. 3 Ιουλίου 2021 Μέλος Δημοσ. 3 Ιουλίου 2021 Στις 2/7/2021 στις 8:20 ΜΜ, Hotman είπε basket Άσχετο λίγο ... αλλά έχει ψωμί?
geovena87 Δημοσ. 12 Απριλίου 2022 Δημοσ. 12 Απριλίου 2022 (επεξεργασμένο) Πρώτα από όλα από την στιγμή που έχουνε 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. Στην τελική δεν πειράζω τίποτα απο το αρχικό 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) : Εδώ με τo onlyLive=false: Βλέπω λιγότερα και οχι περίεργα πρωταθλήματα. (Ιδανικό θα ήταν να πήγαιναν στον Chrome να τα βλέπαμε στο πινακάκι ) Βέβαια μπορώ να γράφω ένα script στην python με την βιβλιοθήκη request και με την βοήθεια αυτού του site : https://jsonpathfinder.com/ (το αντίστοιχο XPATH για HTML elements! Αν δεν είχα την βοήθεια του δε θα εκανα τίποτα και να ψάξω για το πεδίο με τις αποδόσεις 1 Χ 2 αν σε πολλά παιχνίδια είναι κενές τότε υπάρχει θέμα.. Φυσικά με τα κατάλληλα headers για να φαινόμαστε νόμιμοι (δε μου αρέσουν τα '^\\^ κτλ θα δω μήπως μπορώ να τα βγάλω και να το αφήσω σαν απλό λεξικό key:value Κάτι βρήκα πάνω σε αυτό το θέμα αλλά το ψάχνω: Αλλά θέλει να πατήσεις 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 και ρίξε μια ματιά. Καλή επιτυχία! Επεξ/σία 12 Απριλίου 2022 από geovena87 1
masteripper Δημοσ. 13 Απριλίου 2022 Μέλος Δημοσ. 13 Απριλίου 2022 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. Στην τελική δεν πειράζω τίποτα απο το αρχικό 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) : Εδώ με τo onlyLive=false: Βλέπω λιγότερα και οχι περίεργα πρωταθλήματα. (Ιδανικό θα ήταν να πήγαιναν στον Chrome να τα βλέπαμε στο πινακάκι ) Βέβαια μπορώ να γράφω ένα script στην python με την βιβλιοθήκη request και με την βοήθεια αυτού του site : https://jsonpathfinder.com/ (το αντίστοιχο XPATH για HTML elements! Αν δεν είχα την βοήθεια του δε θα εκανα τίποτα και να ψάξω για το πεδίο με τις αποδόσεις 1 Χ 2 αν σε πολλά παιχνίδια είναι κενές τότε υπάρχει θέμα.. Φυσικά με τα κατάλληλα headers για να φαινόμαστε νόμιμοι (δε μου αρέσουν τα '^\\^ κτλ θα δω μήπως μπορώ να τα βγάλω και να το αφήσω σαν απλό λεξικό key:value Κάτι βρήκα πάνω σε αυτό το θέμα αλλά το ψάχνω: Αλλά θέλει να πατήσεις 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 και ρίξε μια ματιά. Καλή επιτυχία! Ευχαριστώ πολύ φίλε μου ..ευτυχώς ένα άλλο παιδί με βοήθησε πολύ και εχω βγάλει άκρη...αλλά με τόσο αναλυση όλο και κατι θα κερδίσω... Ευχαριστώ και πάλι.. Τώρα βέβαια έχω προχωρήσει στο API του football-api 1
geovena87 Δημοσ. 13 Απριλίου 2022 Δημοσ. 13 Απριλίου 2022 (επεξεργασμένο) 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")) Το κλείσιμο του αρχείου γινεται αυτόματα. Συγνώμη για τις παραλήψεις και τα λάθη απλα ετυχε να πέσω πανω στο θέμα αυτό στην δική μου αναζητηση. Και πάλι σε ευχαριστώ για τον χρόνο σου. Με την πρώτη ευκαιρια θα παραθεσω ολοκληρο των κωδικα μου και για το ποδοσφαιρο και για το μπασκετ μιας και μοιαζουν πολύ Επεξ/σία 13 Απριλίου 2022 από geovena87 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα