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?


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=

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());
    }

}

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

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”.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.