Ustawianie agenta użytkownika połączenia java URLConnection

80

Próbuję przeanalizować stronę internetową przy użyciu języka Java z usługą URLConnection. Próbuję ustawić klienta użytkownika w następujący sposób:

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");

Ale wynikowy agent użytkownika to ten, który podałem, z dopiskiem „Java / 1.5.0_19” na końcu. Czy istnieje sposób, aby naprawdę ustawić klienta użytkownika bez tego dodatku?

DiglettPotato
źródło
Skąd wiesz, że to wynikowy agent użytkownika? Gdzie to widzisz?
skaffman
1
Pobierając go za pomocą PHP i wyświetlając na stronie przechwytywanej przez Javę.
DiglettPotato
To faktycznie działa teraz, zobacz drugą odpowiedź.
rogerdpack

Odpowiedzi:

71

Od ręki, ustawienie http.agentwłaściwości systemu na ""może załatwić sprawę (nie mam przed sobą kodu).

Możesz uciec z:

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

ale może to wymagać wyścigu między tobą a inicjalizacją programu obsługi protokołu URL, jeśli buforuje wartość podczas uruchamiania (w rzeczywistości nie sądzę).

Właściwość można również ustawić za pomocą plików JNLP (dostępnych dla apletów od 6u10) oraz w wierszu poleceń:

-Dhttp.agent=

Lub dla poleceń opakowania:

-J-Dhttp.agent=
Tom Hawtin - haczyk
źródło
Jak miałbym to zrobić? c.setRequestProperty ("http.agent", "") ;? Zakładam gdzie indziej ...
DiglettPotato
1
tak ... to działa jak urok! po prostu wykonaj a: 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"); I jesteś gotowy do pracy !! :)
eduardo.lopes
94

Dla wyjaśnienia: setRequestProperty("User-Agent", "Mozilla ...")teraz działa dobrze i nie dodaje się java/xxna końcu! Przynajmniej z Javą 1.6.30 i nowszą.

Słuchałem na moim komputerze z netcatem (nasłuchiwaniem portów):

$ nc -l -p 8080

Po prostu nasłuchuje na porcie, więc widzisz wszystko, co jest żądane, na przykład surowe nagłówki http.

Otrzymano następujące nagłówki http bez 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

I Z 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

Jak widać, agent użytkownika został poprawnie ustawiony.

Pełny przykład:

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
źródło
2
Cóż, jeśli nadal używa się Javy 1.5
Dejell
3
@Dejell Czy sugerujesz, że to podejście jest przestarzałe? Używam Java 7 i zrobiło to dokładnie to, co chciałem.
Shadoninja
5

jego praca dla mnie ustawić User-Agent w 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
źródło
Nie ma potrzeby przesyłania do HttpURLConnection.
jechterhoff
1
@jechterhoff jest to wymagane w Javie 8
FonzTech
@FonzTech Nie rozumiem, dlaczego rzutowanie miałoby być wymagane w Javie 8. W moim programie działa (zgodność to Java 1.8): URL clSourceUrl = nowy 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”); Czy możesz to rozwinąć, proszę?
jechterhoff
@jechterhoff użytkownika, który udzielił użytej odpowiedzi HttpURLConnection. Miałbyś rację, gdyby użył URLConnection. W każdym razie, jeśli spróbujesz skompilować tę linię, HttpURLConnection c = new URL("http://www.google.com").openConnection();na przykład, javacpoda ci error: incompatible typestę linię. Używam Javy 1.8.0 r172, więc najnowsza wersja Java 8
FonzTech,
@FonzTech Ach, teraz rozumiem, co masz na myśli. Powinienem był być bardziej precyzyjny w swoim pierwszym komentarzu (przepraszam za to): Próbowałem powiedzieć, że w ogóle nie musisz tutaj używać HttpURLConnection. Najwyraźniej możesz również użyć połączenia URL, jak pokazano w moim poprzednim komentarzu. Pomyślałem, że to może trochę poprawić odpowiedź. W każdym razie masz rację, że z HttpURLConnection c = new URL("http://www.google.com").openConnection();pewnością wymaga rzutowania na HttpURLConnection - w Javie 8, a także we wcześniejszych wersjach Javy.
jechterhoff
2

Serwery HTTP zwykle odrzucają stare przeglądarki i systemy.

Strona Tech Blog (wh): Większość typowych agentów użytkownika odzwierciedla właściwość klienta użytkownika bieżącej przeglądarki w sekcji „Twój klient użytkownika to:” , którą można zastosować, aby ustawić właściwość żądania „User-Agent” a java.net.URLConnectionlub właściwość systemowa „http.agent”.

Sam Ginrich
źródło