최근에 기차표 조회가 포함된 WeChat 공개 계정을 설정하고 있습니다. 이전에 온라인에서 찾은 인터페이스를 사용했지만 기차 시간표만 찾을 수 있었고 12306은 티켓 확인을 위한 전용 인터페이스를 제공하지 않았습니다. 오늘 문득 기차표 정보를 얻기 위해 12306으로 직접 가서 쿼리에서 반환된 데이터 패킷을 쿼리하고 잡아온 것이 생각났습니다. 여기에서는 나머지 12,306표를 획득하는 과정을 기록하겠습니다.
먼저, 남은 티켓을 확인하기 위해 Firefox 브라우저에서 12306을 사용했습니다. Firefox의 웹 콘솔을 열고 네트워크에서 "요청 및 응답 본문 기록"을 선택하세요.
그런 다음 주소 날짜 정보를 입력하고 웹 페이지에서 쿼리 버튼을 클릭하면 웹 페이지에서 요청한 주소를 웹 콘솔에서 볼 수 있습니다.
그림의 두 번째 항목으로, 쿼리 버튼을 클릭했을 때 이벤트를 처리하는 실제 주소입니다. 보려면 클릭하세요.
요청 URL, 요청 헤더, 응답 헤더 및 응답 본문에는 필요한 기차표 정보가 포함됩니다.
이 요청 URL을 사용하면 실제 코드를 실행하여 실행할 수 있습니다. URL의 형식은 다음과 같습니다.
앞은 요청을 처리하기 위한 주소이고, 다음 매개변수 목적_코드는 성인 티켓(AADULT), 학생 티켓(직접 시도해 보세요)을 참조하고, queryDate는 날짜이며, from_station 및 to_station은 이름에서 알 수 있듯이 출발 및 도착 역입니다. . 여기서 베이징과 우한은 각각 BJP와 WHN으로 표시됩니다.
Java 코드에서는 기차표 정보 패킷을 얻기 위해 https 요청을 직접 작성할 수 있습니다.
다음과 같이 코드 코드를 복사합니다.
public static List<NewTrain> getmsg(String startCity,String endCity,int isAdult)에서 예외 발생{
List<NewTrain> 열차 = 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());
// 위의 SSLContext 객체에서 SSLSocketFactory 객체를 가져옵니다.
SSLSocketFactory ssf = sslContext.getSocketFactory();
문자열 유형 = "성인";
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 = 새로운 BufferedReader(in);
StringBuffer sb = new StringBuffer();
문자열 = "";
while ((line = bfreader.readLine()) != null) {
sb.append(라인);
}
System.out.println(sb.toString());
}
이 코드의 cityCode.format()은 중국어 웹사이트 이름을 문자 조합으로 변환하기 위해 직접 작성한 것입니다. 다음 줄은 https 요청에 대한 것입니다. URL은 방금 얻은 URL입니다. 이 코드를 실행한 후 얻은 출력은 다음과 같습니다.
이 데이터들이 json 데이터라는 것을 쉽게 알 수 있습니다(간단한 처리를 하고 하나씩 출력해 달라고 했습니다).
json 데이터이므로 다루기가 쉽습니다. 분석을 위해 데이터 조각을 꺼내면 키 값의 의미를 분석할 수 있습니다. 나에게 꼭 필요한 몇 가지 핵심 가치만 분석했습니다.
그런 다음 나중에 표시할 기차 티켓 정보를 저장하는 Train 클래스를 작성하세요.
다음과 같이 코드 코드를 복사합니다.공개 클래스 NewTrain {
private String to_station_name; //도착지
개인 문자열 station_train_code; 열차 번호
private String from_station_name;
개인 문자열 start_time; //출발 시간
개인 문자열 receive_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 클래스 객체에 넣는 것입니다.
자, 기본 작업이 완료되었습니다. 다음 단계는 기능을 프로젝트에 통합하는 것입니다.
중국어 웹사이트 이름과 사용된 문자의 조합이 포함된 txt 파일(중국어 웹사이트 이름에 해당하는 문자 조합을 얻으려면 txt를 읽으십시오. 일부는 불완전할 수 있음)