Недавно я настраиваю общедоступную учетную запись WeChat, которая включает в себя запрос билетов на поезд. Раньше я использовал интерфейс, найденный в Интернете, но он мог найти только расписание поездов, а 12306 не предоставил специального интерфейса для проверки билетов. Сегодня я внезапно вспомнил, что пошел прямо на номер 12306, чтобы запросить и получить пакет данных, возвращенный запросом, чтобы получить информацию о билете на поезд. Здесь я буду делать заметки о процессе получения оставшихся 12 306 голосов.
Сначала я использовал 12306 в браузере Firefox, чтобы проверить оставшиеся билеты. Откройте веб-консоль Firefox и выберите «Записывать тела запросов и ответов» в сети.
Затем введите информацию о дате адреса и нажмите кнопку запроса на веб-странице, и вы сможете увидеть адрес, запрошенный веб-страницей, в веб-консоли:
Это второй элемент на рисунке, который представляет собой фактический адрес, обрабатывающий событие при нажатии кнопки запроса. Нажмите, чтобы увидеть
URL-адрес запроса, заголовок запроса, заголовок ответа и тело ответа. Тело ответа содержит необходимую нам информацию о билете на поезд.
Используя этот URL-адрес запроса, вы можете перейти к фактическому коду для работы. Можно обнаружить, что формат URL-адреса
Спереди — это адрес для обработки запроса, а следующие параметры target_codes относятся к билетам для взрослых (AADULT), студенческим билетам (попробуйте сами), queryDate — это дата, а from_station и to_station — станции отправления и прибытия, как следует из их названий. . Здесь Пекин и Ухань представлены как BJP и WHN соответственно.
В Java-коде вы можете напрямую написать https-запрос для получения пакета информации о билете на поезд.
Скопируйте код кода следующим образом:
public static List<NewTrain> getmsg(String startCity,String endCity,int isAdult) выдает исключение {
List<NewTrain> поезда = новый ArrayList<NewTrain>();
Строка sstartCity = CityCode.format(startCity);
Строка sendCity = CityCode.format(endCity);
TrustManager [] tm = {новый MyX509TrustManager()};
SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
sslContext.init(null, tm, new java.security.SecureRandom());
// Получаем объект SSLSocketFactory из вышеуказанного объекта SSLContext
SSLSocketFactory ssf = sslContext.getSocketFactory();
Тип строки = "ВЗРОСЛЫЙ";
если(isAdult == 1){
тип = «0X00»;
}
Строка urlStr = "https://kyfw.12306.cn/otn/lcxxcx/query?member_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 = новый InputStreamReader(con.getInputStream(),"utf-8");
BufferedReader bfreader = новый BufferedReader (в);
StringBuffer sb = новый StringBuffer();
Строковая линия = "";
while ((line = bfreader.readLine()) != null) {
sb.append(строка);
}
System.out.println(sb.toString());
}
cityCode.format() этого кода написан мной для преобразования имени китайского веб-сайта в комбинацию букв. Следующие строки посвящены https-запросам. URL-адрес — это только что полученный URL-адрес. Результат, полученный после выполнения этого кода, выглядит следующим образом:
Легко увидеть, что эти данные представляют собой фрагменты данных в формате JSON (я проделал простой процесс и попросил его распечатать их один за другим).
Поскольку это данные в формате JSON, с ними легко обращаться. Взяв на анализ часть данных, можно проанализировать смысл значения ключа. Я проанализировал лишь несколько ключевых ценностей, которые мне нужны
Затем просто напишите класс Train, чтобы сохранить информацию о билетах на поезд для последующего отображения.
Скопируйте код кода следующим образом:общественный класс NewTrain {
частная строка to_station_name //Место прибытия;
частная строка Station_train_code // номер поезда;
частная строка from_station_name //Место отправления;
частная строка start_time // Время отправления;
частная строка прибытия_время // время прибытия;
частная строка lishi // требует времени;
Private String zy_num // Количество мест в первом классе;
Private String ze_num // Количество мест второго класса;
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.
Ладно, основная работа завершена, следующий шаг — интеграция функций в проект.
Текстовый файл, содержащий комбинацию названий китайских веб-сайтов и использованных букв (прочитайте текст, чтобы получить комбинацию букв, соответствующую названию китайского веб-сайта, некоторые из них могут быть неполными).