12306之登錄流程解析

前言

本套教程共分3章:

本套內(nèi)容主要用于分析12306購(gòu)票流程,意在編寫一套自動(dòng)購(gòu)票小程序。12306接口 api 經(jīng)常變動(dòng),但是流程分析是固定的。因此,本套教程主要記錄12306 相關(guān)購(gòu)票流程分析過程,以作記錄。

登錄流程分析

  1. 首先,我們可以在登錄 這個(gè)界面進(jìn)行登錄操作。
    然后,當(dāng)我們輸入用戶名和密碼,并輸入正確的驗(yàn)證碼后,瀏覽器就會(huì)向12306服務(wù)器發(fā)送我們的登錄請(qǐng)求。因此,我們?nèi)绻獙?shí)現(xiàn)自動(dòng)登錄過程,就必須模擬這個(gè)操作,通過 Firefox 瀏覽器自帶的開發(fā)者工具,我們可以很方便的對(duì)這整個(gè)過程進(jìn)行抓包,得到相應(yīng)的登錄接口。

經(jīng)過筆者這段時(shí)間對(duì)12306登錄流程抓包發(fā)現(xiàn),12306對(duì)登錄有兩套 api,其中一天時(shí)間內(nèi)大部分使用的是下面所要說的第一套接口,第二套接口經(jīng)常在早上 9:00-11:00 這個(gè)時(shí)間段內(nèi)使用(當(dāng)然,這只是我這兩天觀察得到,不一定準(zhǔn)確)。下面開始分析下這兩套登錄接口 api:

  • 第一套接口(大部分時(shí)間使用):
  1. 驗(yàn)證碼圖片獲取接口分析,抓包結(jié)果如下圖所示:


    captcha.png

從上圖中可以看到,驗(yàn)證碼圖片的獲取接口 api 為:

https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand&{random}

從接口就可以看出這是一個(gè)Get操作,參數(shù)有4個(gè):

login_site:E
module:login
rand:sjrand
0.3375607650273108:

最后一個(gè)參數(shù)是一個(gè)隨機(jī)數(shù),去除這個(gè)隨機(jī)數(shù),一樣能獲取到驗(yàn)證碼圖片,但是為了防止瀏覽器對(duì)同一網(wǎng)址的緩存設(shè)置,最好就加上這個(gè)隨機(jī)數(shù)參數(shù)。
:圖片獲取接口服務(wù)器會(huì)返回一個(gè) Cookie,因此我們需要保存這個(gè) Cookie,后續(xù)請(qǐng)求服務(wù)器需要用到這個(gè) Cookie。

  1. 當(dāng)我們獲取到驗(yàn)證碼,填寫完用戶名,密碼和驗(yàn)證碼后,就會(huì)走captcha-check這個(gè)流程,服務(wù)器首先會(huì)對(duì)提交的驗(yàn)證碼進(jìn)行檢測(cè),抓包如下圖所示:
    captcha-check

    提交的參數(shù)如下所示:
    form Data

    最后看下返回結(jié)果:
    response

因此,當(dāng)提交驗(yàn)證碼給服務(wù)器后,服務(wù)器會(huì)檢測(cè)這個(gè)驗(yàn)證碼,然后返回給我們一個(gè)json格式的字符串。通過上圖我們可以看到,當(dāng) "result_code" 等于"4"時(shí),代表驗(yàn)證碼正確;當(dāng) "result_code" 不等"4"時(shí),錯(cuò)誤信息會(huì)在"result_message"中顯示。

  1. 當(dāng)驗(yàn)證碼驗(yàn)證成功后,就會(huì)真正走登錄接口,抓包如下:


    login

    對(duì)應(yīng)的表單參數(shù)有:


    form Data

    提交表單結(jié)果完成后,服務(wù)器會(huì)返回一個(gè)json字符串結(jié)果:
    response

    從服務(wù)器返回結(jié)果中,我們可以就可以知道登錄的狀態(tài)了。但是,這里登錄流程還沒有結(jié)束。讓我們繼續(xù)下面的分析:

  2. 下面會(huì)訪問uamtk頁面,主要為了獲取一個(gè)newapptk鍵值,抓包如下:

    response

  3. 成功獲取newapptk后,我們就可以訪問uamauthclient頁面,抓包如下:

    uamauthclient

前面說要獲取newapptk,是因?yàn)檫@個(gè)頁面需要提交這個(gè)參數(shù):

form Data

最后,看下這個(gè)頁面返回的結(jié)果:


response

當(dāng)返回結(jié)果的 result_code=0時(shí),表明請(qǐng)求成功,請(qǐng)求成功或失敗的結(jié)果可以從鍵 result_message 中獲取。

之所以要訪問到這個(gè)頁面,是因?yàn)檫@個(gè)服務(wù)器會(huì)下發(fā)一個(gè)新的 Cookie,后續(xù)的查詢或者訂單提交請(qǐng)求都必須使用這個(gè)更新的 Cookie。

因此,到這里,整個(gè)登錄流程才結(jié)束。

  • 第二套接口(一般在早上短暫出現(xiàn))
  1. 驗(yàn)證碼圖片獲取接口分析,抓包結(jié)果如下圖所示:


    getPassCodeNew

    可以看到,驗(yàn)證碼圖片的獲取接口變?yōu)榱耍?/p>

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

其參數(shù)為:


params

跟第一套方案相比就少了個(gè)鍵值:login_site:E

  1. 接下來,同樣是先對(duì)驗(yàn)證碼進(jìn)行檢測(cè),抓包如下:


    checkRandCodeAnsyn

可以看到,驗(yàn)證碼檢測(cè)接口變?yōu)榱耍?/p>

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

參數(shù)如下所示:


form Data

最后看下返回結(jié)果:


response
  1. 當(dāng)驗(yàn)證碼驗(yàn)證成功后,就會(huì)真正走登錄接口,抓包如下:


    loginAysnSuggest

可以看到,接口為:

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

看下其攜帶的參數(shù)內(nèi)容:


form Data

最后,看下返回內(nèi)容:


response

這樣,第二套登錄接口流程就已經(jīng)走完了。

用戶注銷流程分析

無論是對(duì)于第一套登錄接口,還是第二套登錄接口,都可以用一套用戶注銷接口。
用戶注銷接口主要包含3個(gè)請(qǐng)求:

  1. loginOut 過程,抓包如下:


    loginOut

其接口為:

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

就是一個(gè)普通的Get請(qǐng)求,沒有攜帶參數(shù),也不用關(guān)心返回值。

  1. init 流程,抓包如下:


    init

其接口為:

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

就是一個(gè)普通的Get請(qǐng)求,沒有攜帶參數(shù),也同樣不用關(guān)心返回值。但注意的是這里服務(wù)器會(huì)返回一個(gè) Cookie。

  1. uamtk 流程,抓包如下:


    image.png

其接口為:

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

這是一個(gè)Post請(qǐng)求,因此,我們來看下參數(shù):

form Data

參數(shù)就是一個(gè)appid,其固定值為otn
最后,我們需要得到其返回結(jié)果,來得知注銷的結(jié)果:

response

以上,就是整個(gè)注銷過程。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容