Benutzeragenten einer Java-URLConnection festlegen


79

Ich versuche, eine Webseite mit Java mit URLConnection zu analysieren. Ich versuche, den Benutzeragenten wie folgt einzurichten:

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

Der resultierende Benutzeragent ist jedoch der von mir angegebene, an dessen Ende "Java / 1.5.0_19" angehängt ist. Gibt es eine Möglichkeit, den Benutzeragenten ohne diesen Zusatz wirklich festzulegen?


Woher wissen Sie, dass dies der resultierende Benutzeragent ist? Wo siehst du es?
Skaffman

1
Durch Abrufen mit PHP und Anzeigen auf der Seite, die von Java erfasst wird.
DiglettPotato

Das funktioniert jetzt tatsächlich, siehe die zweite Antwort.
Rogerdpack

Antworten:


70

Wenn Sie die http.agentSystemeigenschaft so einstellen , ""dass sie den Trick macht (ich habe den Code nicht vor mir).

Sie könnten davonkommen mit:

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

Dies erfordert jedoch möglicherweise einen Wettlauf zwischen Ihnen und der Initialisierung des URL-Protokoll-Handlers, wenn der Wert beim Start zwischengespeichert wird (ich glaube nicht, dass dies der Fall ist).

Die Eigenschaft kann auch über JNLP-Dateien (verfügbar für Applets ab 6u10) und über die Befehlszeile festgelegt werden:

-Dhttp.agent=

Oder für Wrapper-Befehle:

-J-Dhttp.agent=

Wie würde ich das machen? c.setRequestProperty ("http.agent", "");? Ich
nehme an

1
Ja ... das funktioniert wie ein Zauber! Führen Sie einfach Folgendes aus: 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"); Und du bist bereit zu gehen !! :)
eduardo.lopes

94

Nur zur Verdeutlichung: Funktioniert setRequestProperty("User-Agent", "Mozilla ...")jetzt einwandfrei und wird java/xxam Ende nicht angehängt ! Zumindest mit Java 1.6.30 und neuer.

Ich habe auf meinem Computer mit netcat (einem Port-Listener) zugehört:

$ nc -l -p 8080

Es lauscht einfach auf dem Port, sodass Sie alles sehen, was angefordert wird, wie z. B. rohe http-Header.

Und bekam die folgenden http-Header ohne 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

Und MIT 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

Wie Sie sehen, wurde der Benutzeragent richtig eingestellt.

Vollständiges Beispiel:

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
Nun, wenn man noch Java 1.5 verwendet
Dejell

3
@Dejell Schlagen Sie vor, dass dieser Ansatz veraltet ist? Ich benutze Java 7 und das hat genau das getan, was ich wollte.
Shadoninja

5

Seine Arbeit für mich setzt den User-Agent in der 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");

Keine Notwendigkeit, in HttpURLConnection umzuwandeln.
Jechterhoff

1
@jechterhoff es ist in Java 8 erforderlich
FonzTech

@FonzTech Ich verstehe nicht, warum die Umwandlung in Java 8 erforderlich wäre. Folgendes funktioniert in meinem Programm (Konformität ist Java 1.8): URL clSourceUrl = neue 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"); Können Sie das bitte näher erläutern?
Jechterhoff

@jechterhoff der Benutzer, der die verwendete Antwort gegeben hat HttpURLConnection. Du hättest recht gehabt, wenn er es benutzt hätte URLConnection. Wenn Sie auf jeden Fall versuchen , diese Zeile zu kompilieren HttpURLConnection c = new URL("http://www.google.com").openConnection();zum Beispiel javacgibt Sie error: incompatible typesauf dieser Linie. Ich verwende Java 1.8.0 r172, also die neueste Version von Java 8
FonzTech

@FonzTech Ah, jetzt verstehe ich was du meinst. Ich hätte in meinem ersten Kommentar genauer sein sollen (Entschuldigung): Ich wollte damit sagen, dass Sie HttpURLConnection hier überhaupt nicht verwenden müssen. Anscheinend können Sie auch einfach eine URLConnection verwenden, wie in meinem vorherigen Kommentar gezeigt. Ich dachte, dass dies die Antwort ein wenig verbessern könnte. In jedem Fall haben Sie Recht, das HttpURLConnection c = new URL("http://www.google.com").openConnection();erfordert sicherlich eine Umwandlung in HttpURLConnection - in Java 8 und auch in früheren Versionen von Java.
Jechterhoff

2

HTTP-Server neigen dazu, alte Browser und Systeme abzulehnen.

Die Seite Tech Blog (wh): Die meisten gängigen Benutzeragenten spiegelt die Benutzeragenteneigenschaft Ihres aktuellen Browsers im Abschnitt "Ihr Benutzeragenten ist:" wider, mit der die Anforderungseigenschaft "Benutzeragenten" eines java.net.URLConnectionoder des Benutzers festgelegt werden kann Systemeigenschaft "http.agent".

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.