Configuración del agente de usuario de una URLConnection java

80

Estoy tratando de analizar una página web usando Java con URLConnection. Intento configurar el agente de usuario de esta manera:

java.net.URLConnection c = url.openConnection();
c.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2");

Pero el agente de usuario resultante es el que especifico, con "Java / 1.5.0_19" adjunto al final. ¿Hay alguna forma de configurar realmente el agente de usuario sin esta adición?

DiglettPotato
fuente
¿Cómo sabe que es el usuario-agente resultante? ¿Dónde lo estás viendo?
skaffman
1
Obteniéndolo con PHP y mostrándolo en la página que está siendo capturada por Java.
DiglettPotato
Esto realmente funciona ahora, vea la segunda respuesta.
rogerdpack

Respuestas:

71

De forma indirecta, configurar la http.agentpropiedad del sistema en ""podría funcionar (no tengo el código frente a mí).

Puede salirse con la suya:

 System.setProperty("http.agent", "");

pero eso podría requerir una carrera entre usted y la inicialización del controlador del protocolo URL, si almacena en caché el valor al inicio (en realidad, no creo que lo haga).

La propiedad también se puede configurar a través de archivos JNLP (disponibles para applets de 6u10) y en la línea de comando:

-Dhttp.agent=

O para los comandos de envoltura:

-J-Dhttp.agent=
Tom Hawtin - tackline
fuente
¿Como podría hacerlo? c.setRequestProperty ("http.agent", "") ;? Supongo que en otro lugar ...
DiglettPotato
1
si ... eso funciona como un encanto! simplemente haga un: System.setProperty ("http.agent", "Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv: 1.9.2.2) Gecko / 20100316 Firefox / 3.6.2"); ¡¡Y estás listo para empezar !! :)
eduardo.lopes
94

Solo para aclarar: ¡ setRequestProperty("User-Agent", "Mozilla ...")ahora funciona bien y no se adjunta java/xxal final! Al menos con Java 1.6.30 y versiones posteriores.

Escuché en mi máquina con netcat (un oyente de puerto):

$ nc -l -p 8080

Simplemente escucha en el puerto, por lo que ve todo lo que se solicita, como encabezados http sin procesar.

Y obtuve los siguientes encabezados http sin setRequestProperty:

GET /foobar HTTP/1.1
User-Agent: Java/1.6.0_30
Host: localhost:8080
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive

Y CON setRequestProperty:

GET /foobar HTTP/1.1
User-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2
Host: localhost:8080
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive

Como puede ver, el agente de usuario se configuró correctamente.

Ejemplo completo:

import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;


public class TestUrlOpener {

    public static void main(String[] args) throws IOException {
        URL url = new URL("http://localhost:8080/foobar");
        URLConnection hc = url.openConnection();
        hc.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; en-US; rv:1.9.2.2) Gecko/20100316 Firefox/3.6.2");

        System.out.println(hc.getContentType());
    }

}
juwens
fuente
2
Bueno, si todavía se usa Java 1.5
Dejell
3
@Dejell ¿Estás sugiriendo que este enfoque está desactualizado? Estoy usando Java 7 y esto hizo exactamente lo que quería que hiciera.
Shadoninja
5

su trabajo para mí establece el agente de usuario en el addRequestProperty.

URL url = new URL(<URL>);
HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
httpConn.addRequestProperty("User-Agent","Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0");
Bachan Joseph
fuente
No es necesario transmitir a HttpURLConnection.
jechterhoff
1
@jechterhoff es necesario en Java 8
FonzTech
@FonzTech No veo por qué se requeriría la transmisión en Java 8. Lo siguiente funciona en mi programa (el cumplimiento es Java 1.8): URL clSourceUrl = nueva URL (clSource); URLConnection urlConn = clSourceUrl.openConnection (); urlConn.setRequestProperty ("User-Agent", "Mozilla / 5.0 (Windows NT 6.1; Win64; x64; rv: 56.0) Gecko / 20100101 Firefox / 56.0"); ¿Puedes dar más detalles, por favor?
jechterhoff
@jechterhoff el usuario que dio la respuesta utilizada HttpURLConnection. Habrías tenido razón si lo hubiera usado URLConnection. De todos modos, si intenta compilar esta línea HttpURLConnection c = new URL("http://www.google.com").openConnection();por ejemplo, javacle dará error: incompatible typesen esa línea. Estoy usando Java 1.8.0 r172, por lo que la versión más reciente de Java 8
FonzTech
@FonzTech Ah, ahora veo lo que quieres decir. Debería haber sido más preciso en mi primer comentario (lo siento por eso): Lo que estaba tratando de decir es que no necesita usar HttpURLConnection en absoluto aquí. Aparentemente, también puede usar una URLConnection, como se muestra en mi comentario anterior. Pensé que esto podría mejorar un poquito la respuesta. En cualquier caso, tiene razón en que HttpURLConnection c = new URL("http://www.google.com").openConnection();ciertamente requiere una conversión a HttpURLConnection, en Java 8 y también en versiones anteriores de Java.
jechterhoff
2

Los servidores HTTP tienden a rechazar los navegadores y sistemas antiguos.

La página Tech Blog (wh): Agentes de usuario más comunes refleja la propiedad de agente de usuario de su navegador actual en la sección "Su agente de usuario es:" , que se puede aplicar para establecer la propiedad de solicitud "Agente de usuario" de java.net.URLConnectionao el propiedad del sistema "http.agent".

Sam Ginrich
fuente