DevSupport

12306之登录流程解析

2018-01-08  本文已影响1559人  Whyn

前言

本套教程共分3章:

本套内容主要用于分析12306购票流程,意在编写一套自动购票小程序。12306接口 api 经常变动,但是流程分析是固定的。因此,本套教程主要记录12306 相关购票流程分析过程,以作记录。

登录流程分析

  1. 首先,我们可以在登录 这个界面进行登录操作。
    然后,当我们输入用户名和密码,并输入正确的验证码后,浏览器就会向12306服务器发送我们的登录请求。因此,我们如果要实现自动登录过程,就必须模拟这个操作,通过 Firefox 浏览器自带的开发者工具,我们可以很方便的对这整个过程进行抓包,得到相应的登录接口。

经过笔者这段时间对12306登录流程抓包发现,12306对登录有两套 api,其中一天时间内大部分使用的是下面所要说的第一套接口,第二套接口经常在早上 9:00-11:00 这个时间段内使用(当然,这只是我这两天观察得到,不一定准确)。下面开始分析下这两套登录接口 api:

  1. 验证码图片获取接口分析,抓包结果如下图所示:


    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。

  1. 当我们获取到验证码,填写完用户名,密码和验证码后,就会走captcha-check这个流程,服务器首先会对提交的验证码进行检测,抓包如下图所示:
    captcha-check
    提交的参数如下所示:
    form Data
    最后看下返回结果:
    response

因此,当提交验证码给服务器后,服务器会检测这个验证码,然后返回给我们一个json格式的字符串。通过上图我们可以看到,当 "result_code" 等于"4"时,代表验证码正确;当 "result_code" 不等"4"时,错误信息会在"result_message"中显示。

  1. 当验证码验证成功后,就会真正走登录接口,抓包如下:


    login

    对应的表单参数有:


    form Data
    提交表单结果完成后,服务器会返回一个json字符串结果:
    response

    从服务器返回结果中,我们可以就可以知道登录的状态了。但是,这里登录流程还没有结束。让我们继续下面的分析:

  2. 下面会访问uamtk页面,主要为了获取一个newapptk键值,抓包如下:

    response
  3. 成功获取newapptk后,我们就可以访问uamauthclient页面,抓包如下:

    uamauthclient

前面说要获取newapptk,是因为这个页面需要提交这个参数:

form Data

最后,看下这个页面返回的结果:


response

当返回结果的 result_code=0时,表明请求成功,请求成功或失败的结果可以从键 result_message 中获取。

之所以要访问到这个页面,是因为这个服务器会下发一个新的 Cookie,后续的查询或者订单提交请求都必须使用这个更新的 Cookie。

因此,到这里,整个登录流程才结束。

  1. 验证码图片获取接口分析,抓包结果如下图所示:


    getPassCodeNew

    可以看到,验证码图片的获取接口变为了:

https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand&{random}

其参数为:


params

跟第一套方案相比就少了个键值:login_site:E

  1. 接下来,同样是先对验证码进行检测,抓包如下:


    checkRandCodeAnsyn

可以看到,验证码检测接口变为了:

https://kyfw.12306.cn/otn/passcodeNew/checkRandCodeAnsyn

参数如下所示:


form Data

最后看下返回结果:


response
  1. 当验证码验证成功后,就会真正走登录接口,抓包如下:


    loginAysnSuggest

可以看到,接口为:

https://kyfw.12306.cn/otn/login/loginAysnSuggest

看下其携带的参数内容:


form Data

最后,看下返回内容:


response

这样,第二套登录接口流程就已经走完了。

用户注销流程分析

无论是对于第一套登录接口,还是第二套登录接口,都可以用一套用户注销接口。
用户注销接口主要包含3个请求:

  1. loginOut 过程,抓包如下:


    loginOut

其接口为:

https://kyfw.12306.cn/otn/login/loginOut

就是一个普通的Get请求,没有携带参数,也不用关心返回值。

  1. init 流程,抓包如下:


    init

其接口为:

https://kyfw.12306.cn/otn/login/init

就是一个普通的Get请求,没有携带参数,也同样不用关心返回值。但注意的是这里服务器会返回一个 Cookie。

  1. uamtk 流程,抓包如下:


    image.png

其接口为:

https://kyfw.12306.cn/passport/web/auth/uamtk

这是一个Post请求,因此,我们来看下参数:

form Data

参数就是一个appid,其固定值为otn
最后,我们需要得到其返回结果,来得知注销的结果:

response

以上,就是整个注销过程。

上一篇下一篇

猜你喜欢

热点阅读