本文最后更新于2018年10月16日 后续接口和流程可能发生变化
一.流程分析
- 浏览器:chrome
- 工具:Fiddler
打开Fiddler以后,登录12306完成全部的订票流程。
全部过程如下:
- 验证码拉取 接口:Get https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand&0.11080113
- 验证码验证 接口:Post https://kyfw.12306.cn/passport/captcha/captcha-check
- 用户名密码认证 接口:Post https://kyfw.12306.cn/passport/web/login
- 获取apptk 接口:Post https://kyfw.12306.cn/passport/web/auth/uamtk
- 获取登录结果 接口:Post https://kyfw.12306.cn/otn/uamauthclient
- 余票查询 接口:Get https://kyfw.12306.cn/otn/leftTicket/query[A-Z]
- 车票信息确认 接口: Post https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest
- InitDC(单程跟往返接口不一样 本文统一单程) 接口:Post https://kyfw.12306.cn/otn/confirmPassenger/initDc
- 获取乘客信息 接口:Post https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs
- 确认订单信息 接口:Post https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo
- 获取排队信息 接口:Post https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount
- 进入队伍 接口:Post https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue
- 查询抢票结果 接口:Post https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime
- 查询订单信息 接口:Post https://kyfw.12306.cn/otn/queryOrder/queryMyOrderNoComplete
二.打通抢票流程
2.1 用户登录
- 验证码
验证码拉取接口最后的数字是一个随机的0-1的小数,防止缓存,程序里随机生成即可。
验证码识别我选用的是超级鹰,在网站上注册了账号以后下载java的使用代码,验证码拉取接口获得的byte数组可以直接传给超级鹰,验证码类型为9004
注意:超级鹰返回的坐标以整个图片左上角为(0,0) 但是12306以验证码左上角为(0,0) 需要减去差值 测试时差值约为30
1坑
验证码验证环节需要注意SSL和content-type
-
校验验证码
- 没携带cookie: {"result_message":"验证码校验失败,信息为空","result_code":"8"}
- 携带cookie但点错了: {"result_message":"验证码校验失败","result_code":"5"}
- 携带cookie并且点击正确: {"result_message":"验证码校验成功","result_code":"4"}
- 停留时间过长: {"result_message":"验证码已经过期","result_code":"7"}- 校验用户名密码:
- 密码输入错误: {"result_message":"密码输入错误。如果输错次数超过4次,用户将被锁定。","result_code":1}
- 用户不存在: {"result_message":"登录名不存在。","result_code":1}
- 密码输入正确: {"result_message":"登录成功","result_code":0,"uamtk":"tWDQtPie_z22IWMknmFOymUpDRzvLE4CfzREJBzS9NwrwL2L0"}
- 校验用户名密码: