Форум программистов, компьютерный форум, киберфорум
Java: Сети
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
Модератор
Эксперт Java
2558 / 1094 / 375
Регистрация: 11.08.2017
Сообщений: 3,332
1

Перестали работать запросы

29.09.2019, 17:04. Показов 1427. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Была программа которая качала модпаки, используя редиректы. Сейчас перестало работать, причем в браузере все работает. Привожу код:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLDecoder;
import javax.net.ssl.HttpsURLConnection;
 
public class TestDnw {
 
    public static void main(String[] args) {
        String projectID = "291874";
        String fileID = "2710586";
        String baseUrl = "https://www.curseforge.com/projects/" + projectID ;
        System.out.println("Base url: " + baseUrl);
        String projectUrl;
        try {
            projectUrl = getLocationHeader(baseUrl);
            System.out.println("Project url: " + projectUrl);
            projectUrl = projectUrl.replaceAll("\\?cookieTest=1", "");
            String fileDlUrl = projectUrl + "/download/" + fileID + "/file";
            System.out.println("FileDlUrl url: " + fileDlUrl);
            String finalUrl = getLocationHeader(fileDlUrl);
            System.out.println("Final url: " + finalUrl);
            String filename = new File(finalUrl).getName();
            filename = URLDecoder.decode(filename, "UTF-8");
            System.out.println("Mod name: " + filename);
            
        } catch (IOException | URISyntaxException e) {
            e.printStackTrace();
        }
    }
    
    static String getLocationHeader1(String location) throws IOException, URISyntaxException {
        HttpURLConnection con = (HttpURLConnection)(new URL(location).openConnection());
        con.setInstanceFollowRedirects(false);
        con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2");
        con.connect();
        int responseCode = con.getResponseCode();
        System.out.println(responseCode);
        String loc = con.getHeaderField("Location");
        return loc;
    }
    
    static String getLocationHeader2(String location) throws IOException, URISyntaxException {
        URLConnection con = new URL(location).openConnection();
        System.out.println("orignal url: " + con.getURL());
        con.connect();
        InputStream is = con.getInputStream();
        is.close();
        return con.getURL().toString();
    }
    
    public static String getLocationHeader(String location) throws IOException, URISyntaxException {
        URI uri = new URI(location);
        HttpsURLConnection connection = null;
        String userAgent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/53.0.2785.143 Chrome/53.0.2785.143 Safari/537.36";
        for (; ; ) {
            URL url = uri.toURL();
            connection = (HttpsURLConnection) url.openConnection();
            connection.setRequestProperty("User-Agent", userAgent);
            connection.setInstanceFollowRedirects(false);
            String redirectLocation = connection.getHeaderField("Location");
            if (redirectLocation == null)
                break;
 
            if (redirectLocation.startsWith("/"))
                uri = new URI(uri.getScheme(), uri.getHost(), redirectLocation, uri.getFragment());
            else {
                try {
                    uri = new URI(redirectLocation);
                } catch (URISyntaxException e) {
                    url = new URL(redirectLocation);
                    uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef());
                }
            }
        }
 
        return uri.toString();
    }
}
Раньше работал getLocationHeader а теперь он возвращает тот же адрес что и получил. Сейчас написал варианты getLocationHeader1 и getLocationHeader2 но они возвращают 403 код (знаю что означает). Но если открывать последовательность ссылок через браузер то все работает без проблем.
Как исправить?
Последовательность ссылок такая:
первый редирект
https://www.curseforge.com/projects/291874 -> https://www.curseforge.com/min... ne-seasons
https://www.curseforge.com/min... ne-seasons -> https://www.curseforge.com/min... 10586/file
второй редирект
https://www.curseforge.com/min... 10586/file -> https://media.forgecdn.net/fil... versal.jar
А программа выдает
Base url: https://www.curseforge.com/projects/291874
Project url: https://www.curseforge.com/projects/291874
FileDlUrl url: https://www.curseforge.com/pro... 10586/file
Final url: https://www.curseforge.com/pro... 10586/file
Mod name: file
Качать надо по цифровым айди, так как это была качалка по списку пар id проекта и файла
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.09.2019, 17:04
Ответы с готовыми решениями:

Поставил SP5 на VB 6.0 и SQL запросы перестали работать!
Прошу Вас, пожалуйста помогите разобраться с такой проблемой Имея проект на VB6.0, поставил SP5...

Перестали работать GET запросы из Python к бирже Bittrex
Всех приветствую. Возникла неожиданная проблема. Работал скрипт, забирал и отправлял данные с...

Запросы на API сайта из приложения перестали работать после перехода на https
Здравствуйте. Нужна помощь по приложению. После того как сайт переехал с http на https, обращения к...

Перестали работать клавиши F1-F4
Здравствуйте. Imac 2011г. Некоторое время назад перестали работать клавиши F1-F4 - регулировки...

4
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
29.09.2019, 18:22 2
Устанавливает фиддлер, смотришь какие уходят запросы, обращаешь внимание на заголовки и куки. Делаешь такие же запросы у себя в коде. Если не работает - берешь свой запрос и сравниваешь с тем, который должен быть. Запросы удобно слать Apache http components, оно вроде само по редиректам ходит
0
Модератор
Эксперт Java
2558 / 1094 / 375
Регистрация: 11.08.2017
Сообщений: 3,332
29.09.2019, 21:21  [ТС] 3
Спасибо, завтра попробую и отпишусь. Мне по сути переход по редиректу и не нужен особо, ведь если получаю один из 300 кодов то достаточно взять адрес из поля "Location". Метод setInstanceFollowRedirects(false) как раз и отключает переход, но не работает и с и без.
Apache http пытался пробовать, особо не вникал, но простейшие примеры из сети тоже дают 403 код, да и зависимостей набирается прилично при его использовании. Я пробовал Apache HttpClient, но он еще не работает без commons-codec, commons-logging и httpcore. Имхо ради простых http запросов тянуть 4 бибилиотеки и почти 1.5мб перебор, хотя codec и так использую, но все же.
0
Модератор
Эксперт Java
2558 / 1094 / 375
Регистрация: 11.08.2017
Сообщений: 3,332
30.09.2019, 11:14  [ТС] 4
Попробовал я этот фиддлер, если не декриптовать https трафик то в колонке host написано Tunnel to, а в заголовках включите HTTPS decryption. Поставил сертификат программы, включил в настройках. В итоге в браузере получаю Error 1020 Access denied. Зато в фиддлере куда больше строчек, но увы все ведущие на страницу ошибки.
То есть сначала к сайту выходит CONNECT www.curseforge.com:443 HTTP/1.1
а потом только GET /projects/291874 HTTP/1.1
То есть то чего я и боялся. У меня не выходит создать ssl тунель к сайту без которого сайт меня посылает. Или я чего то не до конца понимаю? Как создать в яве подключение через https?
Пробую сначала CONNECT www.curseforge.com:443 но получаю 400 ошибку
0
Модератор
Эксперт Java
2558 / 1094 / 375
Регистрация: 11.08.2017
Сообщений: 3,332
30.09.2019, 22:57  [ТС] 5
Поставил плагин для браузера HTTP Header Live на firefox, там получил такие заголовки:
Кликните здесь для просмотра всего текста
https://www.curseforge.com/projects/291874
Host: www.curseforge.com
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:69.0) Gecko/20100101 Firefox/69.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate, br
DNT: 1
Connection: keep-alive
Upgrade-Insecure-Requests: 1

GET: HTTP/2.0 301 Moved Permanently
date: Mon, 30 Sep 2019 19:39:41 GMT
content-length: 0
cache-control: private
location: https://www.curseforge.com/min... ne-seasons
x-aspnetmvc-version: 5.2
x-aspnet-version: 4.0.30319
x-ua-compatible: IE=edge,chrome=1
x-frame-options: SAMEORIGIN, SAMEORIGIN
strict-transport-security: max-age=15768000
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
set-cookie: __cfduid=d0bfd7dfd18f7e4da1660c0b32a94ffbc1569872381; expires=Tue, 29-Sep-20 19:39:41 GMT; path=/; domain=.curseforge.com; HttpOnly
AWSALB=PX1XVtW0YNq6otkPkj8oQXAPiCWPF0htKD0zJ4LssvRLt2xfKKTE/k2WYFKWKIaJQ1RKST2t5kaDtEKpKA5EqtK2HU3kEsDGN41IaiSTOZB01RRCwRI58e/42lEB; Expires=Mon, 07 Oct 2019 19:39:41 GMT; Path=/
Unique_ID_v2=afe11d48d31f433fbbcb892c58d6fc88; domain=.curseforge.com; expires=Sun, 30-Sep-2029 19:39:41 GMT; path=/
__cf_bm=fdb18673acf039298524845407e99dcb257fe507-1569872381-1800-AcvNq0R5mCR4AxtkMLHLdf+VJFqvhJI3hw9pFN6zw4Oe8hCoXnQIvAS4Xpz3vi0haZb4JBT0sHaDboui 8GRecQo=; path=/; expires=Mon, 30-Sep-19 20:09:41 GMT; domain=.curseforge.com; HttpOnly
server: cloudflare
cf-ray: 51e8aa0f2fbd4ed6-DME
X-Firefox-Spdy: h2

Как понимаю это заголовок запроса + заголовок ответа, как раз то что мне нужно. Повторил в коде вот так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
String url  = "https://www.curseforge.com/projects/291874";
        try {
        URLConnection con1 = new URL(url).openConnection();
        con1.setRequestProperty("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:69.0) Gecko/20100101 Firefox/69.0");
        con1.setRequestProperty("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        con1.setRequestProperty("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3");
        con1.setRequestProperty("Accept-Encoding", "gzip, deflate, br");
        con1.setRequestProperty("DNT", "1");
        con1.setRequestProperty("Connection", "keep-alive");
        con1.setRequestProperty("Upgrade-Insecure-Requests", "1");
        con1.connect();
        con1.getInputStream();
        } catch (IOException e) {
            e.printStackTrace();
Но все равно получаю 403 код в исключении. Хотя из 301 кода ответа как раз можно получить все что нужно (поле location содержит искомый адрес).
Параметр set-cookie на сколько понимаю нужен только чтобы открыть страницу после редиректа, но это не нужно.
Я в тупике что делать дальше...
0
30.09.2019, 22:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.09.2019, 22:57
Помогаю со студенческими работами здесь

Перестали работать кнопки
Перестали работать кнопки: R, T, F, G, V, B и цифры 4, 5. Расположены кнопки в 2 столбца....

Перестали работать браузеры
Здравствуйте! Какое-то время назад перестали работать браузеры и грузиться обновления. При этом...

Перестали работать браузеры
Помогите, пожалуйста! Как будто мор на браузеры напал: первым отказалась работать Mozila, пишет...

Компиляторы Си++ перестали работать
у меня уже 3 компилятора и не 1н из них неработает каждый по своей причине CodeBlocks не запускает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru