Baru-baru ini, saya membuat akun publik WeChat, yang melibatkan menanyakan tiket kereta api. Saya menggunakan antarmuka yang ditemukan online sebelumnya, tetapi hanya dapat menemukan jadwal kereta, dan 12306 tidak menyediakan antarmuka khusus untuk memeriksa tiket. Hari ini saya tiba-tiba teringat bahwa saya langsung pergi ke 12306 untuk menanyakan dan mengambil paket data yang dikembalikan oleh permintaan tersebut, sehingga saya bisa mendapatkan informasi tiket kereta api. Di sini saya akan mencatat proses perolehan sisa 12.306 suara.
Pertama, saya menggunakan 12306 di browser Firefox untuk memeriksa sisa tiket. Buka konsol Web Firefox dan pilih "Rekam badan permintaan dan respons" di jaringan
Kemudian masukkan informasi tanggal alamat dan klik tombol kueri di halaman web, dan Anda dapat melihat alamat yang diminta oleh halaman web di konsol Web:
Ini adalah item kedua dalam gambar, yang merupakan alamat sebenarnya yang menangani kejadian saat Anda mengklik tombol kueri. Klik untuk melihat
URL Permintaan, header permintaan, header respons, dan isi respons berisi informasi tiket kereta api yang kita perlukan.
Dengan URL permintaan ini, Anda dapat melanjutkan ke kode sebenarnya untuk beroperasi. Dapat diketahui bahwa format URL-nya adalah
Bagian depan adalah alamat untuk memproses permintaan, dan parameter berikut kode_tujuan mengacu pada tiket dewasa (AADULT), tiket pelajar (coba sendiri), queryDate adalah tanggal, dan from_station dan to_station adalah stasiun keberangkatan dan kedatangan sesuai namanya . Di sini Beijing dan Wuhan masing-masing direpresentasikan sebagai BJP dan WHN.
Pada kode java, Anda bisa langsung menulis request https untuk mendapatkan paket informasi tiket kereta api.
Copy kode kodenya sebagai berikut:
Daftar statis publik<Kereta Baru> getmsg(String startCity,String endCity,int isAdult) melempar Pengecualian{
Daftar<Kereta Baru> kereta = Daftar Array baru<Kereta Baru>();
String sstartCity = Kode Kota.format(startCity);
String sendCity = CityCode.format(endCity);
TrustManager[] tm = {baru MyX509TrustManager()};
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, java.security.SecureRandom());
// Dapatkan objek SSLSocketFactory dari objek SSLContext di atas
SSLSocketFactory ssf = sslContext.getSocketFactory();
Tipe string = "DEWASA";
jika(adalahDewasa == 1){
ketik = "0X00";
}
String urlStr = "https://kyfw.12306.cn/otn/lcxxcx/query?tujuan_codes="+type+"&queryDate=2014-04-27&from_station="+sstartCity+"&to_station="+sendCity;
URL url = URL baru(urlStr);
HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
con.setSSLSocketFactory(ssf);
InputStreamReader di = new InputStreamReader(con.getInputStream(),"utf-8");
BufferedReader bfreader = BufferedReader baru(dalam);
StringBuffer sb = StringBuffer baru();
Garis string = "";
while ((baris = bfreader.readLine()) != null) {
sb.tambahkan(baris);
}
Sistem.keluar.println(sb.toString());
}
cityCode.format() dari kode ini saya tulis sendiri untuk mengubah nama situs web berbahasa Mandarin menjadi kombinasi huruf. Baris berikut tentang permintaan https. URL adalah URL yang baru saja diperoleh. Output yang diperoleh setelah mengeksekusi kode ini adalah sebagai berikut:
Sangat mudah untuk melihat bahwa data ini adalah potongan data json (saya melakukan proses sederhana dan memintanya untuk mencetaknya satu per satu).
Karena ini adalah data json, maka mudah untuk ditangani. Dengan mengambil sepotong data untuk dianalisis, Anda dapat menganalisis arti dari nilai kunci. Saya hanya menganalisis beberapa nilai kunci yang saya perlukan
Kemudian tulis saja kelas Kereta untuk menyimpan informasi tiket kereta untuk ditampilkan nanti.
Copy kode kodenya sebagai berikut:Kereta Baru kelas publik {
private String to_station_name; //Tempat kedatangan
private String station_train_code; //nomor kereta
String pribadi dari_station_name; //Tempat keberangkatan
private String start_time; //Waktu keberangkatan
String pribadi tiba_waktu; // waktu kedatangan
private String lishi; // membutuhkan waktu
private String zy_num; // Jumlah kursi kelas satu
private String ze_num; // Jumlah kursi kelas dua
private String swz_num; // Jumlah kursi bisnis
private String gr_num; // Jumlah bantalan empuk premium
private String rw_num; // Jumlah soft sleeper
private String rz_num; // Jumlah kursi empuk
private String yw_num; // Jumlah orang yang tidur nyenyak
private String yz_num; // Jumlah kursi keras
private String tz_num; // Jumlah kursi khusus
private String wz_num; // Tidak ada jumlah kursi
}
Pekerjaan selanjutnya sangat sederhana, masukkan data json ke objek kelas Train.
Oke, pekerjaan dasar sudah selesai, langkah selanjutnya adalah mengintegrasikan fungsi-fungsi tersebut ke dalam proyek.
File txt berisi kombinasi nama website berbahasa Mandarin dan huruf yang digunakan (baca txt untuk mendapatkan kombinasi huruf yang sesuai dengan nama situs berbahasa Mandarin, ada yang mungkin kurang lengkap