如何从使用JavaScript修改页面的Java页面中获取数据

时间:2019-02-08 17:05:39

标签: android forms cookies xmlhttprequest jsoup

我正在尝试制作一个应用程序,以便在发布我的工作日程时将其从网上发布,因此我不必每次都登录才能对其进行检查。但是,我在此过程中偶然发现了多个问题。我终于设法使用JSoup登录了,但是我必须打开计划页面以查看实际的计划,并且该页面需要JavaScript才能获取数据。

我已经使用Chrome开发工具找到了正确的XHR请求,但是当我在Chrome中打开它时,它会返回404,而当我使用JSoup打开它时,它说它无法处理JSON,据我所知。但是我不知道如何在没有JSoup的情况下打开它。 我曾尝试使用内置的Java URL,但在翻译Cookies时遇到麻烦,使其无法正常工作,最终导致一堆随机字符(绝对不是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();
            }
        }

我希望要么调出计划页面并正确解析HTML,要么调出XHR请求中的JSON并阅读以调出计划。 相反,我无法打开两者,因为JSoup不采用JSON

0 个答案:

没有答案