Récemment, j'ai créé un compte public WeChat, qui consiste à interroger des billets de train. J'ai déjà utilisé une interface trouvée en ligne, mais elle ne pouvait trouver que les horaires de train, et 12306 ne fournissait pas d'interface dédiée pour vérifier les billets. Aujourd'hui, je me suis soudainement rappelé que je suis allé directement au 12306 pour interroger et récupérer le paquet de données renvoyé par la requête, afin de pouvoir obtenir les informations sur le billet de train. Ici, je prendrai des notes sur le processus d'obtention des 12 306 voix restantes.
Tout d'abord, j'ai utilisé 12306 sur le navigateur Firefox pour vérifier les tickets restants. Ouvrez la console Web de Firefox et sélectionnez « Enregistrer les corps de requête et de réponse » dans le réseau.
Entrez ensuite les informations de date d'adresse et cliquez sur le bouton de requête sur la page Web, et vous pourrez voir l'adresse demandée par la page Web dans la console Web :
Il s'agit du deuxième élément de l'image, qui correspond à l'adresse réelle qui gère l'événement lorsque vous cliquez sur le bouton de requête. Cliquez dessus pour voir
URL de la demande, en-tête de la demande, en-tête de la réponse et corps de la réponse. Le corps de la réponse contient les informations sur le billet de train dont nous avons besoin.
Avec cette URL de requête, vous pouvez passer au code réel à utiliser. On constate que le format de l'URL est
Le recto est l'adresse de traitement de la demande, et les paramètres suivants goal_codes font référence aux billets adultes (AADULT), aux billets étudiants (essayez-le vous-même), queryDate est la date, et from_station et to_station sont les gares de départ et d'arrivée comme leurs noms l'indiquent. . Ici, Pékin et Wuhan sont représentés respectivement par le BJP et le WHN.
Dans le code Java, vous pouvez écrire directement une requête https pour obtenir le paquet d'informations sur le billet de train.
Copiez le code comme suit :
public static List<NewTrain> getmsg(String startCity,String endCity,int isAdult) lève une exception{
List<NewTrain> trains = new ArrayList<NewTrain>();
Chaîne sstartCity = CityCode.format(startCity);
Chaîne sendCity = CityCode.format(endCity);
TrustManager[] tm = {nouveau MyX509TrustManager()} ;
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, nouveau java.security.SecureRandom());
// Récupère l'objet SSLSocketFactory à partir de l'objet SSLContext ci-dessus
SSLSocketFactory ssf = sslContext.getSocketFactory();
Type de chaîne = "ADULTE" ;
si(isAdult == 1){
tapez = "0X00" ;
}
Chaîne urlStr = "https://kyfw.12306.cn/otn/lcxxcx/query?Purpose_codes="+type+"&queryDate=2014-04-27&from_station="+sstartCity+"&to_station="+sendCity;
URL url = nouvelle URL (urlStr);
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
con.setSSLSocketFactory(ssf);
InputStreamReader in = new InputStreamReader(con.getInputStream(),"utf-8");
BufferedReader bfreader = new BufferedReader(in);
StringBuffer sb = new StringBuffer();
Ligne de chaîne = "" ;
while ((line = bfreader.readLine()) != null) {
sb.append(ligne);
}
System.out.println(sb.toString());
}
Le cityCode.format() de ce code est écrit par moi-même pour convertir le nom du site Web chinois en une combinaison de lettres. Les lignes suivantes concernent les requêtes https. L'URL est l'URL qui vient d'être obtenue. Le résultat obtenu après l'exécution de ce code est le suivant :
Il est facile de voir que ces données sont des morceaux de données json (j'ai suivi un processus simple et lui ai demandé de les imprimer une par une).
Puisqu’il s’agit de données json, elles sont faciles à gérer. En extrayant une donnée pour analyse, vous pouvez analyser la signification de la valeur clé. Je n'ai analysé que quelques valeurs clés dont j'ai besoin
Ensuite, écrivez simplement une classe Train pour stocker les informations du billet de train pour un affichage ultérieur.
Copiez le code comme suit :classe publique NewTrain {
private String to_station_name; //Lieu d'arrivée
chaîne privée station_train_code ; //numéro de train
private String from_station_name; //Lieu de départ
private String start_time; //Heure de départ
private String arrive_time; // heure d'arrivée
private String lishi; // prend du temps
private String zy_num; // Nombre de sièges en première classe
private String ze_num; // Nombre de sièges en deuxième classe
private String swz_num ; // Nombre de sièges professionnels
private String gr_num; // Nombre de couchettes souples premium
private String rw_num; // Nombre de dormeurs mous
private String rz_num ; // Nombre de sièges souples
private String yw_num ; // Nombre de dormeurs durs
private String yz_num ; // Nombre de sièges durs
private String tz_num; // Nombre de sièges spéciaux
private String wz_num ; // Aucun nombre de sièges
}
Le travail suivant est très simple : placez les données json dans l'objet de classe Train.
Bon, le travail de base est terminé, la prochaine étape consiste à intégrer les fonctions dans le projet.
Un fichier txt contenant une combinaison de noms de sites chinois et de lettres utilisées (lisez le txt pour obtenir la combinaison de lettres correspondant au nom de sites chinois, certaines peuvent être incomplètes