最近、WeChat のパブリック アカウントをセットアップしています。これには、電車のチケットを照会する必要があります。以前はオンラインで見つけたインターフェイスを使用していましたが、検索できるのは電車の時刻表のみで、12306 にはチケットを確認するための専用インターフェイスがありませんでした。今日、電車のチケット情報を取得するために、12306 に直接アクセスしてクエリを実行し、クエリによって返されたデータ パケットを取得したことを突然思い出しました。ここでは残りの12,306票を獲得するまでの経緯をメモしておきます。
まず、Firefox ブラウザの 12306 を使用して、残りのチケットを確認しました。 Firefox の Web コンソールを開き、ネットワークで「リクエストとレスポンスの本文を記録する」を選択します。
次に、住所の日付情報を入力し、Web ページのクエリ ボタンをクリックすると、Web コンソールで Web ページによって要求された住所が表示されます。
これは図の 2 番目の項目で、クエリ ボタンをクリックしたときにイベントを処理する実際のアドレスです。クリックしてご覧ください
リクエスト URL、リクエスト ヘッダー、レスポンス ヘッダー、レスポンス本文には、必要な鉄道チケット情報が含まれています。
このリクエスト URL を使用して、実際のコードに進み、動作させることができます。 URL の形式は次のとおりであることがわかります。
フロントはリクエストを処理するためのアドレスで、次のパラメータのPurpose_codesは大人のチケット(AADULT)、学生のチケット(自分で試してみてください)を参照し、queryDateは日付、from_stationとto_stationは名前が示すように出発駅と到着駅です。 。ここでは北京と武漢をそれぞれBJPとWHNとして表している。
Java コードでは、https リクエストを直接記述して、電車のチケット情報パケットを取得できます。
次のようにコードをコピーします。
public static List<NewTrain> getmsg(String startCity,String endCity,int isAdult) throws Exception{
List<NewTrain> 列車 = new ArrayList<NewTrain>();
文字列 sstartCity = CityCode.format(startCity);
文字列 sendCity = CityCode.format(endCity);
TrustManager[] tm = {new MyX509TrustManager()};
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
// 上記の SSLContext オブジェクトから SSLSocketFactory オブジェクトを取得します
SSLSocketFactory ssf = sslContext.getSocketFactory();
文字列型 = "ADULT";
if(isAdult == 1){
タイプ = "0X00";
}
文字列 urlStr = "https://kyfw.12306.cn/otn/lcxxcx/query?Purpose_codes="+type+"&queryDate=2014-04-27&from_station="+sstartCity+"&to_station="+sendCity;
URL url = 新しい 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();
文字列行 = "";
while ((line = bfreader.readLine()) != null) {
sb.append(行);
}
System.out.println(sb.toString());
}
このコードの cityCode.format() は、中国語の Web サイト名を文字の組み合わせに変換するために私が書いたものです。次の行は https リクエストに関するものです。 URLは先ほど取得したURLです。このコードを実行した後に得られる出力は次のとおりです。
これらのデータが json データであることが簡単にわかります (私は簡単な処理を実行し、1 つずつ出力してもらいました)。
jsonデータなので扱いやすいです。分析対象のデータを切り出すことで、キー値の意味を分析できます。必要ないくつかの主要な値のみを分析しました
次に、Train クラスを作成して、後で表示できるように列車のチケット情報を保存します。
次のようにコードをコピーします。パブリック クラス NewTrain {
private String to_station_name //到着地
private String station_train_code; // 列車番号;
private String from_station_name //出発地
private String start_time //出発時刻;
private String reverse_time; // 到着時刻
private String lishi // 時間がかかります。
private String zy_num // ファーストクラスの座席数
private String ze_num // 2 等座席の数
private String swz_num // ビジネス席数;
private String gr_num // プレミアム ソフト スリーパーの数
private String rw_num; // ソフトスリーパーの数
private String rz_num // ソフトシートの数
private String yw_num; // ハードスリーパーの数
private String yz_num; // ハードシートの数
private String tz_num // 特別な座席の数
private String wz_num // 座席数なし
}
次の作業は非常に簡単で、JSON データを Train クラス オブジェクトに配置します。
基本的な作業は完了しました。次のステップは、機能をプロジェクトに統合することです。
中国語の Web サイト名と使用されている文字の組み合わせを含む txt ファイル (txt を読んで、中国語の Web サイト名に対応する文字の組み合わせを取得します。一部は不完全である可能性があります)