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?
java
user-agent
DiglettPotato
źródło
źródło
Odpowiedzi:
Od ręki, ustawienie
http.agent
wł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ń:
Lub dla poleceń opakowania:
źródło
Dla wyjaśnienia:
setRequestProperty("User-Agent", "Mozilla ...")
teraz działa dobrze i nie dodaje sięjava/xx
na 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()); } }
źródło
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");
źródło
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,javac
poda cierror: incompatible types
tę linię. Używam Javy 1.8.0 r172, więc najnowsza wersja Java 8HttpURLConnection 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.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.URLConnection
lub właściwość systemowa „http.agent”.źródło