12306之登录流程解析
前言
本套教程共分3章:
本套内容主要用于分析12306购票流程,意在编写一套自动购票小程序。12306接口 api 经常变动,但是流程分析是固定的。因此,本套教程主要记录12306 相关购票流程分析过程,以作记录。
登录流程分析
- 首先,我们可以在登录 这个界面进行登录操作。
然后,当我们输入用户名和密码,并输入正确的验证码后,浏览器就会向12306服务器发送我们的登录请求。因此,我们如果要实现自动登录过程,就必须模拟这个操作,通过 Firefox 浏览器自带的开发者工具,我们可以很方便的对这整个过程进行抓包,得到相应的登录接口。
经过笔者这段时间对12306登录流程抓包发现,12306对登录有两套 api,其中一天时间内大部分使用的是下面所要说的第一套接口,第二套接口经常在早上 9:00-11:00 这个时间段内使用(当然,这只是我这两天观察得到,不一定准确)。下面开始分析下这两套登录接口 api:
- 第一套接口(大部分时间使用):
-
验证码图片获取接口分析,抓包结果如下图所示:
captcha.png
从上图中可以看到,验证码图片的获取接口 api 为:
https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand&{random}
从接口就可以看出这是一个Get
操作,参数有4个:
login_site:E
module:login
rand:sjrand
0.3375607650273108:
最后一个参数是一个随机数,去除这个随机数,一样能获取到验证码图片,但是为了防止浏览器对同一网址的缓存设置,最好就加上这个随机数参数。
注:图片获取接口服务器会返回一个 Cookie,因此我们需要保存这个 Cookie,后续请求服务器需要用到这个 Cookie。
- 当我们获取到验证码,填写完用户名,密码和验证码后,就会走
captcha-check
这个流程,服务器首先会对提交的验证码进行检测,抓包如下图所示:
captcha-check
提交的参数如下所示:
form Data
最后看下返回结果:
response
因此,当提交验证码给服务器后,服务器会检测这个验证码,然后返回给我们一个json格式的字符串。通过上图我们可以看到,当 "result_code" 等于"4"时,代表验证码正确;当 "result_code" 不等"4"时,错误信息会在"result_message"中显示。
-
当验证码验证成功后,就会真正走登录接口,抓包如下:
login
对应的表单参数有:
form Data
提交表单结果完成后,服务器会返回一个json字符串结果:
response
从服务器返回结果中,我们可以就可以知道登录的状态了。但是,这里登录流程还没有结束。让我们继续下面的分析:
-
下面会访问
responseuamtk
页面,主要为了获取一个newapptk
键值,抓包如下:
-
成功获取
uamauthclientnewapptk
后,我们就可以访问uamauthclient
页面,抓包如下:
前面说要获取newapptk
,是因为这个页面需要提交这个参数:
最后,看下这个页面返回的结果:
response
当返回结果的 result_code=0时,表明请求成功,请求成功或失败的结果可以从键 result_message 中获取。
之所以要访问到这个页面,是因为这个服务器会下发一个新的 Cookie,后续的查询或者订单提交请求都必须使用这个更新的 Cookie。
因此,到这里,整个登录流程才结束。
- 第二套接口(一般在早上短暂出现)
-
验证码图片获取接口分析,抓包结果如下图所示:
getPassCodeNew
可以看到,验证码图片的获取接口变为了:
https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand&{random}
其参数为:
params
跟第一套方案相比就少了个键值:login_site:E
-
接下来,同样是先对验证码进行检测,抓包如下:
checkRandCodeAnsyn
可以看到,验证码检测接口变为了:
https://kyfw.12306.cn/otn/passcodeNew/checkRandCodeAnsyn
参数如下所示:
form Data
最后看下返回结果:
response
-
当验证码验证成功后,就会真正走登录接口,抓包如下:
loginAysnSuggest
可以看到,接口为:
https://kyfw.12306.cn/otn/login/loginAysnSuggest
看下其携带的参数内容:
form Data
最后,看下返回内容:
response
这样,第二套登录接口流程就已经走完了。
用户注销流程分析
无论是对于第一套登录接口,还是第二套登录接口,都可以用一套用户注销接口。
用户注销接口主要包含3个请求:
-
loginOut 过程,抓包如下:
loginOut
其接口为:
https://kyfw.12306.cn/otn/login/loginOut
就是一个普通的Get
请求,没有携带参数,也不用关心返回值。
-
init 流程,抓包如下:
init
其接口为:
https://kyfw.12306.cn/otn/login/init
就是一个普通的Get
请求,没有携带参数,也同样不用关心返回值。但注意的是这里服务器会返回一个 Cookie。
-
uamtk 流程,抓包如下:
image.png
其接口为:
https://kyfw.12306.cn/passport/web/auth/uamtk
这是一个Post
请求,因此,我们来看下参数:
参数就是一个appid
,其固定值为otn
。
最后,我们需要得到其返回结果,来得知注销的结果:
以上,就是整个注销过程。