Встановлення користувацького агента java URLConnection


80

Я намагаюся проаналізувати веб-сторінку за допомогою Java за допомогою URLConnection. Я намагаюся встановити користувальницький агент так:

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

Але результуючим користувальницьким агентом є той, який я вказую, з "Java / 1.5.0_19", доданим до кінця. Чи є спосіб по-справжньому встановити агент користувача без цього доповнення?


Звідки ви знаєте, що це результуючий користувацький агент? Де ви це бачите?
skaffman

1
Отримавши його за допомогою PHP і відобразивши на сторінці, яку захоплює Java.
DiglettPotato

Це насправді працює зараз, див. Другу відповідь.
rogerdpack

Відповіді:


71

З іншого боку, налаштування http.agentвластивості системи ""може зробити трюк (у мене немає коду перед собою).

Ви можете уникнути:

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

але для цього може знадобитися гонка між вами та ініціалізацією обробника протоколу URL, якщо він кешує значення під час запуску (насправді, я не думаю, що це так).

Властивість також можна встановити за допомогою файлів JNLP (доступних для аплетів з 6u10) та в командному рядку:

-Dhttp.agent=

Або для команд обгортки:

-J-Dhttp.agent=

Як би я це зробив? c.setRequestProperty ("http.agent", "") ;? Я припускаю десь ще ...
DiglettPotato

1
так ... це працює як шарм! просто виконайте: 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"); І ви готові до роботи !! :)
eduardo.lopes

94

Тільки для роз’яснення: setRequestProperty("User-Agent", "Mozilla ...")тепер працює чудово і не додається java/xxв кінці! Принаймні з Java 1.6.30 та новішою.

Я слухав на своїй машині з netcat (прослуховувач портів):

$ nc -l -p 8080

Він просто прослуховує порт, тому ви бачите все, що запитується, наприклад, необроблені http-заголовки.

І отримав такі http-заголовки без 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

І З 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

Як бачите, користувальницький агент був правильно встановлений.

Повний приклад:

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
Добре, якщо хтось все ще використовує Java 1.5
Dejell

3
@Dejell Ви припускаєте, що цей підхід застарів? Я використовую Java 7, і це зробило саме те, що я хотів.
Shadoninja

5

його робота для мене встановила User-Agent у 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");

Не потрібно перетворювати на HttpURLConnection.
jechterhoff,

1
@jechterhoff це потрібно в Java 8
FonzTech

@FonzTech Я не розумію, чому в Java 8 буде потрібний кастинг. У моїй програмі працює (відповідність Java 1.8): URL clSourceUrl = новий URL (clSource); URLConnection urlConn = clSourceUrl.openConnection (); urlConn.setRequestProperty ("Агент користувача", "Mozilla / 5.0 (Windows NT 6.1; Win64; x64; rv: 56.0) Gecko / 20100101 Firefox / 56.0"); Чи можете ви розказати, будь ласка?
jechterhoff

@jechterhoff користувач, який дав відповідь, використовував HttpURLConnection. Ви мали б рацію, якби він використовував URLConnection. У будь-якому випадку, якщо ви спробуєте скомпілювати цей рядок, HttpURLConnection c = new URL("http://www.google.com").openConnection();наприклад, javacдасть вамerror: incompatible types цей рядок. Я використовую Java 1.8.0 r172, тому найновіший випуск Java 8
FonzTech

@FonzTech Ах, тепер я розумію, що ти маєш на увазі. Я повинен був бути точнішим у своєму першому коментарі (вибачте за це): Я намагався сказати, що вам взагалі не потрібно використовувати HttpURLConnection тут. Очевидно, ви також можете просто використовувати URLConnection, як показано в моєму попередньому коментарі. Я думав, що це може трохи покращити відповідь. У будь-якому випадку, ви правіHttpURLConnection c = new URL("http://www.google.com").openConnection(); безумовно, вимагає прив’язки до HttpURLConnection - в Java 8, а також у попередніх версіях Java.
jechterhoff

2

Сервери HTTP, як правило, відкидають старі браузери та системи.

Сторінка Технічний блог (wh): Найпоширеніші агенти користувачів відображає властивість агента користувача вашого поточного браузера в розділі "Ваш агент користувача:" , який можна застосувати для встановлення властивості запиту "User-Agent" для java.net.URLConnectionабо властивість системи "http.agent".

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.