# coding=utf-8
import HTMLParser
import urlparse
import urllib
import urllib2
import cookielib
import string
import re, time, os, Image
username = "xxxx"
password = "xxxx"
# 登录
login_url = "https://kyfw.12306.cn/otn/login/init"
yzm_login_url = "https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew.do?module=login&rand=sjrand"
login_form_url = "https://kyfw.12306.cn/otn/login/loginAysnSuggest"
# # 订票
# order_url = "https://kyfw.12306.cn/otn/confirmPassenger/initDc"
# yzm_order_url = "https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew.do?module=passenger&rand=randp"
# order_form_url = "https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo"
# """
# cancel_flag:2
# bed_level_order_num:000000000000000000000000000000
# passengerTicketStr:1,0,1,姓名,1,身份证号码,手机号码,N
# oldPassengerStr:姓名,1,身份证号码,1_
# tour_flag:dc
# randCode:dvms
# _json_att:
# REPEAT_SUBMIT_TOKEN:be941fd5e93193bdd8097bf03cfeae1f
# """
# 设置一个cookie处理器,它负责从服务器下载cookie到本地,并且在发送请求时带上本地的cookie
cj = cookielib.LWPCookieJar()
cookie_support = urllib2.HTTPCookieProcessor(cj)
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)
def getLoginCode():
"""
@des:获取验证码
"""
request = urllib2.Request("%s&%s" % (yzm_login_url, time.time()), "")
response = urllib2.urlopen(request)
text = response.read()
return text
def writefile_map(name, data):
"""
@des:显示验证码
"""
files = open(name, 'wb')
files.write(data)
files.close()
try:
os.startfile(name)
except:
im = Image.open(name)
im.show()
def login():
"""
@des: 登录
"""
# 打开登录主页面(他的目的是从页面下载cookie,这样我们在再送post数据时就有cookie了,否则发送不成功)
h = urllib2.urlopen(login_url)
# end
codemap = getLoginCode()
writefile_map('codein.tif', codemap)
randCode = raw_input("请输入验证码: ")
# 构造header,一般header至少要包含一下两项。这两项是从抓到的包里分析得出的。
headers = {'User-Agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:14.0) Gecko/20100101 Firefox/14.0.1',
'Referer' : '******'}
# 构造Post数据,他也是从抓大的包里分析得出的。
postData = {
'loginUserDTO.user_name':username,
'userDTO.password':password,
'randCode':randCode
}
# 需要给Post数据编码
postData = urllib.urlencode(postData)
# 通过urllib2提供的request方法来向指定Url发送我们构造的数据,并完成登录过程
request = urllib2.Request(login_form_url, postData, headers)
print request
response = urllib2.urlopen(request)
text = response.read()
print text
if __name__ == "__main__":
login()