#这是一个试图模拟12306登陆的程序,只到验证码部分
import urllib.request as U
import urllib.parse as P
import http.cookiejar as C
import ssl
import chardet as cd
ssl._create_default_https_context = ssl._create_unverified_context
#无视证书的有效性
opener = U.build_opener(U.HTTPCookieProcessor(C.CookieJar()))
U.install_opener(opener)
#创建一个访问者(具有cookie功能)
req = U.Request("https://kyfw.12306.cn/passport/captcha/captcha-image64?login_site=E&module=login&rand=sjrand&1581337391968&callback=jQuery19109972447551572461_1581326959299&_=1581326959322")
req.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362"
res = opener.open(req)
#申请验证码
url = "data:image/jpg;base64," + res.read().decode("utf-8").split('({"image":"')[1].split('","result_message"')[0] #12306分为申请验证码和生成两部分,这是根据两部分的URL规律,生成的验证码图片的URL
req = U.Request(url)
req.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362"
res = opener.open(req)
code_img = res.read()
with open("D:\py\测试_练习综合体\py练习\imagecode12306.png","wb") as f:
f.write(code_img)
#获取验证码
pass_code = input("请输入验证码(坐标):")
#根据图片获取验证码坐标
data = {"callback":"jQuery19109972447551572461_1581326959299","answer":pass_code,"rand":"sjrand","login_site":"E","_":"1581326959323"}
data = P.urlencode(data).encode("utf-8")
req = U.Request("https://kyfw.12306.cn/passport/captcha/captcha-check?callback=jQuery19109972447551572461_1581326959299&answer=188%2C49%2C30%2C39&rand=sjrand&login_site=E&_=1581326959323")
req.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362"
res = opener.open(req,data = data)
html = res.read().decode("utf-8")
#验证码验证
#疑问:为什么验证码验证总是失败了(通过html获得结果)