mirror of https://github.com/testerSunshine/12306
update version 1.2.003
parent
008c7ecd42
commit
04a2716b8e
|
@ -5,23 +5,23 @@
|
|||
# 如果这个时候捡漏捡到的话,也是可以付款成功的,也就是说,捡漏+候补,可以最大程度提升抢票成功率
|
||||
|
||||
# 刷票模式:1=刷票 2=候补+刷票
|
||||
TICKET_TYPE = 2
|
||||
TICKET_TYPE = 1
|
||||
|
||||
# 出发日期(list) "2018-01-06", "2018-01-07"
|
||||
STATION_DATES = [
|
||||
"2020-01-05"
|
||||
"2020-01-17"
|
||||
]
|
||||
|
||||
# 填入需要购买的车次(list),"G1353"
|
||||
# 修改车次填入规则,注:(以前设置的车次逻辑不变),如果车次填入为空,那么就是当日乘车所有车次都纳入筛选返回
|
||||
# 不填车次是整个list为空才算,如果不是为空,依然会判断车次的,这种是错误的写法 [""], 正确的写法 []
|
||||
STATION_TRAINS = ["G1002"]
|
||||
STATION_TRAINS = ["G1120"]
|
||||
|
||||
# 出发城市,比如深圳北,就填深圳就搜得到
|
||||
FROM_STATION = "深圳北"
|
||||
FROM_STATION = "广州"
|
||||
|
||||
# 到达城市 比如深圳北,就填深圳就搜得到
|
||||
TO_STATION = "长沙南"
|
||||
TO_STATION = "武汉"
|
||||
|
||||
# 座位(list) 多个座位ex:
|
||||
# "商务座",
|
||||
|
@ -33,7 +33,7 @@ TO_STATION = "长沙南"
|
|||
# "硬座",
|
||||
# "无座",
|
||||
# "动卧",
|
||||
SET_TYPE = ["硬座"]
|
||||
SET_TYPE = ["二等座"]
|
||||
|
||||
# 当余票小于乘车人,如果选择优先提交,则删减联系人和余票数一致在提交
|
||||
# bool
|
||||
|
@ -42,7 +42,7 @@ IS_MORE_TICKET = True
|
|||
# 乘车人(list) 多个乘车人ex:
|
||||
# "张三",
|
||||
# "李四"
|
||||
TICKET_PEOPLES = []
|
||||
TICKET_PEOPLES = [""]
|
||||
|
||||
# 12306登录账号
|
||||
USER = ""
|
||||
|
@ -56,7 +56,7 @@ IS_AUTO_CODE = True
|
|||
|
||||
# 设置2本地自动打码,需要配置tensorflow和keras库,3为云打码,由于云打码服务器资源有限(为2h4C的cpu服务器),请不要恶意请求,不然只能关闭服务器
|
||||
# ps: 请不要一直依赖云服务器资源,在此向所有提供服务器同学表示感谢
|
||||
AUTO_CODE_TYPE = 2
|
||||
AUTO_CODE_TYPE = 3
|
||||
|
||||
# 此处设置云打码服务器地址,如果有自建的服务器,可以自行更改
|
||||
HOST = "120.77.154.140:8000"
|
||||
|
@ -102,7 +102,7 @@ ORDER_TYPE = 2
|
|||
|
||||
# 下单模式 1 为预售,整点刷新,刷新间隔0.1-0.5S, 然后会校验时间,比如12点的预售,那脚本就会在12.00整检票,刷新订单
|
||||
# 2 是捡漏,捡漏的刷新间隔时间为0.5-3秒,时间间隔长,不容易封ip
|
||||
ORDER_MODEL = 2
|
||||
ORDER_MODEL = 1
|
||||
|
||||
# 是否开启代理, 0代表关闭, 1表示开始
|
||||
# 开启此功能的时候请确保代理ip是否可用,在测试放里面经过充分的测试,再开启此功能,不然可能会耽误你购票的宝贵时间
|
||||
|
@ -113,7 +113,7 @@ ORDER_MODEL = 2
|
|||
IS_PROXY = 0
|
||||
|
||||
# 预售放票时间, 如果是捡漏模式,可以忽略此操作
|
||||
OPEN_TIME = "13:00:00"
|
||||
OPEN_TIME = "12:59:50"
|
||||
# 1=使用selenium获取devicesID
|
||||
# 2=使用网页端/otn/HttpZF/logdevice获取devicesId,这个接口的算法目前可能有点问题,如果登录一直302的请改为配置1
|
||||
# 3=自己打开浏览器在headers-Cookies中抓取RAIL_DEVICEID和RAIL_EXPIRATION,这个就不用配置selenium
|
||||
|
@ -126,8 +126,8 @@ CHROME_PATH = "/usr/src/app/chromedriver"
|
|||
CHROME_CHROME_PATH = "/opt/google/chrome/google-chrome"
|
||||
|
||||
# 如果COOKIE_TYPE=3, 则需配置RAIL_EXPIRATION、RAIL_DEVICEID的值
|
||||
RAIL_EXPIRATION = ""
|
||||
RAIL_DEVICEID = ""
|
||||
RAIL_EXPIRATION = "1577033439142"
|
||||
RAIL_DEVICEID = "PuV16sVaV-CTGsFZUuL8JLAk4OhuT1wgUYC_W3L2JZfWx8Ygx8LOPkko3PSOrK5_xSKhXjgyTMS8dBmj1RZHL2CKBTmVs6UG_yptlB4NJbGHldltrLMTUEgoDpSkpX2vzpGXgMQsTRzgOXfuQkAWwS4GjCxSmV3C; BIGipServerpassport=820510986.50215.0000; route=9036359bb8a8a461c164a04f8f50b252"
|
||||
|
||||
|
||||
# 1=>为一直随机ua,2->只启动的时候随机一次ua
|
||||
|
@ -152,4 +152,4 @@ MAX_TIME = 3
|
|||
MIN_TIME = 1
|
||||
|
||||
# 软件版本
|
||||
RE_VERSION = "1.2.002"
|
||||
RE_VERSION = "1.2.003"
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
# encoding=utf8
|
||||
import datetime
|
||||
import operator
|
||||
import os
|
||||
import requests
|
||||
from config import urlConf
|
||||
|
@ -27,10 +28,11 @@ class CDNProxy(threading.Thread):
|
|||
http._cdn = cdn.replace("\n", "")
|
||||
start_time = datetime.datetime.now()
|
||||
rep = http.send(url)
|
||||
if rep and "message" not in rep and (datetime.datetime.now() - start_time).microseconds / 1000 < 3000:
|
||||
retTime = (datetime.datetime.now() - start_time).microseconds / 1000
|
||||
if rep and "message" not in rep and retTime < 3000:
|
||||
if cdn.replace("\n", "") not in cdn_list: # 如果有重复的cdn,则放弃加入
|
||||
print(f"加入cdn: {cdn}")
|
||||
cdn_list.append(cdn.replace("\n", ""))
|
||||
cdn_list.append({"ip": cdn.replace("\n", ""), "time": retTime})
|
||||
|
||||
|
||||
def open_cdn_file(cdnFile):
|
||||
|
@ -50,6 +52,19 @@ def open_cdn_file(cdnFile):
|
|||
return cdn
|
||||
|
||||
|
||||
def sortCdn():
|
||||
"""
|
||||
对cdn进行排序
|
||||
:return:
|
||||
"""
|
||||
ips = []
|
||||
cs = sorted(cdn_list, key=operator.itemgetter('time'))
|
||||
for c in cs:
|
||||
print(f"当前ip: {c['ip']}, 延时: {c['time']}")
|
||||
ips.append(c["ip"])
|
||||
return ips
|
||||
|
||||
|
||||
def filterCdn():
|
||||
"""
|
||||
过滤cdn, 过滤逻辑为当前cdn响应值小于1000毫秒
|
||||
|
@ -71,13 +86,14 @@ def filterCdn():
|
|||
|
||||
print(f"当前有效cdn个数为: {len(cdn_list)}")
|
||||
if cdn_list:
|
||||
ips = sortCdn()
|
||||
path = os.path.join(os.path.dirname(__file__), f'../filter_cdn_list')
|
||||
f = open(path, "a+")
|
||||
f.seek(0)
|
||||
f.truncate()
|
||||
f.writelines("")
|
||||
for c in cdn_list:
|
||||
f.writelines(f"{c}\n")
|
||||
for ip in ips:
|
||||
f.writelines(f"{ip}\n")
|
||||
f.close()
|
||||
|
||||
|
||||
|
|
|
@ -39,7 +39,7 @@ class select:
|
|||
self._station_seat = [seat_conf[x] for x in TickerConfig.SET_TYPE]
|
||||
self.auto_code_type = TickerConfig.AUTO_CODE_TYPE
|
||||
self.httpClint = HTTPClient(TickerConfig.IS_PROXY)
|
||||
self.httpClint.cdn = self.cdn_list[random.randint(0, len(self.cdn_list) - 1)]
|
||||
self.httpClint.cdn = self.cdn_list[random.randint(0, 4)]
|
||||
self.urls = urlConf.urls
|
||||
self.login = GoLogin(self, TickerConfig.IS_AUTO_CODE, self.auto_code_type)
|
||||
self.cookies = ""
|
||||
|
@ -134,8 +134,8 @@ class select:
|
|||
now = datetime.datetime.now()
|
||||
if TickerConfig.ORDER_MODEL is 1:
|
||||
print(f"预售还未开始,阻塞中,预售时间为{TickerConfig.OPEN_TIME}, 当前时间为: {now.strftime('%H:%M:%S')}")
|
||||
sleep_time_s = 0.5
|
||||
sleep_time_t = 0.6
|
||||
sleep_time_s = 0.1
|
||||
sleep_time_t = 0.3
|
||||
# 测试了一下有微妙级的误差,应该不影响,测试结果:2019-01-02 22:30:00.004555,预售还是会受到前一次刷新的时间影响,暂时没想到好的解决方案
|
||||
while now.strftime("%H:%M:%S") < TickerConfig.OPEN_TIME:
|
||||
now = datetime.datetime.now()
|
||||
|
@ -162,7 +162,7 @@ class select:
|
|||
)
|
||||
queryResult = q.sendQuery()
|
||||
# 查询接口
|
||||
if queryResult.get("status", False):
|
||||
if queryResult.get("status"):
|
||||
train_no = queryResult.get("train_no", "")
|
||||
train_date = queryResult.get("train_date", "")
|
||||
stationTrainCode = queryResult.get("stationTrainCode", "")
|
||||
|
|
|
@ -71,7 +71,7 @@ def getPassCodeNewOrderAndLogin1(session, imgType):
|
|||
img.write(base64.b64decode(result))
|
||||
return result
|
||||
except OSError:
|
||||
print(u"验证码下载失败,可能ip被封,确认请手动请求: {0}".format(codeImgUrl))
|
||||
print(u"验证码下载失败,可能ip被封或者文件写入没权限")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
|
|
@ -64,7 +64,7 @@ class query:
|
|||
:return:
|
||||
"""
|
||||
if TickerConfig.IS_CDN == 1 and self.session.cdn_list:
|
||||
self.httpClint.cdn = self.session.cdn_list[random.randint(0, len(self.session.cdn_list) - 1)]
|
||||
self.httpClint.cdn = self.session.cdn_list[random.randint(4, len(self.session.cdn_list) - 1)]
|
||||
for station_date in self.station_dates:
|
||||
select_url = copy.copy(self.urls["select_url"])
|
||||
select_url["req_url"] = select_url["req_url"].format(station_date, self.from_station, self.to_station,
|
||||
|
@ -169,6 +169,7 @@ class query:
|
|||
"seat": [set_type],
|
||||
"train_no": ticket_info[2],
|
||||
"status": True,
|
||||
"cdn": self.httpClint.cdn,
|
||||
}
|
||||
elif ticket_info[3][0] in ["T", "Z", "K"] and set_type in ["硬卧", "硬座", "无座", "软座", "软卧"]:
|
||||
return {
|
||||
|
@ -176,6 +177,7 @@ class query:
|
|||
"seat": [set_type],
|
||||
"train_no": ticket_info[2],
|
||||
"status": True,
|
||||
"cdn": self.httpClint.cdn,
|
||||
}
|
||||
else:
|
||||
print(u"车次配置信息有误,或者返回数据异常,请检查 {}".format(station_ticket))
|
||||
|
|
BIN
tkcode.png
BIN
tkcode.png
Binary file not shown.
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Loading…
Reference in New Issue