1. 程式人生 > >學習筆記——12306成功登入(4)

學習筆記——12306成功登入(4)

本節程式碼為登入成功並打印出賬戶名稱

#-*-coding:utf-8 -*-
import urllib2
import urllib
# 驗證碼登入同步
import cookielib
import damatuWeb
import ssl
from json import loads
from cons import station_name
import time

header={
"Referer":"https://kyfw.12306.cn/otn/leftTicket/init",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
}



#證書驗證
ssl._create_default_https_context = ssl._create_unverified_context
# 請求驗證碼圖片
c=cookielib.LWPCookieJar()#生成一個儲存cookie的物件
cookie=urllib2.HTTPCookieProcessor(c)#繫結
opener=urllib2.build_opener(cookie)
urllib2.install_opener(opener)
# opener繫結,用opener.open請求,自帶cookie,實現驗證碼與登陸同步
city={}
for i in station_name.split("@"):

    if  not i:
        continue
    tmp_list=i.split("|")
    city[tmp_list[1]]=tmp_list[2]


# print city["長沙"]
# print city["上海"]

from_station=city["長沙"]
to_station=city["上海"]
train_date="2017-11-08"

def getCode():
    req=urllib2.Request("https://kyfw.12306.cn/passport/captcha/"
                        "captcha-image?login_site=E&module="
                        "login&rand=sjrand&0.3835166812770916")
    codeing=opener.open(req).read()#opener
    fn=open('code/code.png','wb')
    #儲存到本地
    fn.write(codeing)
    fn.close()
def code():
    getCode()
    req=urllib2.Request('https://kyfw.12306.cn/passport'
                        '/captcha/captcha-check')
    code=damatuWeb.calcCode()
    # code=raw_input(">>")
    print code
    data={
    "answer":code,
    "login_site":"E",
    "rand":"sjrand",
    }
    data=urllib.urlencode(data)#把字典型別轉變為查詢字串
    html=opener.open(req,data=data).read()
    result=loads(html)
    if result["result_code"]=="4":
        print"驗證碼校驗成功!"
        return True
    else:
        print "驗證碼校驗失敗"
        code()

def login():
    #登入
    req=urllib2.Request('https://kyfw.12306.cn/passport'
                        '/web/login')

    data={
        'username':'test',
        'password':'test',
        'appid':'otn',
    }
    data = urllib.urlencode(data)
    html = opener.open(req, data=data).read()
    result = loads(html)
    req = urllib2.Request('https://kyfw.12306.cn/passport/web/auth/uamtk')
    req.headers = header
    html = opener.open(req, data='appid=otn').read()
    print html
    result = loads(html)
    newapptk = result['newapptk']
    req = urllib2.Request('https://kyfw.12306.cn/otn/uamauthclient')
    req.headers = header
    html = opener.open(req, data='tk=%s' % newapptk).read()
    print html
    if result['result_code'] == 0:
        print '登入成功!'
        return True
    else:
        print '登入失敗'

def getTrain():
    req=urllib2.Request("https://kyfw.12306.cn/otn/leftTicket/query?"
                        "leftTicketDTO.train_date=%s&leftTicketDTO"
                        ".from_station=%s&leftTicketDTO.to_station=%s&"
                        "purpose_codes=ADULT" %(train_date,from_station,to_station))
    req.headers=header
    html=opener.open(req).read()
    try:
        result = loads(html)
        return result['data']['result']
    except Exception,e:
        time.sleep(2)
        getTrain()

#下單
def order(secretStr):
    #第1個請求
    req = urllib2.Request('https://kyfw.12306.cn/otn/login/checkUser')
    html = opener.open(req,data='_json_att=').read()
    # print html
    #第2個請求
    req = urllib2.Request('https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest')
    data = {
        'secretStr':secretStr,
        'train_date':'2017-11-08',
        'back_train_date':'2017-11-05',
        'tour_flag':'dc',
        'purpose_codes':'ADULT',
        'query_from_station_name':'長沙',
        'query_to_station_name':'上海',
        'undefined':''
    }
    data = urllib.urlencode(data)
    req.headers = header
    html = opener.open(req,data=data)
    # print html.read()
    # print html.geturl()
    req = urllib2.Request('https://kyfw.12306.cn/otn/index/initMy12306')
    req.headers = header
    html = opener.open(req).read()
    print html


code()
login()
# print getTrain()
#查票
for i in getTrain():
    tmp_list=i.split("|")
    # tmp_list[3]="車次"
    # tmp_list[8]="出發時間"
    # tmp_list[9]="到達時間"
    # tmp_list[26]="無座"
    # tmp_list[29]="硬座"
    # tmp_list[25]="特等座"
    # tmp_list[31]="一等座"
    # tmp_list[30]="二等座"
    # tmp_list[23]="軟臥"
    secretStr=tmp_list[0]
    # a=0
    # for n in tmp_list:
    #     print "[%s]%s"%(a,n)
    #     a+=1
    # break
# print tmp_list
    if tmp_list[30]!=u"無" and tmp_list[30]!="":
        print "有票","車次:",tmp_list[3]
        break
    else:
        print "沒票"

# print secretStr
order(secretStr)