Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - Octsam

#1
Con los objetos WebEngine de JavaFX, es posible interactuar con una página web y extraer sus datos. Pero si son actualizados con mucha frecuencia, recargar la página para obtener el código HTML actualizado o revisar cada nodo para saber cuál ha cambiado, es ineficiente. Por ello, y debido a que las peticiones y respuestas HTTP suelen ser hechas con JQuery, probé a ver las respuestas del servidor añadiendo en la consola del navegador el código javascript:


$(document).ajaxSuccess(function(event, xhr, settings){ alert(xhr.responseText); });


Y tras comprobar que funciona en el navegador, quise incluirlo en Java escribiendo el código siguiente:


import javafx.application.Application;
import javafx.beans.value.*;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.web.WebEngine;
import javafx.stage.Stage;
//import javafx.concurrent.Worker.State;
import org.w3c.dom.Document;
import netscape.javascript.JSObject;

@SuppressWarnings("restriction")
public class Captura extends Application{

       public static void main(String[] args) { launch(args); }

       @Override
       public void start(Stage escenario){
               final TextArea área_texto = new TextArea();
               área_texto.setEditable(false);
               
               // 'ingenio' será el objeto que conecta con "webkit" para operar con HTML, javascript y CSS.
               final WebEngine ingenio = new WebEngine();
               
               // 'ventana' es el objeto que permite conectar javascript con Java.
               final JSObject ventana = (JSObject)ingenio.executeScript("window");
               
               // Esto establece el vínculo entre "jHelper" en javascript y "JavaHelper" en Java.
               ventana.setMember("jHelper", new JavaHelper(área_texto));
               
               // Esta estructura supuestamente es para ser ejecutada al cargar la página web, pero
               // no entiendo bien esta parte.
               ingenio.documentProperty().addListener(new ChangeListener<Document>(){
                       @Override
                       public void changed(ObservableValue<? extends Document> observable, Document oldDoc, Document newDoc){
                               // Esto pondrá en la ventana el código inicial HTML.
                               área_texto.setText((String)ingenio.executeScript("document.documentElement.innerHTML"));

                               // Esto es para comprobar si al ejecutar el código, realmente es alcanzada esta parte,
                               // algo que muchas veces no ocurre.
                               System.out.println("Llegué.");
                               
                               // Esto capturará el tráfico HTTP con javascript.
                              ingenio.executeScript("$(document).ajaxSuccess(function(event, xhr, settings){ jHelper.respuesta(xhr.responseText); });");
                       }
               });
               
                ingenio.load("http://www.sportium.es");
               escenario.setScene(new Scene(área_texto, 800, 600));
               escenario.show();
       }
       
       
       // Esta clase servirá para llamar a Java desde javascript.
       public static class JavaHelper{
               // 'área_texto' será el objeto donde será mostrado el código HTML inicial, y las
               // respuestas capturadas.
               final TextArea área_texto;
               // 'cont' indicará el número de respuestas que han sido capturadas y mostradas.
               private int cont =  0;
               
               public JavaHelper(TextArea área_texto){
                       this.área_texto = área_texto;
               }
               
               // 'texto' contendrá el mensaje de respuesta del servidor.
               public void respuesta(String texto){
                       ++cont;
                       área_texto.setText("\n"+cont+":\n"+texto);
               }
       }
}


Lo curioso es que unas veces es abierta una ventana y se queda en blanco, otras aparece el código HTML inicial y se queda así, y otras presenta el código y lo cambia por la primera respuesta del servidor, y se queda así también. Necesito

Lo que necesito saber es porqué no me funciona como en el navegador, captando sólo la respuesta primera en el mejor de los casos, y cómo corregirlo, pues no sé cómo resolverlo.


#2
Java / Acceso restringido a librerías de Java
18 Julio 2016, 13:14 PM
Hola a todos. Yo quería implementar mi propia clase de Java, reescribiendo la clase HttpUrlConnection de Java, pero en la parte:

 import sun.net.www.http.HttpClient;
 import sun.net.www.http.PosterOutputStream;
 import sun.net.www.http.ChunkedInputStream;
 import sun.net.www.http.ChunkedOutputStream;



En cada una de las líneas aparece un subrayado rojo sinuoso indicando un error, con unos mensajes asociados los cuales son respectivamente:

Citar
     Access restriction: The type 'HttpClient' is not API (restriction on required library 'C:\Program Files\Java\jdk1.8.0_91\jre\lib\rt.jar')
     
     Access restriction: The type 'PosterOutputStream' is not API (restriction on required library 'C:\Program Files\Java\jdk1.8.0_91\jre\lib\rt.jar')
     
     Access restriction: The type 'ChunkedInputStream' is not API (restriction on required library 'C:\Program Files\Java\jdk1.8.0_91\jre\lib\rt.jar')

     Access restriction: The type 'ChunkedOutputStream' is not API (restriction on required library 'C:\Program Files\Java\jdk1.8.0_91\jre\lib\rt.jar')


Por ello tengo varias preguntas, que me intrigan desde hace mucho tiempo:

  1) ¿Cómo pueden restringir el acceso a una librería, aunque sea utilizado por el lenguaje en otras clases predefinidas, que sí puedo utilizar?

  2) ¿Podría restringir el uso de una clase hecha por mí?

  3) ¿Puedo utilizar de algún modo tales clases restringidas, en una clase hecha por mí?


Y gracias por vuestra atención.


Bueno. Parece que no gustó mucho el problema que propuse, y cuya solución hallé al menos en parte.

En acceso restringido a ciertas librerías, es una limitación de configuración del entorno de desarrollo, que puede ser eliminada. Para hacerlo en eclipse, hay que hacer clic con el botón derecho del ratón sobre la carpeta del proyecto, para desplegar el menú contextual,  ir a Propiedades --> Java Compiler --> Error/Warnings --> Deprecated and restricted API; y en la lista asociada a la línea que pone "Forbidden reference (access rules)", cambiar la opción "Error" por cualquier otra.

"Java compiler" es una opción de una lista, que tiene una sublista que hay que desplegar para acceder a "Error/Warnings".
"Deprecated and restricted API" es una opción de una lista, sobre la que hay que hacer clic para desplegar su cuadro de opciones, pero como la que está desplegada por defecto es la opción primera, que es de contenido extenso, puede parecer que no está.

Entonces, respondiendo a cada una de las cosas que pregunté:

1) Programando el entorno de desarrollo para que considere ciertas clases restringidas.

2) El entorno de desarrollo no da la opción de decidir cuáles son las clases restringidas, por lo que no, a menos que sea modificado el código fuente del entorno para ello, y serviría para el nuevo entorno de programación solamente.

3) Sí, como ya he indicado.


Me olvidé de un detalle: la lista de opciones asociado a "Error/Warnings" está desactivada, y hay que activarloa marcando la casilla superior de la ventana, que pone "Enable project specific settings".

MOD EDIT: No hacer doble post.
#3

Hola a todos. Quería saber qué información tiene el proveedor de internet (ISP), acerca de un usuario y su equipo en dos casos. El primero es que:

1) Utilice Tor.
2) Tenga mantenga javascript en el navegador y la descarga de cookies.
3) No introduzco en alguna página web algún dato privado.

El segundo caso es que:

1) Utilice un navegador común.
2) Tenga mantenga javascript en el navegador y la descarga de cookies.
3) No introduzco en alguna página web algún dato privado.

En particular quiero saber si el proveedor de internet puede saber qué ordenador utilizo, qué sistema operativo utilizo, qué sesión de usuario, la Mac Address de mi tarjeta de red wifi.
Sé que las cabeceras de petición del navegador identifican el navegador utilizado, y el sistema operativo: si es Windows, Linux o Mac; pero no la versión específica de éste, o eso creo. Y también sé que sabe la Mac Address de mi router.

He buscado en internet, y no he obtenido alguna información clara al respecto. Si alguien me ayuda, gracias por responder.

#4
Programación C/C++ / Web scrape
19 Febrero 2014, 13:16 PM
¡Hola! Quería preguntar si alguien sabe cómo seleccionar y pegar con C++, el contenido de una página web como cuando es hecho con el ratón, no recurriendo a la lectura directa de su código fuente en "html", y sin necesidad de tener abierto el navegador.
Necesito hacerlo porque necesito descargar los datos en tiempo real, de las cotizaciones de las empresas de la página web de "http://www2.ecobolsa.com", las cuales son obtenidas mediante código de javascript; por lo que supongo que habría que captar y procesar el tráfico de datos http, pero no tengo idea de cómo hacerlo. En varios sitios de internet hablan del "web scrappe", pero en ninguno he hallado alguna información útil para poder hacerlo yo. Si alguien puede ayudarme, le doy las gracias por anticipado. :)
#5
Ingeniería Inversa / Web scrape
18 Febrero 2014, 23:21 PM
¡Hola! Quería preguntar si alguien sabe cómo seleccionar y pegar con C++, el contenido de una página web como cuando es hecho con el ratón, no recurriendo a la lectura directa de su código fuente en "html", y sin necesidad de tener abierto el navegador.
Necesito hacerlo porque necesito descargar los datos en tiempo real, de las cotizaciones de las empresas de la página web de "http://www2.ecobolsa.com", las cuales son obtenidas mediante código de javascript; por lo que supongo que habría que captar y procesar el tráfico de datos http, pero no tengo idea de cómo hacerlo. En varios sitios de internet hablan del "web scrapping", pero en ninguno he hallado alguna información útil para poder hacerlo yo. Si alguien puede ayudarme, le doy las gracias por anticipado. :)