mirror of https://github.com/testerSunshine/12306
240 lines
8.5 KiB
Python
240 lines
8.5 KiB
Python
#!/bin/env python
|
||
# -*- coding=utf-8 -*-
|
||
import random
|
||
import json
|
||
import re
|
||
import socket
|
||
from time import sleep
|
||
|
||
from config.ticketConf import _get_yaml
|
||
from PIL import Image
|
||
from damatuCode.damatuWeb import DamatuApi
|
||
from damatuCode.ruokuai import RClient
|
||
from myException.UserPasswordException import UserPasswordException
|
||
from myException.balanceException import balanceException
|
||
from myUrllib import myurllib2
|
||
|
||
|
||
class GoLogin:
|
||
def __init__(self, httpClint, urlConf, is_aotu_code, aotu_code_type):
|
||
self.httpClint = httpClint
|
||
self.randCode = ""
|
||
self.urlConf = urlConf
|
||
self.is_aotu_code = is_aotu_code
|
||
self.aotu_code_type = aotu_code_type
|
||
|
||
def cookietp(self):
|
||
print("正在获取cookie")
|
||
url = self.urlConf["loginInit"]["req_url"]
|
||
self.httpClint.send(url)
|
||
# Url = "https://kyfw.12306.cn/otn/login/init"
|
||
# myurllib2.get(Url)
|
||
# for index, c in enumerate(myurllib2.cookiejar):
|
||
# stoidinput(c)
|
||
|
||
def getRandCode(self):
|
||
"""
|
||
识别验证码
|
||
:return: 坐标
|
||
"""
|
||
if self.is_aotu_code:
|
||
if self.aotu_code_type == 1:
|
||
return DamatuApi(_get_yaml()["damatu"]["uesr"], _get_yaml()["damatu"]["pwd"], "./tkcode").main()
|
||
elif self.aotu_code_type == 2:
|
||
rc = RClient(_get_yaml()["damatu"]["uesr"], _get_yaml()["damatu"]["pwd"])
|
||
im = open('./tkcode', 'rb').read()
|
||
Result = rc.rk_create(im, 6113)
|
||
if "Result" in Result:
|
||
return self.codexy(Ofset=",".join(list(Result["Result"])), is_raw_input=False)
|
||
else:
|
||
if "Error" in Result and Result["Error"]:
|
||
print Result["Error"]
|
||
return ""
|
||
else:
|
||
img = Image.open('./tkcode')
|
||
img.show()
|
||
return self.codexy()
|
||
|
||
def readImg(self, code_url):
|
||
"""
|
||
增加手动打码,只是登录接口,完全不用担心提交订单效率
|
||
思路
|
||
1.调用PIL显示图片
|
||
2.图片位置说明,验证码图片中每个图片代表一个下标,依次类推,1,2,3,4,5,6,7,8
|
||
3.控制台输入对应下标,按照英文逗号分开,即可手动完成打码,
|
||
:return:
|
||
"""
|
||
print ("下载验证码...")
|
||
codeimgUrl = code_url
|
||
img_path = './tkcode'
|
||
result = self.httpClint.send(codeimgUrl, is_logger=False)
|
||
try:
|
||
open(img_path, 'wb').write(result)
|
||
except OSError as e:
|
||
print (e)
|
||
|
||
def codexy(self, Ofset=None, is_raw_input=True):
|
||
"""
|
||
获取验证码
|
||
:return: str
|
||
"""
|
||
if is_raw_input:
|
||
Ofset = raw_input("请输入验证码: ")
|
||
select = Ofset.split(',')
|
||
post = []
|
||
offsetsX = 0 # 选择的答案的left值,通过浏览器点击8个小图的中点得到的,这样基本没问题
|
||
offsetsY = 0 # 选择的答案的top值
|
||
for ofset in select:
|
||
if ofset == '1':
|
||
offsetsY = 46
|
||
offsetsX = 42
|
||
elif ofset == '2':
|
||
offsetsY = 46
|
||
offsetsX = 105
|
||
elif ofset == '3':
|
||
offsetsY = 45
|
||
offsetsX = 184
|
||
elif ofset == '4':
|
||
offsetsY = 48
|
||
offsetsX = 256
|
||
elif ofset == '5':
|
||
offsetsY = 36
|
||
offsetsX = 117
|
||
elif ofset == '6':
|
||
offsetsY = 112
|
||
offsetsX = 115
|
||
elif ofset == '7':
|
||
offsetsY = 114
|
||
offsetsX = 181
|
||
elif ofset == '8':
|
||
offsetsY = 111
|
||
offsetsX = 252
|
||
else:
|
||
pass
|
||
post.append(offsetsX)
|
||
post.append(offsetsY)
|
||
randCode = str(post).replace(']', '').replace('[', '').replace("'", '').replace(' ', '')
|
||
print("验证码识别坐标为{0}".format(randCode))
|
||
return randCode
|
||
|
||
def auth(self):
|
||
"""认证"""
|
||
authUrl = self.urlConf["auth"]["req_url"]
|
||
authData = {"appid": "otn"}
|
||
tk = self.httpClint.send(authUrl, authData)
|
||
return tk
|
||
|
||
def codeCheck(self):
|
||
"""
|
||
验证码校验
|
||
:return:
|
||
"""
|
||
codeCheck = self.urlConf["codeCheck"]["req_url"]
|
||
codeCheckData = {
|
||
"answer": self.randCode,
|
||
"rand": "sjrand",
|
||
"login_site": "E"
|
||
}
|
||
fresult = self.httpClint.send(codeCheck, codeCheckData)
|
||
if "result_code" in fresult and fresult["result_code"] == "4":
|
||
print ("验证码通过,开始登录..")
|
||
return True
|
||
else:
|
||
if "result_message" in fresult:
|
||
print(fresult["result_message"])
|
||
sleep(1)
|
||
self.httpClint.del_cookies()
|
||
|
||
def baseLogin(self, user, passwd):
|
||
"""
|
||
登录过程
|
||
:param user:
|
||
:param passwd:
|
||
:return: 权限校验码
|
||
"""
|
||
logurl = self.urlConf["login"]["req_url"]
|
||
logData = {
|
||
"username": user,
|
||
"password": passwd,
|
||
"appid": "otn"
|
||
}
|
||
tresult = self.httpClint.send(logurl, logData)
|
||
if 'result_code' in tresult and tresult["result_code"] == 0:
|
||
print ("登录成功")
|
||
tk = self.auth()
|
||
if "newapptk" in tk and tk["newapptk"]:
|
||
return tk["newapptk"]
|
||
else:
|
||
return False
|
||
elif 'result_message' in tresult and tresult['result_message']:
|
||
messages = tresult['result_message']
|
||
if messages.find("密码输入错误") is not -1:
|
||
raise UserPasswordException("{0}".format(messages))
|
||
else:
|
||
print ("登录失败: {0}".format(messages))
|
||
print ("尝试重新登陆")
|
||
return False
|
||
else:
|
||
return False
|
||
|
||
def getUserName(self, uamtk):
|
||
"""
|
||
登录成功后,显示用户名
|
||
:return:
|
||
"""
|
||
if not uamtk:
|
||
return "权限校验码不能为空"
|
||
else:
|
||
uamauthclientUrl = self.urlConf["uamauthclient"]["req_url"]
|
||
data = {"tk": uamtk}
|
||
uamauthclientResult = self.httpClint.send(uamauthclientUrl, data)
|
||
if uamauthclientResult:
|
||
if "result_code" in uamauthclientResult and uamauthclientResult["result_code"] == 0:
|
||
print("欢迎 {} 登录".format(uamauthclientResult["username"]))
|
||
return True
|
||
else:
|
||
return False
|
||
else:
|
||
self.httpClint.send(uamauthclientUrl, data)
|
||
url = self.urlConf["getUserInfo"]["req_url"]
|
||
self.httpClint.send(url)
|
||
|
||
def go_login(self):
|
||
"""
|
||
登陆
|
||
:param user: 账户名
|
||
:param passwd: 密码
|
||
:return:
|
||
"""
|
||
if self.is_aotu_code and self.aotu_code_type == 1:
|
||
balance = DamatuApi(_get_yaml()["damatu"]["uesr"], _get_yaml()["damatu"]["pwd"]).getBalance()
|
||
if int(balance) < 40:
|
||
raise balanceException('余额不足,当前余额为: {}'.format(balance))
|
||
user, passwd = _get_yaml()["set"]["12306count"][0]["uesr"], _get_yaml()["set"]["12306count"][1]["pwd"]
|
||
if not user or not passwd:
|
||
raise UserPasswordException("温馨提示: 用户名或者密码为空,请仔细检查")
|
||
login_num = 0
|
||
while True:
|
||
self.cookietp()
|
||
self.httpClint.set_cookies(_jc_save_wfdc_flag="dc", _jc_save_fromStation="%u4E0A%u6D77%u8679%u6865%2CAOH", _jc_save_toStation="%u5170%u5DDE%u897F%2CLAJ", _jc_save_fromDate="2018-02-14", _jc_save_toDate="2018-01-16", RAIL_DEVICEID="EN_3_EGSe2GWGHXJeCkFQ52kHvNCrNlkz9n1GOqqQ1wR0i98WsD8Gj-a3YHZ-XYKeESWgCiJyyucgSwkFOzVHhHqfpidLPcm2vK9n83uzOPuShO3Pl4lCydAtQu4BdFqz-RVmiduNFixrcrN_Ny43135JiEtqLaI")
|
||
self.readImg(self.urlConf["getCodeImg"]["req_url"])
|
||
self.randCode = self.getRandCode()
|
||
login_num += 1
|
||
self.auth()
|
||
if self.codeCheck():
|
||
uamtk = self.baseLogin(user, passwd)
|
||
if uamtk:
|
||
break
|
||
|
||
def logout(self):
|
||
url = 'https://kyfw.12306.cn/otn/login/loginOut'
|
||
result = myurllib2.get(url)
|
||
if result:
|
||
print ("已退出")
|
||
else:
|
||
print ("退出失败")
|
||
|
||
|
||
# if __name__ == "__main__":
|
||
# # main()
|
||
# # logout() |