admin管理员组

文章数量:1568418

2023年12月24日发(作者:)

h

郑州大学毕业设计(项目报告)

题 目:

基于HTTPS协议的12306抢票软件设计与实现

指导教师:

张宏涛

职称:

讲师

学生姓名:

魏超凡 学号: 2

专 业:

计算机科学与技术(软件测试方向)

院(系):

软件学院

完成时间:

2013年5月24日

2013年

5 月

24

h

h

目录

1项目开发目标 ............................................................... 1

1.1项目来源 ............................................................. 1

1.2开发目标 ............................................................. 1

2项目总体设计 ............................................................... 3

2.1技术框架设计 ......................................................... 3

2.2功能模块设计 ......................................................... 3

2.3功能接口介绍 ......................................................... 4

2.3.1 登录接口 ....................................................... 5

2.3.2 查询联系人接口 ................................................. 5

2.3.3 查询余票接口 ................................................... 6

2.3.4订票接口 ....................................................... 6

3项目功能描述 ............................................................... 8

3.1登陆模块 ............................................................. 8

3.2查询联系人模块 ....................................................... 9

3.3查票模块 ............................................................. 9

3.4订票模块 ............................................................ 10

3.5定时刷新查询余票 .................................................... 11

3.6响铃提醒 ............................................................ 11

3.7脚本自动化 .......................................................... 11

4项目技术创新 .............................................................. 13

4.1技术创新及特点 ...................................................... 13

4.2个人收获与体会 ...................................................... 13

5附言 ...................................................................... 14

附一 参考文献 ............................................................... 15

附二 项目源代码视图 ......................................................... 16

附三 项目部署物理视图 ....................................................... 17

附四 软件使用说明 ........................................................... 18

h

h

1项目开发目标

1.1项目来源

2013年的春节,网上吵的最厉害的就是火车票订票软件了,有人说它是流氓软件,插队抢票,也有人很是赞好它,说用它订票更顺利了,不用一直呆在电脑面前,刷新页面查余票,再一步一步操作了,被网友热捧为“抢票神器”。这是大众的眼睛,但是作为程序员的我们,想的最多的莫过于它的原理了,甚至都想自己实现一个类似的软件。

于是,我后来就特意用了一段时间,去网上收集抢票的原理,果然,与我开始时想的不谋而合-HTTP协议编程。不过12306用的是加密的HTTPS协议,其实与HTTP协议差不多,说的简单一点,就只是加了一个非对称加密功能和签名而已。于是,我就用firebug来调试12306的各种HTTPS协议请求,最后经过1个礼拜的努力,我终于把12306的登陆,查票,查常用联系人,订票所涉及的一系列HTTPS协议请求(包括地址,参数)给记录了下来,而且用JAVA写了一个简易的操作界面(用的AWT,因为比swing好看一点),又用C做了一个简易的引导启动封装程序。

因此,该软件的来源纯粹是出于我对12306抢票软件的兴趣,对它原理的渴求,也希望能够做出一个自己的抢票软件,来证实自己的JAVA水平,希望它能够帮助更多的程序员认识HTTP协议编程的重要性,设计出更加安全、可靠、防攻击的项目来。

h

h

1.2开发目标

12306抢票软件主要的目标就是能够帮助更多的在外地打拼的奋斗者能够及时的抢到回家的票。因此,软件需要实现自动化,自动与12306服务器进行对接,以达到自动登录,自动获取常用联系人,自动轮询查票,自动订票,以及错误处理等一系列用户事先准备好的订票流程脚本。

另外,通过模仿浏览器对12306服务器的请求,希望能够加强我们对HTTP,HTTPS协议编程的理解,提高重要性。因为WEB编程(.NET 、JSP 、PHP等)究其根本也就是在服务器端通过服务器软件(WEB服务器,比如Tomcat,apache,iis)将我们所编写的动态文件(jsp、aspx、php等)转换为HTML,然后再通过HTTP或者HTTPS协议传输到客户端(浏览器),而浏览器所处理的主要就是对HTML、CSS、JS等静态文件的解析,渲染成页面,让用户能够清晰易懂的看到所呈现的页面以及当用户点击按钮时,将用户的请求以HTTP或者HTTPS协议的方式发送到服务器。

h

h

HTTP请求响应流程如图1所示。

1 HTTP请求响应流程h

h

2项目总体设计

2.1技术框架设计

该软件是采用跨操作系统、面向对象编程的JAVA语言开发测试的,但与12306服务器进行对接,用到了HTTPS协议编程,而且需要登录认证,如果自己去实现这些功能显然需要用到大量的时间,恰好apache已经提供了一个非常出名的高效的、最新的、功能丰富的支持 HTTP(HTTPS) 协议的编程工具包httpclient。而本软件需要监控系统的运行情况,因此需要打印日志,于是,用到了LOG4J。至于UI,由于awt比swing更常用些,界面更友好,于是,在该软件中,用到了awt来渲染界面,希望能有好的效果。

至于最终开发,采用的低耦合、高内聚的分层概念设计-MVC。Awt相当于V(视图),httpclient负责与12306服务器进行交互,log4j负责记录相关日志。

2.2功能模块设计h

h

该系统的功能结构如图2所示。

12306抢票软件

基本功能

扩展功能

登陆

查询常用联系人

查询余票

订票

定时刷新查询余票

响铃提醒

脚本自动化

图2 功能结构图

12306抢票软件功能模块主要包括两大类:基本功能和扩展功能。基本功能也就是最基本的单元模块,含有登陆、查询常用联系人、查询余票、订票 4 个功能,彼此之间相互独立又相互关联。扩展功能也就是利用基本功能进行扩展,比如定时刷新查询余票,就是定时调用基本功能里面的查询余票功能,再刷新界面;响铃提醒则是在定时刷新查询余票时,若发现有余票,则立即响铃提示用户。脚本自动化是最为高级的封装,是软件有多个模板引擎,用户可以按照模板的要求编写自己的订票流程,从登陆到查询常用联系人,再到订票,以及错误处理,h

h

从而实现订票的自动化,省事省力,操作方便。

2.3功能接口介绍

下面将从我对12306网站登录、查询联系人、查票、订票4个功能研究,来说明一下各个接口所用到的url以及参数的意义。h

h

2.3.1 登录接口

登陆接口所涉及到的URL,提交方式,参数意义,以及返回值如下。

登陆接口URL:

/otsweb/?method=login

登陆接口提交方式Method:POST。

登陆接口参数意义:

1 loginRand:随机登录码,需要访问URL:

○/otsweb/?method=loginAysnSuggest才能获取。

2 _name:用户登录名。

○○3 nameErrorFocus:登录错误次数,为空即可。

○4 passwordErrorFocus:密码错误次数,为空即可。

○5randCode:验证码,就是图片,图片/otsweb/?rand=sjrand

URL:○6 randErrorFocus:验证码错误次数,为空即可。

○7 refundFlag:返回标志,填写Y即可。

○8 rd:用户密码。

登陆接口返回值:可根据在返回值中是否包含“欢迎您登录中国铁路客户服务中心网站”来判断是否登录成功。

2.3.2 查询联系人接口

查询联系人接口所涉及到的URL,提交方式,参数意义,头信息以及返回值如h

h

下。

查询联系人接口URL:

/otsweb/?method=getPagePassengerAll

查询联系人接口提交方式Method: POST。

查询联系人接口参数意义:

○1 pageIndex:获取页面,填0即可。

○2 pageSize:每页大小,填4即可。

○3 passenger_name:用户姓名,填写“请输入汉字或拼音首字母”即可。

查询联系人接口头信息:

○1 Referer:/otsweb/?method=initUsualPassenger12306

○2 User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.22 (KHTML,

like Gecko) Chrome/25.0.1364.152 Safari/537.22

○3 X-Requested-With:XMLHttpRequest

查询联系人接口返回值:返回值一个json对象,根据json插件(如GSON)进行解析即可。h

h

2.3.3 查询余票接口

查询余票接口所涉及到的URL,提交方式,参数意义,头信息以及返回值如下。

查询余票接口URL:

/otsweb/order/

查询余票接口提交方式Method:GET。

查询余票接口参数意义:

○1 method:方法,填写“queryLeftTicket”即可。

○2 _date:订票日期。

○3 _station_telecode:起始站编码。

○4 _station_telecode:终点站编码。

○5 _no:车次。

○6 trainPassType:填写QB即可。

○7 trainClass:车类型。

○8 includeStudent:车类型,填写00即可。

○9 seatTypeAndNum:未知,填空即可。

10 _time_str:填写“○00:00--24:00”即可。

查询余票接口头信息:

○1 Referer:/otsweb/order/?method=init

○2 User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.22 (KHTML,

like Gecko) Chrome/25.0.1364.152 Safari/537.22

h

h

○3 X-Requested-With:XMLHttpRequest

查询余票接口返回值:返回值是按照一定格式写成的一个文本文档,需要安装自己的规则进行解析,即可看到所查询的车次信息。

2.3.4订票接口

订票接口所涉及到的URL,提交方式,参数意义以及返回值如下。

订票接口URL:

/otsweb/order/?method=submutOrderRequest

订票接口提交方式Method: POST。

订票接口参数意义:

○1 station_train_code:车次编码。

○2 train_date:日期。

○3 seattype_num:为空即可。

○4 from_station_telecode:起始站编码。

○5 to_station_telecode:终点站编码。

○6 include_student:是否包含学生,填写00即可。h

h

○7 from_station_telecode_name:起始站名字。

○8 to_station_telecode_name:终点站名字。

○9 round_train_date:车次日期。

10 round_start_time_str:填写“○00:00--24:00”即可。

11 single_round_type:是否返程,填写1即可。 ○12 train_pass_type:填写QB即可。 ○13 train_class_arr:未知,填写“○QB#D#Z#T#K#QT#”即可。

14 start_time_str: 填写“○00:00--24:00”即可。

15 lishi:所需时间。 ○16 train_start_time:车次开始时间。 ○17 trainno4:车次编码。 ○18 arrive_time:到达时间。 ○19 from_station_name:起始站名字。 ○20 to_station_name:抵达站名字。 ○21 from_station_no:车次开始编码。 ○22 to_station_no:车次抵达站编码。 ○23 ypInfoDetail:信息。 ○24 mmStr:mmStr。 ○25 locationCode:locationCode。 ○订票接口返回值:根据返回值,需要进一步进行订单确认,以下为订单确认信息。

h

h

确认订单URL:

/otsweb/order/?method=checkOrderInfo&rand=

确认订单提交方式Method: POST。

确认订单参数意义: 和订票参数值一样,只是再次提交进行确认。

确认订单返回值:判断返回值中是否包含{"errMsg":"Y"}来判断订单是否成功。h

h

3项目功能描述

3.1登陆模块

既可以按照用户事先在配置文件里面设置的用户名和密码去登陆12306服务器,也可以输入新的用户名和密码来登陆12306服务器。配置文件如图3所示,登陆界面效果如图4所示。

图3 配置文件图

h

h

图4 用户登录界面效果图h

h

3.2查询联系人模块

登陆之后,根据用户的信息去12306服务器里面取回用户之前在12306网站上保存的已有联系人并显示出来,联系人信息界面如图5所示。

图5 联系人信息界面效果图

3.3查票模块

登陆之后,根据用户输入的查票日期,起始站,终点站来查询12306服务器里余票信息,效果如图6、图7所示;还可以按照车次信息进行联合查询,比如T、K、D、G、Z、其他等,效果如图8所示;除此之外,也可以只查某个车次信息,这时就只用输入该车次信息,只查询该车次的余票情况,效果如图9、图10所示。

图6按日期,始终站查询界面效果图

h

h

图7 按日期,始终站查询结果界面效果图h

h

图8 按车的类型查询界面效果图

图9按车次查询界面效果图

图10 按车次查询结果界面效果图

3.4订票模块

在用户查询完票后,根据用户所选择的车次,以及车票类型,座位类型以及所选择的订票人(姓名、证件类型、证件号码、手机号)直接去12306服务器里面去提交请求,订票成功,效果如图11、图12、图13所示。

图11 提交订票界面效果图

h

h

图12 提交订票人信息界面效果图h

h

图13 订票成功提示界面效果图

3.5定时刷新查询余票

该模块的功能主要是替代用户不断的点击“查询”来检查此刻是否有余票。该模块主要实现了当用户锁定某列车后(此刻已售完)按照用户输入(配置)好的刷新时间间隔来进行重复请求,刷新界面,不断的查询是否还有余票(别的用户退票了)。

3.6响铃提醒

同3.5的介绍,当系统检查到有余票后会立即响铃,或按照用户实现写好的脚本进行下一步处理(比如订票)。

3.7脚本自动化

此功能的主要目的是实现用户订票的自动化,从登陆,到查联系人,到余票,再订票的全过程。整个过程用户可以按照系统提供的模板进行脚本编写,比如在脚本里面写清楚登陆12306服务器的用户名,密码,联系人信息,以及预定的车次(可以同时定多个车次),则该软件则会按照用户的脚本与12306服务器进行交互,无需用户额外干涉,从而实现订票自动化,效果如图14、图15、图16所示。h

h

图14 设置自动订票信息

图15 自动订票界面效果图

图16 自动订票提示成功界面效果图h

h

4项目技术创新

4.1技术创新及特点

在该软件里面用到了HTTPS协议编程,该技术算是比较重要的,望深层次说的话,里面有非对称加密技术以及各种复杂的算法,还有数字签名,如MD5等,另外因为12306需要登录,因此也就有了session,cookie的保存,去实现这些技术是有一定的难度的,比较幸运的是apache基金会已经提供了一个免费的封装好的HTTP编程插件,可以实现session的保存,会话跟踪。另外这个插件httpclient不仅支持HTTP,而且也支持HTTPS协议,因此我们来实现起来的话就不会那么复杂了,从而只需要将项目的重点放在业务逻辑上来,比如对数据的处理。

另外一个完整的软件,日志是少不了的,日志可以帮助开发者实时了解软件的运行情况,对以后的分析,汇总都很有必要性。因此,在该软件里面,我们用到了LOG4J,它是apache的另外一个开放源代码的日志插件,通过它,我们可以将日志信息输出到控制点、文件等里面,而且效率非常好。在这里我主要想强调的是日志对应一个软件真的很重要,尤其是当做一个服务的时候,这个时候根本没有界面,你无法知道服务的运行情况,这个时候只有日志能够帮助我们来了解服务的运行情况,以及对一些方法进行跟踪分析。

4.2个人收获与体会

大学上了四年,最后我以12306抢票软件来作为我的毕业答辩结束我的大学,h

h

我感觉很欣慰。说实话,2013年的春节,我也在为买火车票而发愁,最后盯了几天的12306网站,才订上了一张硬座回家,期间我也用到了一个抢票软件,但后来就被禁用了。再加上那一段时间我的几个朋友也经常问我有没有抢票软件,那个时候我就在想,难道我就不能自己创造一个吗。刚好,过完年后,有一段时间我闲了下来,特意去研究这东西,也算功夫不负有心人吧,最终我还是写了出来,之后就不会再怕谁问我有没有抢票软件了,我会很自豪的说我有,而且是我自己的,哈哈。

这个软件利用到的最主要的技术就是HTTPS协议编程,从编写这个软件,我深刻的体会了WEB编程的原理,不管JAVA、.NET 、PHP ,其实,到最后都是在WEB服务器的帮助下把这些动态脚本文件转化为HTML发送到客户端浏览器,再有浏览器进行解析渲染界面。从中,我深刻体会到了HTTP协议编程的重要性,之后再设计、开发WEB项目的时候,我会结合这次的开发经验,全面考虑,做到能够有效防止一些“居心叵测”的程序员利用HTTP协议攻击我的服务器(走非编程人员安排好的步骤,提交非编程人员设定的参数,以及参数值,短时间内大量请求一些比较耗时的操作,给服务器造成很大的压力)。h

h

5附言

因为12306网站在登陆和最后订票时需要输入验证码,而在2013年春节之前用Tesseract(图片识别软件) 就可以实现12306验证码的自动识别,准确率在90%之上,但是在改版之后,12306验证码在中间加上了一个斜杠,导致Tesseract识别效果很差,所以,本项目暂时采用人工识别,即在需要验证码时,自动弹出窗口显示图片,用户手工输入。而在这个项目里面,在登陆和最后提交订单时需输入验证码,另外两个功能(查询余票和查询常用联系人)不需要输入验证码。

因为时间仓促,所以,我只是粗略实现了该软件的一些核心功能,但是这些扩展功能都是很容易的,我感觉最重要的还是基本功能,因为,有了这些基本功能,我们可以按照自己的需求随意扩展,所以没有完善的还请指导老师见谅。h

h

附一 参考文献

[1]迪特尔(Deitel,H.M.) 迪特尔(Deitel,P.J.) 著,施平安,施惠琼,柳赐佳 译/ 2004-03-01 / 清华大学出版社 Java程序设计教程(第5版)/国外经典教材

[2](美)刘易斯,(美)切斯 著/2009-09-01/清华大学出版社 Java软件结构与数据结构(第3版)

[3]龚水罡 等编著/ 2010-05-01 机械工业出版社 Java Web应用开发实用教程

[4]朱少民 主编 / 2007-01-01 / 清华大学出版社 软件质量保证和管理

[5]李联宁 等编著/ 2011-08-01 / 清华大学出版社 网络工程(高等学校计算机专业教材精选.网络与通信技术)

[6]秦磊华,吴非,莫正坤 编著/ 2011-02-01 / 清华大学出版社 计算机组成原理(计算机系列教材)

[7]王森 著/ 2002-10-01 / 华中科技大学出版社 Java深度历险(附光盘)

[8]同济大学数学系 编/ 2007-04-01 / 高等教育出版社 高等数学 同济第六版

[9]张砚秋,解又明 主编/ 2006-08-01 / 上海外语教育 大学英语h

h

附二 项目源代码视图

该系统的源代码结构如图17所示。

图17 项目源代码视图

说明:

1、项目采用ant进行构建,所以修改代码后再封装变的非常容易,改完代码后直接build一下即可。

2、构建时采用retroguard 进行代码混淆,使编译后的代码难以看懂。h

h

附三 项目部署物理视图

该软件的最终部署结构图18所示。

图18 软件部署图

说明:

是用c语言封装的一个启动外壳。

bins文件夹其实就是jre1.6,主要是为没有安装jdk(jre)的电脑也能够启动,安装过jdk的电脑也可以 不需要此文件夹。

conf 里面放的是配置文件。

lib 里面放的是一些项目依赖的jar包。

logs里面是软件运行日志文件。h

h

附四 软件使用说明

该软件的使用步骤如下:

1、修改conf文件夹下的ties

把userName=××× 的“×××”换成你的12306网站的用户名,

把userPwd=××× 的“×××”换成你的12306网站的密码。

2、双击 或 启动程序 ,输入验证码即可登录系统。

3、输入乘车日期,发站,到站,点击查询 即可查询车票信息 。

4、在查询后点击车票右边的选中按钮,然后选择相关的坐席类别,车票类型 ,选择相应的用户,点击预计即可预定所选车票。

5、登陆12306网站,即可查看刚才已经预定的车票信息,然后请迅速支付即可。

自动订票使用步骤:

a、编辑conf文件夹下的,换成你想订的车票信息。

参数说明:

ticket_date:乘车日期

ticket_from:始发站

ticket_to:终点站

ticket_train_no:车次

ticket_seat_type:车票座位类别

ticket_person_name:乘车人姓名

h

h

ticket_person_ID:乘车人身份证号

ticket_person_phone:乘车人电话

b、双击 或 启动程序 ,输入验证码登录系统

c、点击选项菜单下面的自动订票,即可按的配置进行自动订票,提示是否订票成功!

欢迎下载,资料仅供参考!!!

资料仅供参考!!!

h

本文标签: 查询订票用户软件