update version 1.2.001

pull/505/head
xianping.wen 2019-12-17 19:55:44 +08:00
parent 05f14860c9
commit 9d70f8352d
11 changed files with 200 additions and 219 deletions

View File

@ -15,26 +15,56 @@
#### 依赖库
- 验证码目前可以本地识别,需要下载模型,放于项目根目录,全部代码来源于此项目 [传送门](https://github.com/zhaipro/easy12306),表示感谢
```
PS:
1. 模型下载链接:https://pan.baidu.com/s/1rS155VjweWVWIJogakechA 密码:bmlm
群里面也可以下载
2. git仓库下载https://github.com/testerSunshine/12306model.git
```
- 自托管云打码服务器搭建:[12306_code_server](https://github.com/YinAoXiong/12306_code_server)
- 如果大家有空闲的服务器,可搭建之后这个 [issues](https://github.com/testerSunshine/12306/issues/446) 里面填入自己的服务器(请注意服务器安全!)
- 项目依赖包查看 [requirements.txt](requirements.txt)
- 如果大家有空闲的服务器,可搭建之后这个 [issues](https://github.com/testerSunshine/12306/issues/446) 里面填入自己的服务器(请注意服务器安全!)
- 项目依赖 [requirements.txt](requirements.txt)
- 安装方法x:
- root用户(避免多python环境产生问题): `pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt`
- 非root用户避免安装和运行时使用了不同环境: `pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt`
- 许多windows的用户装不了tensorflow的话可以适当降低版本或者升高版本都是可以的
```
1. tensorflow的兼容版本 1.14.0rc\1.14.0rc\1.15.0\1.15.0rc
以上版本都测试无问题
2. 如果pip代理的清华源无法下载可以更换其他源解决此问题
```
#### 项目使用说明
- 服务器启动:
- 修改[配置](TickerConfig.py)文件
- 可以配置邮箱,配置邮箱的格式在[配置](TickerConfig.py)里面可以看到ex
- 可以配置server酱提醒推荐[配置教程](https://www.jianshu.com/p/8d10b5b9c4e3)
```
# 测试邮箱和server酱是否可用 server酱测试的前提是server酱开关开启
# 可以配置server酱提醒推荐[配置教程](https://www.jianshu.com/p/8d10b5b9c4e3)
# 用python3 还是python 完全取决于安装的时候配置的环境变量是否为python3,以下启动默认环境变量为python3
python3 run.py t
```
- 配置[配置](TickerConfig.py)文件的时候需注意空格和遵循python语法格式
- 运行根目录`sudo python run.py`,即可开始
- 启动前请先筛选cdn这点很`重要`
```
python3 run.py c
```
- 启动服务
```
python3 run.py r
```
- 如果你不知道如何操作,下面的命令可能会帮助你
```
python3 run.py -h
——————————————————————————
sage: run.py [-h] operate
positional arguments:
operate r: 运行抢票程序, c: 过滤cdn, t: 测试邮箱和server酱server酱
```
- 如果你的服务器安装了docker与docker-compose, 那么就可以通过`docker-compose`进行启动,`docker.sh`脚本对此进行了封装,可以通过如下命令进行启动
- 1、`sudo ./docker.sh run` #创建一个镜像并启动容器,如果镜像已经创建过了会直接启动容器。
- 2、`sudo ./docker.sh restart` #修改配置文件后,通过此名命令可重新加载容器运行

View File

@ -1,3 +1,4 @@
# -*- coding=utf-8 -*-
# 关于软件使用配置说明,一定要看!!!
# ps: 如果是候补车票需要通过人证一致性核验的用户及激活的“铁路畅行”会员可以提交候补需求请您按照操作说明在铁路12306app.上完成人证核验
# 关于候补了之后是否还能继续捡漏的问题在此说明: 软件为全自动候补加捡漏,如果软件候补成功则会停止抢票,发出邮件通知,但是不会影响你继续捡漏,
@ -8,13 +9,13 @@ TICKET_TYPE = 2
# 出发日期(list) "2018-01-06", "2018-01-07"
STATION_DATES = [
"2019-10-25"
"2020-01-05"
]
# 填入需要购买的车次(list)"G1353"
# 修改车次填入规则,注:(以前设置的车次逻辑不变),如果车次填入为空,那么就是当日乘车所有车次都纳入筛选返回
# 不填车次是整个list为空才算如果不是为空依然会判断车次的这种是错误的写法 [""], 正确的写法 []
STATION_TRAINS = []
STATION_TRAINS = ["G1002"]
# 出发城市,比如深圳北,就填深圳就搜得到
FROM_STATION = "深圳北"
@ -32,7 +33,7 @@ TO_STATION = "长沙南"
# "硬座",
# "无座",
# "动卧",
SET_TYPE = []
SET_TYPE = ["硬座"]
# 当余票小于乘车人,如果选择优先提交,则删减联系人和余票数一致在提交
# bool
@ -58,7 +59,7 @@ IS_AUTO_CODE = True
AUTO_CODE_TYPE = 2
# 此处设置云打码服务器地址,如果有自建的服务器,可以自行更改
HOST = "api.readour.org"
HOST = "120.77.154.140:8000"
REQ_URL = "/verify/base64/"
HTTP_TYPE = "http"
# HOST="12306.yinaoxiong.cn" #备用服务器稳定性较差
@ -97,7 +98,7 @@ SERVER_CHAN_CONF = {
IS_CDN = 1
# 下单接口分为两种1 模拟网页自动捡漏下单不稳定2 模拟车次后面的购票按钮下单(稳如老狗)
ORDER_TYPE = 1
ORDER_TYPE = 2
# 下单模式 1 为预售整点刷新刷新间隔0.1-0.5S, 然后会校验时间比如12点的预售那脚本就会在12.00整检票,刷新订单
# 2 是捡漏捡漏的刷新间隔时间为0.5-3秒时间间隔长不容易封ip
@ -116,17 +117,17 @@ OPEN_TIME = "13:00:00"
# 1=使用selenium获取devicesID
# 2=使用网页端/otn/HttpZF/logdevice获取devicesId这个接口的算法目前可能有点问题如果登录一直302的请改为配置1
# 3=自己打开浏览器在headers-Cookies中抓取RAIL_DEVICEID和RAIL_EXPIRATION这个就不用配置selenium
COOKIE_TYPE = 1
COOKIE_TYPE = 3
# 如果COOKIE_TYPE=1则需配置chromeDriver路径,下载地址http://chromedriver.storage.googleapis.com/index.html
# chromedriver配置版本只要和chrome的大版本匹配就行
CHROME_PATH = "/usr/src/app/chromedriver"
#为了docker37 准备的环境变量windows环境可以不用管这个参数
CHROME_CHROME_PATH = "/opt/google/chrome/google-chrome";
# 为了docker37 准备的环境变量windows环境可以不用管这个参数
CHROME_CHROME_PATH = "/opt/google/chrome/google-chrome"
# 如果COOKIE_TYPE=3, 则需配置RAIL_EXPIRATION、RAIL_DEVICEID的值
RAIL_EXPIRATION = ""
RAIL_DEVICEID = ""
RAIL_EXPIRATION = "1576654754825"
RAIL_DEVICEID = "iIT4N7T5eI7O26P1vMt3oCLWvjlt4O9_ONCjqrKQPkChXEhGnMWKzD7wRJdc-C_1RYHw66659vxUwVxLeyh1MBgR3nf-2sW44mLg7ZMdE2CskpVx0LBsaIjVkQBsjyNH-Gi1lb45BiGGokq_zJUkFubcmj9pSAUu"
# 1=>为一直随机ua,2->只启动的时候随机一次ua
@ -151,4 +152,4 @@ MAX_TIME = 5
MIN_TIME = 3
# 软件版本
RE_VERSION = "1.1.117"
RE_VERSION = "1.2.001"

View File

@ -7,8 +7,10 @@ from collections import OrderedDict
import requests
from agency.agency_tools import proxy
from agency.cdn_utils import CDNProxy
from config.emailConf import sendEmail
from config.serverchanConf import sendServerChan
from init.select_ticket_info import select
def _set_header_default():
@ -98,6 +100,20 @@ class testAll(unittest.TestCase):
except:
pass
def testCdn(self):
"""
测试cdn筛选
:return:
"""
CDN = CDNProxy()
all_cdn = CDN.open_cdn_file()
s = select()
all_cdn = self.open_cdn_file()
cdns = [all_cdn[i:i + 50] for i in range(0, len(all_cdn), 50)]
for i in cdns:
t = threading.Thread(target=s.cdn_req, args=(i,))
t.start()
if __name__ == '__main__':
unittest.main()

View File

@ -1,88 +1,81 @@
# encoding=utf8
import collections
import json
import datetime
import os
import re
import sys
import csv
import requests
from config import urlConf
import threading
from config.urlConf import urls
try:
reload(sys)
sys.setdefaultencoding('utf-8')
except NameError:
pass
from myUrllib.httpUtils import HTTPClient
cdn_list = []
class CDNProxy:
def __init__(self, host=None):
self.host = host
class CDNProxy(threading.Thread):
def __init__(self, cdns):
super().__init__()
self.cdns = cdns
self.urlConf = urlConf.urls
self.httpClint = requests
self.city_list = []
self.timeout = 5
def _set_header(self):
"""设置header"""
return {
"Content-Type": "application/x-www-form-urlencoded; charset=utf-8",
"X-Requested-With": "xmlHttpRequest",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
"Referer": "https://kyfw.12306.cn/otn/login/init",
"Accept": "*/*",
}
def run(self):
for cdn in self.cdns:
http = HTTPClient(0)
url = urls["loginInitCdn"]
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 < 1000:
if cdn.replace("\n", "") not in cdn_list: # 如果有重复的cdn则放弃加入
print(f"加入cdn: {cdn}")
cdn_list.append(cdn.replace("\n", ""))
def get_city_id(self):
"""
获取所有城市md5参数
:return:
"""
try:
if self.host:
while True:
url = self.urlConf["cdn_host"]["req_url"]
data = {"host": self.host, "lintType": "电信,多线,联通,移动"}
rep = self.httpClint.post(url, data, headers=self._set_header(), timeout=self.timeout)
city_re = re.compile(r"<li id=\"(\S+)\" class=\"PingListCent PingRLlist")
self.city_list = re.findall(city_re, rep.content)
if self.city_list:
print(self.city_list)
break
else:
pass
except:
pass
def open_cdn_file(self):
def open_cdn_file(cdnFile):
cdn = []
# cdn_re = re.compile("CONNECT (\S+) HTTP/1.1")
# path = os.path.join(os.path.dirname(__file__), '../cdn_list')
# with open(path, "r") as f:
# for i in f.readlines():
# # print(i.replace("\n", ""))
# cdn_list = re.findall(cdn_re, i)
# if cdn_list and "kyfw.12306.cn:443" not in cdn_list:
# print(cdn_list[0].split(":")[0])
# cdn.append(cdn_list[0].split(":")[0])
# return cdn
path = os.path.join(os.path.dirname(__file__), '../cdn_list')
path = os.path.join(os.path.dirname(__file__), f'../{cdnFile}')
try:
with open(path, "r", encoding="utf-8") as f:
for i in f.readlines():
# print(i.replace("\n", ""))
if i and "kyfw.12306.cn:443" not in i:
cdn.append(i.replace("\n", ""))
return cdn
except Exception:
with open(path, "r") as f:
for i in f.readlines():
# print(i.replace("\n", ""))
if i and "kyfw.12306.cn:443" not in i:
cdn.append(i.replace("\n", ""))
return cdn
def filterCdn():
"""
过滤cdn, 过滤逻辑为当前cdn响应值小于1000毫秒
过滤日志:
加入cdn: 116.77.75.146
:return:
"""
cdns = open_cdn_file("cdn_list")
cdnss = [cdns[i:i + 50] for i in range(0, len(cdns), 50)]
cdnThread = []
for cdn in cdnss:
t = CDNProxy(cdn)
cdnThread.append(t)
for cdn_t in cdnThread:
cdn_t.start()
for cdn_j in cdnThread:
cdn_j.join()
print(f"当前有效cdn个数为: {len(cdn_list)}")
if cdn_list:
f = open(r"../filter_cdn_list", "a+")
for c in cdn_list:
f.writelines(f"{c}\n")
f.close()
if __name__ == '__main__':
cdn = CDNProxy()
print(cdn.open_cdn_file())
filterCdn()

View File

@ -15,6 +15,7 @@ urls = {
"s_time": 0.1,
"is_logger": True,
"is_json": True,
"is_cdn": True,
},
"uamtk-static": { # 登录接口
"req_url": "/passport/web/auth/uamtk-static",
@ -27,6 +28,7 @@ urls = {
"s_time": 0.1,
"is_logger": True,
"is_json": True,
"is_cdn": True,
},
"login": { # 登录接口
"req_url": "/passport/web/login",
@ -38,6 +40,7 @@ urls = {
"re_time": 1,
"s_time": 0.5,
"is_logger": True,
"is_cdn": True,
"is_json": True,
},
@ -51,6 +54,7 @@ urls = {
"re_time": 1,
"s_time": 0.1,
"is_logger": False,
"is_cdn": True,
"is_json": False,
},
@ -65,6 +69,7 @@ urls = {
"s_time": 0.1,
"is_logger": False,
"is_json": False,
"is_cdn": True,
"not_decode": True,
},
"getCodeImg1": { # 登录验证码
@ -77,6 +82,7 @@ urls = {
"re_time": 1,
"s_time": 0.1,
"is_logger": True,
"is_cdn": True,
"is_json": False,
},
"codeCheck": { # 验证码校验
@ -89,6 +95,7 @@ urls = {
"re_time": 1,
"s_time": 0.1,
"is_logger": True,
"is_cdn": True,
"is_json": False,
},
"codeCheck1": { # 验证码校验
@ -100,6 +107,7 @@ urls = {
"re_try": 10,
"re_time": 1,
"s_time": 0.1,
"is_cdn": True,
"is_logger": True,
"is_json": False,
},
@ -112,6 +120,7 @@ urls = {
"re_time": 1,
"s_time": 0.1,
"is_logger": False,
"is_cdn": True,
"is_json": False,
},
"loginInitCdn": { # 登录页面
@ -124,6 +133,7 @@ urls = {
"s_time": 0.1,
"is_logger": False,
"is_test_cdn": True,
"is_cdn": True,
"is_json": False,
},
"loginInitCdn1": { # 登录页面
@ -136,6 +146,7 @@ urls = {
"s_time": 0.1,
"is_logger": False,
"is_test_cdn": False,
"is_cdn": True,
"is_json": False,
},
"getDevicesId": { # 获取用户信息
@ -146,6 +157,7 @@ urls = {
"re_try": 10,
"re_time": 1,
"s_time": 0.01,
"is_cdn": True,
"is_logger": True,
"is_json": False,
},
@ -157,6 +169,7 @@ urls = {
"re_try": 10,
"re_time": 1,
"s_time": 0.01,
"is_cdn": True,
"is_logger": False,
"is_json": False,
},
@ -169,6 +182,7 @@ urls = {
"re_time": 1,
"s_time": 0.1,
"is_logger": True,
"is_cdn": True,
"is_json": True,
},
"uamauthclient": { # 登录
@ -180,6 +194,7 @@ urls = {
"re_try": 10,
"re_time": 1,
"s_time": 0.1,
"is_cdn": True,
"is_logger": True,
"is_json": True,
},
@ -192,6 +207,7 @@ urls = {
"re_time": 0.1,
"s_time": 1,
"is_logger": False,
"is_cdn": True,
"is_json": False,
},
"GetJS": { # 订单页面js
@ -203,6 +219,7 @@ urls = {
"re_time": 0.1,
"s_time": 0.1,
"is_logger": False,
"is_cdn": True,
"is_json": False,
},
"odxmfwg": { # 订单页面js
@ -214,6 +231,7 @@ urls = {
"re_time": 0.1,
"s_time": 0.1,
"is_logger": False,
"is_cdn": True,
"is_json": False,
},
"get_passengerDTOs": { # 获取乘车人
@ -224,6 +242,7 @@ urls = {
"re_try": 10,
"re_time": 0.1,
"s_time": 0.1,
"is_cdn": True,
"is_logger": True,
"is_json": True,
},
@ -247,6 +266,7 @@ urls = {
"re_try": 1,
"re_time": 1,
"s_time": 1,
"is_cdn": True,
"is_logger": True,
"is_json": True,
},
@ -258,6 +278,7 @@ urls = {
"re_try": 10,
"re_time": 0.01,
"s_time": 0.1,
"is_cdn": True,
"is_logger": True,
"is_json": True,
},
@ -270,6 +291,7 @@ urls = {
"re_time": 0.01,
"s_time": 0.1,
"is_logger": True,
"is_cdn": True,
"is_json": True,
},
"getQueueCountUrl": { # 剩余余票数
@ -281,6 +303,7 @@ urls = {
"re_time": 0.01,
"s_time": 0.1,
"is_logger": True,
"is_cdn": True,
"is_json": True,
},
"checkQueueOrderUrl": { # 订单队列排队
@ -292,6 +315,7 @@ urls = {
"re_time": 0.01,
"s_time": 0.1,
"is_logger": True,
"is_cdn": True,
"is_json": True,
},
"checkRandCodeAnsyn": { # 暂时没用到
@ -302,6 +326,7 @@ urls = {
"re_try": 10,
"re_time": 0.01,
"s_time": 0.1,
"is_cdn": True,
"is_logger": True,
"is_json": True,
},
@ -314,6 +339,7 @@ urls = {
"re_time": 0.01,
"s_time": 0.1,
"is_logger": False,
"is_cdn": True,
"is_json": False,
},
"queryOrderWaitTimeUrl": { # 订单等待页面
@ -325,6 +351,7 @@ urls = {
"re_time": 0.01,
"s_time": 0.1,
"is_logger": True,
"is_cdn": True,
"is_json": True,
},
"queryMyOrderNoCompleteUrl": { # 订单查询页面
@ -336,6 +363,7 @@ urls = {
"re_time": 0.01,
"s_time": 0.1,
"is_logger": True,
"is_cdn": True,
"is_json": True,
},
"initNoCompleteUrl": { # 获取订单列表
@ -347,6 +375,7 @@ urls = {
"re_time": 0.01,
"s_time": 0.1,
"is_logger": False,
"is_cdn": True,
"is_json": False,
},
"cancelNoCompleteMyOrder": { # 取消订单
@ -357,6 +386,7 @@ urls = {
"re_try": 10,
"re_time": 0.01,
"s_time": 0.1,
"is_cdn": True,
"is_logger": True,
"is_json": True,
},
@ -370,6 +400,7 @@ urls = {
"re_time": 0.01,
"s_time": 0.1,
"is_logger": True,
"is_cdn": True,
"is_json": True,
},
"getQueueCountAsync": { # 快速获取订单数据
@ -382,6 +413,7 @@ urls = {
"re_time": 0.01,
"s_time": 0.1,
"is_logger": True,
"is_cdn": True,
"is_json": True,
},
"confirmSingleForQueueAsys": { # 快速订单排队
@ -394,6 +426,7 @@ urls = {
"re_time": 0.01,
"s_time": 0.1,
"is_logger": True,
"is_cdn": True,
"is_json": True,
},
"Pushbear": { # push通知
@ -420,68 +453,6 @@ urls = {
"is_logger": True,
"is_json": True,
},
"cdn_host": {
"req_url": "http://ping.chinaz.com/kyfw.12306.cn",
"req_type": "post"
},
"cdn_list": {
"req_url": "http://ping.chinaz.com/iframe.ashx?t=ping&callback=jQuery111304824429956769827_{}".format(int(round(time.time() * 1000))),
"req_type": "post"
},
"TPLINK": { # TPLINK请求地址
"req_url": "/",
"req_type": "post",
"Referer": "",
"Content-Type": 1,
"Host": "192.168.0.1",
"re_try": 10,
"re_time": 0.01,
"s_time": 0.1,
"is_logger": False,
"is_json": True,
"httpType": "http"
},
"TPds": { # TPLINK路由器内部切换地址
"req_url": "/stok={}/ds",
"req_type": "post",
"Referer": "",
"Content-Type": 1,
"Host": "192.168.0.1",
"re_try": 10,
"re_time": 0.01,
"s_time": 0.1,
"is_logger": False,
"is_json": True,
"httpType": "http"
},
"xiaomiHome": { # 小米路由器登录
"req_url": "/cgi-bin/luci/web",
"req_type": "get",
"Referer": "",
"Content-Type": 1,
"Host": "192.168.31.1",
"re_try": 10,
"re_time": 0.01,
"s_time": 0.1,
"is_logger": False,
"is_json": False,
"httpType": "http"
},
"xiaomi": { # 小米路由器登录
"req_url": "/cgi-bin/luci/api/xqsystem/login",
"req_type": "post",
"Referer": "",
"Content-Type": 1,
"Host": "192.168.31.1",
"re_try": 10,
"re_time": 0.01,
"s_time": 0.1,
"is_logger": False,
"is_json": True,
"httpType": "http"
},
"loginHtml": { # 登录接口2
"req_url": "/otn/resources/login.html",
"req_type": "get",
@ -490,6 +461,7 @@ urls = {
"re_try": 10,
"re_time": 0.3,
"s_time": 0.1,
"is_cdn": True,
"is_logger": True,
"is_json": True,
},
@ -501,6 +473,7 @@ urls = {
"re_try": 10,
"re_time": 0.3,
"s_time": 0.1,
"is_cdn": True,
"is_logger": True,
"is_json": True,
},
@ -511,6 +484,7 @@ urls = {
"Host": "kyfw.12306.cn",
"re_try": 10,
"re_time": 0.3,
"is_cdn": True,
"s_time": 0.1,
"is_logger": True,
"is_json": True,
@ -528,6 +502,7 @@ urls = {
"re_try": 10,
"re_time": 0.01,
"s_time": 0.01,
"is_cdn": True,
"is_logger": True,
"is_json": True,
},
@ -539,6 +514,7 @@ urls = {
"re_try": 10,
"re_time": 0.01,
"s_time": 0.01,
"is_cdn": True,
"is_logger": True,
"is_json": True,
},
@ -550,6 +526,7 @@ urls = {
"re_try": 10,
"re_time": 0.01,
"s_time": 0.01,
"is_cdn": True,
"is_logger": True,
"is_json": True,
},
@ -561,6 +538,7 @@ urls = {
"re_try": 10,
"re_time": 0.01,
"s_time": 0.01,
"is_cdn": True,
"is_logger": True,
"is_json": True,
},
@ -572,6 +550,7 @@ urls = {
"re_try": 10,
"re_time": 0.01,
"s_time": 0.01,
"is_cdn": True,
"is_logger": True,
"is_json": True,
},
@ -583,6 +562,7 @@ urls = {
"re_try": 10,
"re_time": 0.01,
"s_time": 0.01,
"is_cdn": True,
"is_logger": True,
"is_json": True,
},

View File

@ -32,13 +32,6 @@ class GoLogin:
验证码校验
:return:
"""
# codeCheck = self.session.urls["codeCheck"]
# codeCheckData = {
# "answer": self.randCode,
# "rand": "sjrand",
# "login_site": "E"
# }
# fresult = self.session.httpClint.send(codeCheck, codeCheckData)
codeCheckUrl = copy.deepcopy(self.session.urls["codeCheck1"])
codeCheckUrl["req_url"] = codeCheckUrl["req_url"].format(self.randCode, int(time.time() * 1000))
fresult = self.session.httpClint.send(codeCheckUrl)
@ -124,7 +117,6 @@ class GoLogin:
login_num = 0
while True:
if loginConf(self.session):
# self.auth()
result = getPassCodeNewOrderAndLogin1(session=self.session, imgType="login")
if not result:

View File

@ -8,7 +8,7 @@ import threading
import time
import TickerConfig
import wrapcache
from agency.cdn_utils import CDNProxy
from agency.cdn_utils import CDNProxy, open_cdn_file
from config import urlConf, configCommon
from config.TicketEnmu import ticket
from config.configCommon import seat_conf_2, seat_conf
@ -34,13 +34,14 @@ class select:
快速提交车票通道
"""
def __init__(self):
self.cdn_list = open_cdn_file("filter_cdn_list")
self.get_ticket_info()
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.urls = urlConf.urls
self.login = GoLogin(self, TickerConfig.IS_AUTO_CODE, self.auto_code_type)
self.cdn_list = []
self.cookies = ""
self.queryUrl = "leftTicket/queryO"
self.passengerTicketStrList = ""
@ -115,47 +116,11 @@ class select:
configCommon.checkSleepTime(self) # 防止网上启动晚上到点休眠
self.login.go_login()
def cdn_req(self, cdn):
for i in range(len(cdn) - 1):
http = HTTPClient(0)
http.set_cookies(self.cookies)
urls = self.urls["loginInitCdn"]
http._cdn = cdn[i].replace("\n", "")
start_time = datetime.datetime.now()
time.sleep(3)
rep = http.send(urls)
if rep and "message" not in rep and (datetime.datetime.now() - start_time).microseconds / 1000 < 500:
if cdn[i].replace("\n", "") not in self.cdn_list: # 如果有重复的cdn则放弃加入
# print(u"加入cdn {0}".format(cdn[i].replace("\n", "")))
self.cdn_list.append(cdn[i].replace("\n", ""))
print(u"所有cdn解析完成...")
def cdn_certification(self):
"""
cdn 认证
:return:
"""
if TickerConfig.IS_CDN == 1:
CDN = CDNProxy()
all_cdn = CDN.open_cdn_file()
if all_cdn:
# print(u"由于12306网站策略调整cdn功能暂时关闭。")
print(u"开启cdn查询")
print(u"本次待筛选cdn总数为{}, 筛选时间大约为5-10min".format(len(all_cdn)))
t = threading.Thread(target=self.cdn_req, args=(all_cdn,))
t.setDaemon(True)
# t2 = threading.Thread(target=self.set_cdn, args=())
t.start()
# t2.start()
else:
raise ticketConfigException(u"cdn列表为空请先加载cdn")
def main(self):
l = liftTicketInit(self)
l.reqLiftTicketInit()
getDrvicesID(self)
self.call_login()
self.cdn_certification()
check_user = checkUser(self)
t = threading.Thread(target=check_user.sendCheckUser)
t.setDaemon(True)

View File

@ -63,8 +63,7 @@ class query:
查询
:return:
"""
if TickerConfig.IS_CDN == 1:
if self.session.cdn_list:
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)]
for station_date in self.station_dates:
select_url = copy.copy(self.urls["select_url"])

View File

@ -1,7 +1,3 @@
beautifulsoup4==4.5.3
bs4==0.0.1
PyYAML==5.1.1
six==1.10.0
requests==2.18.4
Pillow
wrapcache==1.0.8
@ -9,7 +5,7 @@ ntplib==0.3.3
sklearn
opencv-python
keras==2.2.4
tensorflow==1.15.0rc1
tensorflow==1.14.0
matplotlib>=3.0.2
numpy>=1.14.6
scipy>=1.1.0

39
run.py
View File

@ -1,22 +1,31 @@
# -*- coding=utf-8 -*-
from config.emailConf import sendEmail
from config.serverchanConf import sendServerChan
from init import select_ticket_info
import argparse
import sys
def run():
select_ticket_info.select().main()
def parser_arguments(argv):
"""
不应该在这里定义先放在这里
:param argv:
:return:
"""
parser = argparse.ArgumentParser()
parser.add_argument("operate", type=str, help="r: 运行抢票程序, c: 过滤cdn, t: 测试邮箱和server酱server酱需要打开开关")
def Email():
sendEmail(u"订票小助手测试一下")
def PushServerChan():
sendServerChan("订票小助手测试一下")
return parser.parse_args(argv)
if __name__ == '__main__':
run()
# Email()
# PushbearConf()
args = parser_arguments(sys.argv[1:])
if args.operate == "r":
from init import select_ticket_info
select_ticket_info.select().main()
elif args.operate == "t":
from config.emailConf import sendEmail
from config.serverchanConf import sendServerChan
sendEmail(u"订票小助手测试一下")
sendServerChan("订票小助手测试一下")
elif args.operate == "c":
from agency.cdn_utils import filterCdn
filterCdn()

File diff suppressed because one or more lines are too long