学习笔记——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)


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值