Java 解析booking.uz.gov.ua网站

Java 解析booking.uz.gov.ua网站,java,html,json,parsing,Java,Html,Json,Parsing,此代码从booking.uz.gov.ua网站解析。但出于某种原因,他不想工作。谁能证明为什么不起作用,或修复它? 谁能提出建议 线程“main”java.lang.ArrayIndexOutOfBoundsException中出现异常:0 网址:ua.gov.uz.booking.uz.main(uz.java:137) 包ua.gov.uz.booking; 导入javax.script.ScriptEngine; 导入javax.script.ScriptEngineManager; 导入

此代码从booking.uz.gov.ua网站解析。但出于某种原因,他不想工作。谁能证明为什么不起作用,或修复它? 谁能提出建议

线程“main”java.lang.ArrayIndexOutOfBoundsException中出现异常:0 网址:ua.gov.uz.booking.uz.main(uz.java:137)

包ua.gov.uz.booking;
导入javax.script.ScriptEngine;
导入javax.script.ScriptEngineManager;
导入javax.script.ScriptException;
导入java.io.BufferedReader;
导入java.io.DataOutputStream;
导入java.io.InputStreamReader;
导入java.net.HttpURLConnection;
导入java.net.URL;
导入java.text.MessageFormat;
导入java.text.simpleDataFormat;
导入java.util.Date;
导入java.util.List;
导入java.util.Map;
导入java.util.regex.Matcher;
导入java.util.regex.Pattern;
公共类uz{
静态字符串html=“”;
静态字符串cookie=“”;
静态字符串标记=”;
静态字符串错误=”;
静态映射头=null;
静态void fetchHtml(){
试一试{
URL=新URL(“http://booking.uz.gov.ua/");
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setRequestMethod(“GET”);
BufferedReader rd=新的BufferedReader(新的InputStreamReader(conn.getInputStream());
headers=conn.getHeaderFields();
弦线;
而((line=rd.readLine())!=null){
html+=行;
}
rd.close();
}捕获(例外e){
错误=e.getMessage();
}
}
静态void parseCookie(){
List cookies=headers.get(“Set Cookie”);
for(字符串当前\u cookie:cookies){
if(当前cookie.startsWith(“\u gv\u sessiond”)){
cookie=当前的\u cookie;
打破
}
}
}
静态void parseToken(){
String adapter=“var-token;localStorage={setItem:function(key,value){if(key==='gv-token')token=value}};”;
Pattern Pattern=Pattern.compile(“\$\$”=.*~\[\\];.*\“\”)\\(\\)\\)\(\\);”;
Matcher Matcher=pattern.Matcher(html);
if(matcher.find()){
字符串模糊化=matcher.group(0);
ScriptEngineManager工厂=新ScriptEngineManager();
ScriptEngine=factory.getEngineByName(“JavaScript”);
试一试{
发动机评估(适配器+模糊);
}捕获(脚本异常){
错误=e.getMessage();
}
token=engine.get(“token”).toString();
}
}
静态字符串getStationId(字符串名称){
字符串json=“”;
试一试{
URL=新URL(“http://booking.uz.gov.ua/en/purchase/station/“+名称+”/”;
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setRequestMethod(“GET”);
BufferedReader rd=新的BufferedReader(新的InputStreamReader(conn.getInputStream());
弦线;
而((line=rd.readLine())!=null){
json+=行;
}
rd.close();
}捕获(例外e){
错误=e.getMessage();
}
ScriptEngineManager工厂=新ScriptEngineManager();
ScriptEngine=factory.getEngineByName(“JavaScript”);
put(“json”,json);
试一试{
engine.eval(“var station_id=JSON.parse(JSON).value[0]。station_id”);
}捕获(脚本异常){
错误=e.getMessage();
}
返回engine.get(“station_id”).toString();
}
静态字符串getData(字符串fromName、字符串TonName、字符串日期){
fetchHtml();
parseCookie();
parseToken();
字符串from=getStationId(fromName);
字符串to=getStationId(toName);
字符串json=“”;
试一试{
URL=新URL(“http://booking.uz.gov.ua/en/purchase/search/");
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setRequestProperty(“Cookie”,Cookie);
conn.setRequestProperty(“GV令牌”,令牌);
conn.setRequestProperty(“GV Ajax”,“1”);
conn.setRequestProperty(“内容类型”、“应用程序/x-www-form-urlencoded”);
conn.setRequestProperty(“Referer”http://booking.uz.gov.ua/en/");
conn.setRequestMethod(“POST”);
字符串urlParameters=MessageFormat.format(“station_id_from={0}&station_id_till={1}&date_dep={2}”+
“&time\u dep=00:00&time\u dep\u till=24:00”,自,至,日期);
连接设置输出(真);
DataOutputStream wr=新的DataOutputStream(conn.getOutputStream());
writeBytes(URL参数);
wr.flush();
wr.close();
BufferedReader rd=新的BufferedReader(新的InputStreamReader(conn.getInputStream());
弦线;
而((line=rd.readLine())!=null){
json+=行;
}
rd.close();
}捕获(例外e){
错误=e.getMessage();
}
返回json;
}
静态字符串getData(字符串fromName,字符串toName){
返回getData(fromName,toName,newsimpledateformat(“MM.dd.yyyy”).format(newdate());
}
公共静态void main(字符串[]args){
如果(参数长度<2){
系统输出打印(System.out.println)(“ззззззззззззззззззззззз;
System.out.println(“Бцццц:[MM.DD.YYYY]”);
系统出口(1);
}
字符串数据;
如果(参数长度>2)
data=getData(args[0],args[1],args[2]);
其他的
data=getData(args[0],args[1]);
系统输出打印项次(数据);
}
}
第137行是args[0]=“dsa”。如果0是IndexOutOfBound,这意味着args是大小为0(即空)的数组。因此,您无法访问其索引0,因为这需要大小>=1的数组

启动程序的方式会影响args数组的内容(该数组包含通过控制台启动时传递给程序的参数)。您是否检查了使用断点启动时args是什么?你如何启动你的计划?(在ide中,或通过控制台?

第137行是args[0]=“dsa”。如果0是IndexOutOfBound,这意味着args是数组w
package ua.gov.uz.booking;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class uz {

static String html   = "";
static String cookie = "";
static String token  = "";
static String error  = "";

static Map<String, List<String>> headers = null;

static void fetchHtml() {
    try {
        URL url = new URL("http://booking.uz.gov.ua/");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        headers = conn.getHeaderFields();
        String line;
        while ((line = rd.readLine()) != null) {
            html += line;
        }
        rd.close();
    } catch (Exception e) {
        error = e.getMessage();
    }
}

static void parseCookie() {
    List<String> cookies = headers.get("Set-Cookie");
    for (String current_cookie : cookies) {
        if (current_cookie.startsWith("_gv_sessid")) {
            cookie = current_cookie;
            break;
        }
    }
}

static void parseToken() {
    String adapter = "var token;localStorage={setItem:function(key, value){if(key==='gv-token')token=value}};";
    Pattern pattern = Pattern.compile("\\$\\$_=.*~\\[\\];.*\"\"\\)\\(\\)\\)\\(\\);");
    Matcher matcher = pattern.matcher(html);
    if (matcher.find()) {
        String obfuscated = matcher.group(0);
        ScriptEngineManager factory = new ScriptEngineManager();
        ScriptEngine engine = factory.getEngineByName("JavaScript");
        try {
            engine.eval(adapter + obfuscated);
        } catch (ScriptException e) {
            error = e.getMessage();
        }
        token = engine.get("token").toString();
    }
}

static String getStationId(String name) {
    String json = "";
    try {
        URL url = new URL("http://booking.uz.gov.ua/en/purchase/station/" + name + "/");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("GET");
        BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String line;
        while ((line = rd.readLine()) != null) {
            json += line;
        }
        rd.close();
    } catch (Exception e) {
        error = e.getMessage();
    }
    ScriptEngineManager factory = new ScriptEngineManager();
    ScriptEngine engine = factory.getEngineByName("JavaScript");
    engine.put("json", json);
    try {
        engine.eval("var station_id = JSON.parse(json).value[0].station_id");
    } catch (ScriptException e) {
        error = e.getMessage();
    }
    return engine.get("station_id").toString();
}

static String getData(String fromName, String toName, String date) {
    fetchHtml();
    parseCookie();
    parseToken();
    String from = getStationId(fromName);
    String to = getStationId(toName);
    String json = "";
    try {
        URL url = new URL("http://booking.uz.gov.ua/en/purchase/search/");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestProperty("Cookie", cookie);
        conn.setRequestProperty("GV-Token", token);
        conn.setRequestProperty("GV-Ajax", "1");
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        conn.setRequestProperty("Referer", "http://booking.uz.gov.ua/en/");
        conn.setRequestMethod("POST");
        String urlParameters = MessageFormat.format("station_id_from={0}&station_id_till={1}&date_dep={2}" +
                                                    "&time_dep=00:00&time_dep_till=24:00", from, to, date);
        conn.setDoOutput(true);
        DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
        wr.writeBytes(urlParameters);
        wr.flush();
        wr.close();
        BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        String line;
        while ((line = rd.readLine()) != null) {
            json += line;
        }
        rd.close();
    } catch (Exception e) {
        error = e.getMessage();
    }
    return json;
}

static String getData(String fromName, String toName) {
    return getData(fromName, toName, new SimpleDateFormat("MM.dd.yyyy").format(new Date()));
}

public static void main(String[] args) {


if (args.length < 2) {
    System.out.println("Онлайн резервування та придбання квиткiв - Укрзалізниця");
    System.out.println("Введите: <start_station> <end_station> [MM.DD.YYYY]");
    System.exit(1);
}
String data;
if (args.length > 2)
    data = getData(args[0], args[1], args[2]);
else
    data = getData(args[0], args[1]);
System.out.println(data);
}


}
public static void main(String[] args) {
    args = new String[5];
    args[0] = "dsa";
    .......
}