我正在尝试制作一个应用程序,以便在发布我的工作日程时将其从网上发布,因此我不必每次都登录才能对其进行检查。但是,我在此过程中偶然发现了多个问题。我终于设法使用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