Definindo o agente do usuário de um java urlConnection
-
22-09-2019 - |
Pergunta
Estou tentando analisar uma página da web usando Java com UrlConnection. Eu tento configurar o agente de usuário assim:
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");
Mas o agente de usuário resultante é o que eu especificar, com "Java/1.5.0_19" anexado até o final. Existe uma maneira de realmente definir o agente do usuário sem essa adição?
Solução
Fora da mão, definindo o http.agent
propriedade do sistema para ""
Pode fazer o truque (não tenho o código na minha frente).
Você pode se safar:
System.setProperty("http.agent", "");
Mas isso pode exigir uma corrida entre você e a inicialização do manipulador de protocolo URL, se isso armazena em cache o valor na inicialização (na verdade, eu não acho que sim).
A propriedade também pode ser definida através de arquivos JNLP (disponíveis para applets de 6u10) e na linha de comando:
-Dhttp.agent=
Ou para comandos de wrapper:
-J-Dhttp.agent=
Outras dicas
Apenas para esclarecimento: setRequestProperty("User-Agent", "Mozilla ...")
agora funciona muito bem e não anexa java/xx
no final! Pelo menos com Java 1.6.30 e mais recente.
Ouvi na minha máquina com o NetCat (um ouvinte de porta):
$ nc -l -p 8080
Ele simplesmente ouve na porta, para que você veja qualquer coisa que seja solicitada, como cabeçalhos HTTP em bruto.
E obteve os seguintes cabeçudos HTTP sem o 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
E com o 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 você pode ver, o agente do usuário foi definido corretamente.
Exemplo 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());
}
}
seu trabalho para mimDefina o agente de usuário no 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");
Os servidores HTTP tendem a rejeitar navegadores e sistemas antigos.
A página Blog de tecnologia (WH): agentes de usuários mais comuns reflete a propriedade agente do usuário do seu navegador atual na seção "Seu agente do usuário é:", que pode ser aplicado para definir a propriedade de solicitação "agente de usuário" de um java.net.URLConnection
ou a propriedade do sistema "http.agent".