Recientemente, estoy configurando una cuenta pública de WeChat, que implica consultar boletos de tren. Usé una interfaz que se encuentra en línea antes, pero solo podía encontrar horarios de trenes y 12306 no proporcionaba una interfaz dedicada para verificar boletos. Hoy de repente recordé que fui directamente a 12306 para consultar y tomar el paquete de datos devuelto por la consulta, para poder obtener la información del boleto de tren. Aquí tomaré notas sobre el proceso de obtención de los 12.306 votos restantes.
Primero, utilicé 12306 en el navegador Firefox para comprobar los tickets restantes. Abra la consola web de Firefox y seleccione "Registrar cuerpos de solicitud y respuesta" en la red.
Luego ingrese la información de la fecha de la dirección y haga clic en el botón de consulta en la página web, y podrá ver la dirección solicitada por la página web en la consola web:
Es el segundo elemento de la imagen, que es la dirección real que maneja el evento cuando hace clic en el botón de consulta. Haz clic para ver
URL de solicitud, encabezado de solicitud, encabezado de respuesta y cuerpo de respuesta. El cuerpo de la respuesta contiene la información del billete de tren que necesitamos.
Con esta URL de solicitud, puede proceder al código real para operar. Se puede encontrar que el formato de la URL es
El frente es la dirección para procesar la solicitud, y los siguientes parámetros: propósitos_códigos se refieren a boletos de adulto (AADULT), boletos de estudiante (pruébelo usted mismo), queryDate es la fecha y from_station y to_station son las estaciones de salida y llegada, como sugieren sus nombres. . Aquí Beijing y Wuhan están representados como BJP y WHN respectivamente.
En el código Java, puede escribir directamente una solicitud https para obtener el paquete de información del billete de tren.
Copie el código de código de la siguiente manera:
Lista estática pública <NewTrain> getmsg (String startCity, String endCity, int isAdult) arroja una excepción {
Lista<NewTrain> trenes = new ArrayList<NewTrain>();
Cadena sstartCity = CityCode.format(startCity);
Cadena enviarCiudad = CityCode.format(endCity);
TrustManager[] tm = {nuevo MyX509TrustManager()};
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
// Obtener el objeto SSLSocketFactory del objeto SSLContext anterior
SSLSocketFactory ssf = sslContext.getSocketFactory();
Tipo de cadena = "ADULTO";
si(esAdulto == 1){
tipo = "0X00";
}
String urlStr = "https://kyfw.12306.cn/otn/lcxxcx/query?Purpose_codes="+type+"&queryDate=2014-04-27&from_station="+sstartCity+"&to_station="+sendCity;
URL URL = nueva URL (urlStr);
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
con.setSSLSocketFactory(ssf);
InputStreamReader en = new InputStreamReader(con.getInputStream(),"utf-8");
BufferedReader bfreader = nuevo BufferedReader(en);
StringBuffer sb = nuevo StringBuffer();
Línea de cadena = "";
mientras ((línea = bfreader.readLine()) != nulo) {
sb.append(línea);
}
System.out.println(sb.toString());
}
El cityCode.format() de este código lo escribí yo mismo para convertir el nombre del sitio web chino en una combinación de letras. Las siguientes líneas tratan sobre solicitudes https. La URL es la URL que acaba de obtener. El resultado obtenido después de ejecutar este código es el siguiente:
Es fácil ver que estos datos son datos json (hice un proceso simple y le pedí que los imprimiera uno por uno).
Dado que son datos json, es fácil de manejar. Al extraer un dato para su análisis, puede analizar el significado del valor clave. Solo analicé algunos valores clave que necesito
Luego simplemente escriba una clase de tren para almacenar la información del boleto de tren para mostrarla más tarde.
Copie el código de código de la siguiente manera:clase pública Nuevo Tren {
cadena privada to_station_name //Lugar de llegada
cadena privada station_train_code //número de tren
cadena privada from_station_name //Lugar de salida
cadena privada start_time // Hora de salida
cadena privada hora_llegada // hora de llegada
cadena privada lishi; // lleva tiempo
private String zy_num; // Número de asientos de primera clase
private String ze_num; // Número de asientos de segunda clase
cadena privada swz_num // Número de puestos comerciales
private String gr_num; // Número de camas blandas premium
private String rw_num; // Número de durmientes blandos
private String rz_num; // Número de asientos blandos
cadena privada yw_num; // Número de personas que duermen duro
cadena privada yz_num; // Número de asientos duros
private String tz_num; // Número de asientos especiales
cadena privada wz_num; // Sin número de asientos
}
El siguiente trabajo es muy simple: coloque los datos json en el objeto de la clase Train.
Bien, el trabajo básico está completo, el siguiente paso es integrar las funciones en el proyecto.
Un archivo de texto que contiene una combinación de nombres de sitios web chinos y letras utilizadas (lea el texto para obtener la combinación de letras correspondientes al nombre del sitio web chino; algunas pueden estar incompletas).