Как получить данные со страницы в Java, которая использует JavaScript для изменения страницы - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь создать приложение, которое вытягивает мой график работы из Интернета после его выпуска, поэтому мне не нужно каждый раз входить в систему, чтобы проверить его.Однако я натолкнулся на многочисленные проблемы на этом пути.Мне наконец-то удалось войти в систему с помощью JSoup, однако я должен открыть страницу расписания, чтобы увидеть фактическое расписание, и эта страница требует JavaScript для извлечения данных.

Я обнаружил правильный запрос XHR с помощью Chrome Dev Tools, однако, когдаЯ открываю его в Chrome, он возвращает 404, и когда я открываю его с помощью JSoup, он говорит, что не может обработать JSON, что я знаю.Однако я не знаю, как открыть его без JSoup.Я пытался использовать встроенные URL-адреса Java, но у меня возникли проблемы с переводом файлов cookie, чтобы он работал должным образом, и в результате получилось несколько случайных символов, которые, безусловно, не выводятся в консоль JSON.Я не могу использовать HtmlUnit, потому что я нахожусь на Android, и насколько я знаю, Selenedroid предназначен только для тестирования, или, если это не так, я не смог бы заставить его работать регулярно.

public void run() {
            try {
                System.out.println("LOG: STARTING:");
                Connection.Response resp = Jsoup.connect([home login page])
                        .timeout(30000)
                        .userAgent("Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) " +
                                "AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 " +
                                "Mobile/13B143 Safari/601.1")
                        .method(Connection.Method.GET)
                        .execute();

                System.out.println("LOG: CONNECTED:");

                Document responseDocument = resp.parse();
                FormElement form = (FormElement) responseDocument.select("form#frmLogin")
                        .first();

                Element usernameElement = responseDocument.select("[name$=USER]").first();
                Element passwordElement = responseDocument.select("[name$=password]").first();

                usernameElement.val(username);
                passwordElement.val(password);

                System.out.println("LOG: UPDATED FIELDS:");

                Connection.Response loginPageResponse = form.submit().method(Connection
                        .Method.POST)
                        .userAgent("Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) " +
                                "AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 " +
                                "Mobile/13B143 Safari/601.1")
                        .execute();

                System.out.println("LOG: SUBMITTED FORM:");

                String cookies = loginPageResponse.cookies().toString().substring(1, resp.cookies()
                        .toString().length() - 1).replace(",", ";");
/*
                System.out.println("cookie " + cookies);

                URL url = new URL([xhr request page I got from chrome dev tools]);
                HttpURLConnection con = (HttpURLConnection) url.openConnection();
                con.setDoOutput(true);
                con.setRequestProperty("Accept", "application/json");
                con.setRequestProperty("Accept-Encoding", "gzip, deflare, br");
                con.setRequestProperty("Accept-Language", "en-US,en;q=0.9");
                con.setRequestProperty("Connection", "keep-alive");
                con.setRequestProperty("Cookie", cookies);
                con.setRequestProperty("Host", [host I got from chrome dev tools]);
                con.setRequestProperty("Referer", [referer I got from chrome dev tools]);
                con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; " +
                        "x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 " +
                        "Safari/537.36");
                con.setRequestProperty("X-Requested-With", "XMLHttpRequest");
                con.connect();

                System.out.println(con.getURL());
                System.out.println(con.getResponseMessage());

                Scanner scanner = new Scanner(con.getInputStream());

                while (scanner.hasNextLine()) {
                    System.out.println(scanner.nextLine());
                }*/

                Connection.Response response = Jsoup.connect([xhr request page I got from chrome dev tools])
                        .header("Accept", "application/json")
                        .header("Accept-Encoding", "gzip, deflate, br")
                        .header("Accept-Language", "en-US,en;q=0.9")
                        .header("Connection", "keep-alive")
                        .header("Cookie", cookies)
                        .header("Host", [host I got from chrome dev tools])
                        .header("Referer", [referer I got from chrome dev tools])
                        .header("User-Agent", "Mozilla/5.0 (Windows NT 6.1) " +
                                "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 " +
                                "Safari/537.36")
                        .header("X-Requested-With", "XMLHttpRequest")
                        .execute();

                Scanner scanner = new Scanner(response.url().openConnection().getInputStream());

                while (scanner.hasNextLine()) {
                    System.out.println(scanner.nextLine());
                }

                System.out.println("LOG: END");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

Iожидайте, что вы либо откроете страницу расписания и правильно проанализируете HTML, либо вызовете JSON из запроса XHR и прочитаете его, чтобы вывести расписание.Вместо этого я не могу открыть ни один, потому что JSoup не принимает JSON

...