clairvoyant Δημοσ. 26 Απριλίου 2005 Δημοσ. 26 Απριλίου 2005 Καλησπέρα, Ας υποθέσουμε ότι έχουμε μια σελίδα, της οποίας τα περιεχόμενα ενός πίνακα παίρνουν τιμές με χρήση javascript. Αυτό που θέλω να κάνω είναι με κάποιο προγραμματιστικό τρόπο να συνδέομαι στη σελίδα και να αποθηκεύω τις τιμές αυτές. Απ' ότι καταλαβαίνω, δεν έχει νόημα να αναζητώ τις τιμές στον κώδικα της σελίδας, αφού αυτές φορτώνονται δυναμικά. Μπορώ να κάνω κάτι; Θα ήθελα γενικές και ειδικές συμβουλές επί του θέματος (δηλ. ναι μεν ποια γλώσσα να χρησιμοποιήσω, με προτίμηση μία από τις Java & Delphi, αλλά και λίγο ειδικότερα πως θα γίνει αυτό που θέλω να κάνω). Οποιαδήποτε συμβουλή καλοδεχούμενη γιατί έχω κολλήσει άγρια... Α, να μην το ξεχάσω, η σελίδα βρίσκεται σε διαδικτυακό τόπο και όχι στον υπολογιστή μου (ένα site είναι με λίγα λόγια), και δεν έχω την παραμικρή ιδέα του τι ακριβώς συμβαίνει στον server...
GrMikeD Δημοσ. 26 Απριλίου 2005 Δημοσ. 26 Απριλίου 2005 ti ennoeis otan les "ta periexomena enos pinaka" ? Boreis na gineis ligo pio safis, isws me ena paradeigma?
clairvoyant Δημοσ. 26 Απριλίου 2005 Μέλος Δημοσ. 26 Απριλίου 2005 ti ennoeis otan les "ta periexomena enos pinaka" ? Boreis na gineis ligo pio safis, isws me ena paradeigma? Θα προσπαθήσω.. Η σελίδα, απ' ότι καταλαβαίνω, χρησιμοποιεί πίνακες για την εμφάνιση κάποιων στοιχείων. Το κλασικό <table> <td> <tr>...</tr> </td> </table> (Μπορεί να έγραψα ανάποδα τα <td> και <tr>, έχει σκουριάσει και η HTML στο μυαλό μου). Ε κάπου εκεί στα κελιά, οι τιμές δεν είναι στατικές αλλά ανανεώνονται διαρκώς από ένα javascript. Κάτι σαν τιμές μετοχών φαντάσου. Εγώ πως στο καλό θα διαβάσω αυτές τις τιμές; Βασικά, επειδή μου αρέσει πάντα να κάνω τα πράγματα με τον πλέον εύκολο (ή και μπακάλικο!) τρόπο, και επειδή η σελίδα μου φαίνεται χάος από άποψη δομής, σκέφτηκα μια εναλλακτική λύση: μήπως είναι πιο εύκολο να βάλω σε μια γλώσσα προγραμματισμού ένα control το οποίο θα λειτουργεί όπως ο Internet Explorer (ActiveX control λέγεται αυτό ή κάνω λάθος; ), και αφού ανοίξει η σελίδα και εμφανιστεί κανονικά, μετά θα καλώ π.χ. μια κλήση myControl.selectAllText() [υποθετικά το έγραψα] και αφού πάρω το κείμενο θα εντοπίζω εκεί τις τιμές που θέλω; Ακόμη και αυτή η λύση με καλύπτει απόλυτα, οπότε αν είναι εφικτή θα ήθελα μια μικρή καθοδήγηση ως προς το πως θα το κάνω (επαναλαμβάνω, καλύτερα με Java ή Delphi. Από ικανότητα διαχείρισης κειμένου τα πάω καλά στη C++ αλλά με τις Visual C++/C# έχω μαύρα μεσάνυχτα).
GrMikeD Δημοσ. 26 Απριλίου 2005 Δημοσ. 26 Απριλίου 2005 Diladi thes ana takta diastimata na pairneis tis times apo tin selida? xmmmm. Efoson den boreis na tis pareis apo to "service" pou dinei tis times sto html, prepei ontws mesw enos socket connection, na pairneis tin selida ana px 2 lepta, na kaneis parsing kai na briskeis tis times. Auto ginetai kai me java kai me delphi.
clairvoyant Δημοσ. 26 Απριλίου 2005 Μέλος Δημοσ. 26 Απριλίου 2005 το έκανα (μπακαλίστικα όπως πάντα), με τη βοήθεια του TWebControl (Delphi). Βέβαια η λύση που προτείνεις εσύ προφανώς θα έχει περισσότερα πλεονεκτήματα, όμως υπάρχει πίεση χρόνου οπότε..! Ευχαριστώ πάντως
Skeftomilos Δημοσ. 27 Απριλίου 2005 Δημοσ. 27 Απριλίου 2005 Ομολογώ ότι μπερδεύτηκα. Η JavaScript είναι client-side γλώσσα, επομένως δε μπορεί να σε εμποδίσει να διαβάσεις τη σελίδα. Για να διαβάσεις όλο τον HTML κώδικα της σελίδας με JavaScript ένας τρόπος είναι ο εξής: >var s = document.documentElement.innerHTML Θα πεις τώρα, πώς θα τρέξω αυτό τον κώδικα? Μία ιδέα είναι τα bookmarklets ή το Greasemonkey, αλλά θα υπάρχουν κι άλλοι. Πάντως με Delphi, C++, VB κ.λπ. δε νομίζω να καταφέρεις τίποτα, γιατί είναι υπόθεση scripting. Για να κατεβάσεις τον κώδικα μιας σελίδας προγραμματιστικά με Java ή JScript, μπορείς να δεις εδώ.
clairvoyant Δημοσ. 28 Απριλίου 2005 Μέλος Δημοσ. 28 Απριλίου 2005 Ομολογώ ότι μπερδεύτηκα. Η JavaScript είναι client-side γλώσσα, επομένως δε μπορεί να σε εμποδίσει να διαβάσεις τη σελίδα. Κατά πάσα πιθανότητα, έχεις δίκιο. Η σελίδα ναι μεν χρησιμοποιεί javascripts σε πολλά σημεία, όμως τελικά από πίσω χρησιμοποιεί και JSP, ή κάτι τέτοιο (δεν έχω ιδέα περί τίνος πρόκειται.. φαντάζομαι κάτι παρόμοιο με το ASP που επίσης δεν γνωρίζω). Οπότε, υποθέτω πάλι, δεν μου αρκεί και δεν με βοηθά το να πάρω τον κώδικα της σελίδας. Με ενδιαφέρει να παίρνω το τελικό αποτέλεσμα. Γι'αυτό μπόρεσα με τη Delphi, με λίγες γραμμές κώδικα, να λύσω το πρόβλημα μου: βάζω ένα Browser control, εμφανίζω κανονικά τη σελίδα, και έπειτα με μερικές κλήσεις έχω το κείμενο της το οποίο μπορώ να επεξεργαστώ. Αν, όμως, υπάρχει τρόπος να το κάνω αυτό σε Java, θα με βολέψει αρκετά περισσότερο καθώς θέλω να απαλλάξω πλήρως το χρήστη του προγράμματος από την ανάγκη να επισκέπτεται τη σελίδα μέσω ενός browser. Ευχαριστώ πάντως πολύ και για το παράδειγμα Java για τη λήψη κώδικα, θα μου χρειαστεί και αυτό αν τελικά υλοποιήσω το πρόγραμμα σε Java
GrMikeD Δημοσ. 28 Απριλίου 2005 Δημοσ. 28 Απριλίου 2005 apo edw: http://javaalmanac.com/egs/java.net/ReadFromURL.html?l=rel try { // Create a URL for the desired page URL url = new URL("http://hostname:80/index.html"); // Read all the text returned by the server BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); String str; while ((str = in.readLine()) != null) { // str is one line of text; readLine() strips the newline character(s) } in.close(); } catch (MalformedURLException e) { } catch (IOException e) { }
clairvoyant Δημοσ. 28 Απριλίου 2005 Μέλος Δημοσ. 28 Απριλίου 2005 apo edw:http://javaalmanac.com/egs/java.net/ReadFromURL.html?l=rel Δυστυχώς το δοκίμασα χθες βράδυ και κατεβάζει τον κώδικα της σελίδας, όχι το αποτέλεσμα. Εγώ προφανώς ζητάω κάτι σαν "text only html browser" (Lynx ένα πράγμα).. επειδή όμως δεν νομίζω κάτι τέτοιο να γίνεται με λίγες γραμμές κώδικα, μάλλον συνεχίζω με τη Delphi.
Skeftomilos Δημοσ. 28 Απριλίου 2005 Δημοσ. 28 Απριλίου 2005 Υποπτεύομαι ότι τα δεδομένα της σελίδας που σε ενδιαφέρει δεν βρίσκονται στον HTML κώδικα αλλά σε ένα συνοδευτικό αρχείο JavaScript (.js). Κάτι δηλαδή σαν αυτό: >var acronym_list = new Array() acronym_list.push("API;Application Programming Interface") acronym_list.push("COM;Component Object Model") acronym_list.push("ODBC;Open Database Connectivity") acronym_list.push("OLE;Object Linking and Embedding") Αν όντως συμβαίνει κάτι τέτοιο τότε πραγματικά η περίπτωσή σου είναι αξιοσημείωτη. Πάντως δεν πρέπει να είναι δύσκολο να αντλήσεις τις πληροφορίες που χρειάζεσαι από το script. Ένα αρχείο κειμένου είναι στο κάτω-κάτω. Αν πάλι οι πληροφορίες βρίσκονται εν μέρει σε JavaScript και εν μέρει σε HTML, κι αν επιπλέον προκύπτουν υπολογιστικά, τότε τα πράγματα είναι πιο δύσκολα. :-|
GrMikeD Δημοσ. 28 Απριλίου 2005 Δημοσ. 28 Απριλίου 2005 clairvoyant: ma den einai dunaton. Katebazei ton kwdika html pou einai idios me ton kwdika html pou dixnei o browser. Xreiazesai diladi kati pera apo auto? Gia pes ksana ti akrivws ennoeis gia na katalaboume.
clairvoyant Δημοσ. 29 Απριλίου 2005 Μέλος Δημοσ. 29 Απριλίου 2005 Σας μπέρδεψα έτσι; Λοιπόν σταμάτησα για λίγο τις ερωτήσεις, μέχρι να καταλάβω πλήρως πως λειτουργεί το site. Δεν θέλω να σας μπερδεύω χωρίς λόγο. Έχω όμως μια αρκετά σαφή ερώτηση: μήπως γνωρίζετε τρόπο να εκτελέσω μια εντολή Javascript που υπάρχει σε μια σελίδα; Για παράδειγμα, υπάρχει ένα κουμπί που έχει onClick event μια μέθοδο doSomething(). Υπάρχει τρόπος να καλέσω αυτή τη μέθοδο; Εννοώ προγραμματιστικά! :roll:
Skeftomilos Δημοσ. 29 Απριλίου 2005 Δημοσ. 29 Απριλίου 2005 Δηλαδή clairvoyant έχεις φορτώσει τη σελίδα στο browser και θέλεις να τρέξεις τη ρουτίνα doSomething() χωρίς να κάνεις κλικ στο κουμπί. Θέλεις ας πούμε να επιλέξεις ένα μενού του browser, να εμφανιστεί ένα message box, να γράψεις εκεί την εντολή doSomething() και ως εκ θαύματος να εκτελεστεί η εντολή στο φορτωμένη σελίδα, σαν να είχες πατήσει το κουμπί. Και περιμένεις δηλαδή από μένα να σου πω ότι κάτι τέτοιο γίνεται? Είμαστε σοβαροί? Κι όμως γίνεται! Φτιάξε μία σελιδούλα που να έχει το παρακάτω link: ><html> <body> <a href="javascript:eval(prompt('Γράψτε την εντολή:'))">Εκτέλεση εντολής</a> </body> </html> Τρέξε τη σελίδα και κάνε δεξί κλικ στο link. Αν έχεις Firefox επέλεξε "Bookmark this link", ενώ αν έχεις IE επέλεξε "Add to favorites". Μόλις έφτιαξες ένα bookmarklet! Φόρτωσε τώρα τη σελίδα που σε ενδιαφέρει και βρες στο μενού του browser (bookmarks ή favorites) το bookmarklet που έφτιαξες. Γράψε την εντολή που θέλεις να εκτελεστεί. Πάντως θα βοηθούσε να μας έδινες τη διεύθυνση της επίμαχης σελίδας για να την εξετάσουμε, για να μη μιλάμε στον αέρα. Εκτός κι αν είναι μυστικό οπότε πάσο. :-|
GrMikeD Δημοσ. 29 Απριλίου 2005 Δημοσ. 29 Απριλίου 2005 Gia Delphi: procedure ExecuteScript(Doc: IHTMLDocument2; Script: string; Language: String); var Win: IHTMLWindow2; Olelanguage: Olevariant; begin if Doc <> nil then try Win := Doc.ParentWindow; if Win <> nil then try Olelanguage := Language; Win.ExecScript(Script, Olelanguage); finally Win := nil; end; finally Doc := nil; end; end; procedure RunScript(JavaScript: String); var iDoc: IHTMLDocument2; Web: IWebBrowser2; begin WebBrowser.Document.QueryInterface(IHTMLDocument2, iDoc); ExecuteScript(iDoc, FJavaScript, 'javascript'); End; To FWebBrowser einai to component TWebBrowser pou xrisimopoeis. H metabliti FJavaScript einai o kwdikas javascript pou thes. Pigi: post apo tin Greek Delphi Programming List (http://groups.yahoo.com/group/Greek_Delphi_Prog/)
GrMikeD Δημοσ. 29 Απριλίου 2005 Δημοσ. 29 Απριλίου 2005 Episis, den xreiazetai na blepei o xristis to WebBrowser component. Ftiakse mia fora pou na to periexei kai na einai panta krumeni (visible = false).
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.