美文网首页DevSupport
12306之登录流程解析

12306之登录流程解析

作者: Whyn | 来源:发表于2018-01-08 00:49 被阅读1559次

    前言

    本套教程共分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

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

    相关文章

      网友评论

      • 2aa3ff3cd369:post newapptk 到 uamauthclient 后返回的不是json
        Whyn:我抓了一下,是返回的json呀。你可以试下自己抓取下。第三篇有源码,可以去参考下。
      • a3d6e359915e:您好,登录的最后一步我总是错误,禁止重定向就没有json数据返回,不禁止就跳到一个界面,html内容中显示请登录
        Whyn:@哪里奇怪了 请看第三篇:下单流程,最后有源码
      • Rockelbel:从github过来,写得很详细,赞👍
        Whyn:@Rockelbel 结合代码看会更好,还是有些细节没说的!
      • 8f0499d812f3:请问是怎么做到可以查看network中Params的?
        8f0499d812f3:@Whyn 嗯嗯,谢谢,找到了
        Whyn:chrome的话Headers标签拉到最底,就可以看到。
        firefox右边标签就有params这个标签,如果没记错的话。

      本文标题:12306之登录流程解析

      本文链接:https://www.haomeiwen.com/subject/khxvnxtx.html