#java #url #httpsurlconnection
#java #url #httpsurlconnection
Вопрос:
Я хочу получить Content Length
этот файл с помощью Java:
https://www.subf2m.co/subtitles/farsi_persian-text/SImp4fRrRnBK6j-u2RiPdXSsHSuGVCDLz4XZQLh05FnYmw92n7DZP6KqbHhwp6gfvrxazMManmskHql6va6XEfasUDxGevFRmkWJLjCzsCK50w1lwNajPoMGPTy9ebCC0amp;name=Q2FwdGFpbiBNYXJ2ZWwgRmFyc2lQZXJzaWFuIGhlYXJpbmcgaW1wYWlyZWQgc3VidGl0bGUgLSBTdWJmMm0gW3N1YmYybS5jb10uemlw
Когда я вставляю этот URL в Firefox
или Google Chrome
, он загружает файл. но когда я хочу увидеть размер этого файла по Java HttpsURlConnection
, сервер возвращает мне Response Code 403
и Content Length -1
. почему это происходит? Спасибо
try {
System.out.println("program started -----------------------------------------");
String str_url = "https://www.subf2m.co/subtitles/farsi_persian-text/SImp4fRrRnBK6j-u2RiPdXSsHSuGVCDLz4XZQLh05FnYmw92n7DZP6KqbHhwp6gfvrxazMManmskHql6va6XEfasUDxGevFRmkWJLjCzsCK50w1lwNajPoMGPTy9ebCC0amp;name=Q2FwdGFpbiBNYXJ2ZWwgRmFyc2lQZXJzaWFuIGhlYXJpbmcgaW1wYWlyZWQgc3VidGl0bGUgLSBTdWJmMm0gW3N1YmYybS5jb10uemlw";
URL url = new URL(str_url);
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
con.setConnectTimeout(150000);
con.setReadTimeout(150000);
con.setRequestMethod("HEAD");
con.setInstanceFollowRedirects(false);
con.setRequestProperty("Accept-Encoding", "identity");
con.setRequestProperty("connection", "close");
con.connect();
System.out.println("responseCode: " con.getResponseCode());
System.out.println("contentLength: " con.getContentLength());
} catch (IOException e) {
System.out.println("error | " e.toString());
e.printStackTrace();
}
вывод:
program started -----------------------------------------
responseCode: 403
contentLength: -1
Комментарии:
1. Ну, 403 означает » запрещено «. Итак, очевидно, что-то в запросе, который вы делаете, означает, что сервер отказывается разрешить вам доступ к нему. Если вы посмотрите на код дополнительного состояния, он может предоставить больше информации.
2. Я только что попытался получить доступ к этому URL, и, похоже, происходит некоторая проверка браузера. Я предполагаю, что, возможно, существует какой-то процесс SSL или рукопожатия, который должен произойти, и это не происходит из вашего Java-кода.
Ответ №1:
Пользовательский агент Java по умолчанию заблокирован некоторыми онлайн-сервисами (в первую очередь, Cloudflare). Вам нужно установить User-Agent
заголовок на что-то другое.
con.setRequestProperty("User-Agent", "My-User-Agent");
По моему опыту, не имеет значения, что вы для него установили, если это не значение по умолчанию:
con.setRequestProperty("User-Agent", "aaa"); // works perfectly fine
РЕДАКТИРОВАТЬ: похоже, что этот сайт использует Cloudflare с активной защитой от DDoS — ваш код не будет запускать вызов JavaScript, необходимый для фактического получения содержимого файла.