Recentemente, estou configurando uma conta pública no WeChat, que envolve a consulta de passagens de trem. Usei uma interface encontrada online antes, mas ela só conseguia encontrar horários de trens e 12306 não fornecia uma interface dedicada para verificação de passagens. Hoje de repente me lembrei que fui direto para 12306 para consultar e pegar o pacote de dados retornado pela consulta, para poder obter as informações da passagem de trem. Aqui farei anotações sobre o processo de obtenção dos 12.306 votos restantes.
Primeiro, usei 12306 no navegador Firefox para verificar os tickets restantes. Abra o console Web do Firefox e selecione "Registrar corpos de solicitação e resposta" na rede
Em seguida, insira as informações de data do endereço e clique no botão de consulta na página da web, e você poderá ver o endereço solicitado pela página da web no console da web:
É o segundo item da imagem, que é o endereço real que trata o evento quando você clica no botão de consulta. Clique para ver
URL da solicitação, cabeçalho da solicitação, cabeçalho da resposta e corpo da resposta O corpo da resposta contém as informações do bilhete de trem que precisamos.
Com este URL de solicitação, você pode prosseguir para o código real para operar. Pode-se descobrir que o formato do URL é
A frente é o endereço para processamento da solicitação, e os seguintes parâmetros propósito_códigos referem-se a ingressos de adulto (AADULT), ingressos de estudante (experimente você mesmo), queryDate é a data, e from_station e to_station são as estações de partida e chegada como seus nomes sugerem . Aqui Pequim e Wuhan são representadas como BJP e WHN respectivamente.
No código java, você pode escrever diretamente uma solicitação https para obter o pacote de informações da passagem de trem.
Copie o código do código da seguinte forma:
public static List<NewTrain> getmsg(String startCity,String endCity,int isAdult) lança Exception{
List<NewTrain> trens = new ArrayList<NewTrain>();
String sstartCity = CityCode.format(startCity);
String sendCity = CityCode.format(endCity);
TrustManager[] tm = {new MyX509TrustManager()};
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
// Obtenha o objeto SSLSocketFactory do objeto SSLContext acima
SSLSocketFactory ssf = sslContext.getSocketFactory();
Tipo de string = "ADULTO";
if(éAdulto == 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 = nova URL(urlStr);
HttpsURLConnection com = (HttpsURLConnection) url.openConnection();
con.setSSLSocketFactory(ssf);
InputStreamReader in = new InputStreamReader(con.getInputStream(),"utf-8");
BufferedReader bfreader = novo BufferedReader(in);
StringBuffer sb = new StringBuffer();
Linha de string = "";
while ((linha = bfreader.readLine()) != null) {
sb.append(linha);
}
System.out.println(sb.toString());
}
O cityCode.format() deste código foi escrito por mim para converter o nome do site chinês em uma combinação de letras. As linhas a seguir são sobre solicitações https. O URL é o URL que acabamos de obter. A saída obtida após a execução deste código é a seguinte:
É fácil ver que esses dados são pedaços de dados json (fiz um processo simples e pedi para ele imprimir um por um).
Como são dados JSON, são fáceis de manusear. Ao retirar um dado para análise, você pode analisar o significado do valor-chave. Analisei apenas alguns valores-chave que preciso
Em seguida, basta escrever uma classe Train para armazenar as informações da passagem de trem para exibição posterior.
Copie o código do código da seguinte forma:classe pública Novo Trem {
private String to_station_name; //Local de chegada
private String station_train_code; //número do trem
private String from_station_name; //Local de partida
private String start_time; //Hora de partida
private String chega_time; // hora de chegada
private String lishi; // leva tempo
private String zy_num; // Número de assentos na primeira classe
private String ze_num; // Número de assentos de segunda classe
private String swz_num; // Número de licenças empresariais
private String gr_num; // Número de travessas macias premium
private String rw_num; // Número de travessas macias
private String rz_num; // Número de assentos flexíveis
private String yw_num; // Número de travessas difíceis
private String yz_num; // Número de assentos rígidos
private String tz_num; // Número de assentos especiais
private String wz_num; // Sem número de assentos
}
O próximo trabalho é muito simples, coloque os dados json no objeto da classe Train.
Pronto, o trabalho básico está concluído, o próximo passo é integrar as funções ao projeto.
Um arquivo txt contendo uma combinação de nomes de sites chineses e letras usadas (leia o txt para obter a combinação de letras correspondentes ao nome do site chinês, algumas podem estar incompletas