diff --git a/TickerConfig.py b/TickerConfig.py index 62b7502d..f3bd9f0d 100644 --- a/TickerConfig.py +++ b/TickerConfig.py @@ -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 @@ # "硬座", # "无座", # "动卧", -SET_TYPE = ["硬座"] +SET_TYPE = ["二等座"] # 当余票小于乘车人,如果选择优先提交,则删减联系人和余票数一致在提交 # bool @@ -42,7 +42,7 @@ # 乘车人(list) 多个乘车人ex: # "张三", # "李四" -TICKET_PEOPLES = [] +TICKET_PEOPLES = [""] # 12306登录账号 USER = "" @@ -56,7 +56,7 @@ # 设置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 @@ # 下单模式 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 @@ 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_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 @@ MIN_TIME = 1 # 软件版本 -RE_VERSION = "1.2.002" +RE_VERSION = "1.2.003" diff --git a/agency/cdn_utils.py b/agency/cdn_utils.py index 76486c6e..01b95bc1 100644 --- a/agency/cdn_utils.py +++ b/agency/cdn_utils.py @@ -1,5 +1,6 @@ # encoding=utf8 import datetime +import operator import os import requests from config import urlConf @@ -27,10 +28,11 @@ def run(self): 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() diff --git a/init/select_ticket_info.py b/init/select_ticket_info.py index 7203aa6f..c736f09b 100755 --- a/init/select_ticket_info.py +++ b/init/select_ticket_info.py @@ -39,7 +39,7 @@ def __init__(self): 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 @@ def main(self): 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 @@ def main(self): ) 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", "") diff --git a/inter/GetPassCodeNewOrderAndLogin.py b/inter/GetPassCodeNewOrderAndLogin.py index 3ca20d8e..98d84bef 100644 --- a/inter/GetPassCodeNewOrderAndLogin.py +++ b/inter/GetPassCodeNewOrderAndLogin.py @@ -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__': diff --git a/inter/Query.py b/inter/Query.py index 3e51349b..26c04ae7 100644 --- a/inter/Query.py +++ b/inter/Query.py @@ -64,7 +64,7 @@ def sendQuery(self): :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 @@ def sendQuery(self): "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 @@ def sendQuery(self): "seat": [set_type], "train_no": ticket_info[2], "status": True, + "cdn": self.httpClint.cdn, } else: print(u"车次配置信息有误,或者返回数据异常,请检查 {}".format(station_ticket)) diff --git a/tkcode.png b/tkcode.png index 8416dcab..0f7695a9 100644 Binary files a/tkcode.png and b/tkcode.png differ