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),表示感谢 - 验证码目前可以本地识别,需要下载模型,放于项目根目录,全部代码来源于此项目 [传送门](https://github.com/zhaipro/easy12306),表示感谢
``` ```
PS:
1. 模型下载链接:https://pan.baidu.com/s/1rS155VjweWVWIJogakechA 密码:bmlm 1. 模型下载链接:https://pan.baidu.com/s/1rS155VjweWVWIJogakechA 密码:bmlm
群里面也可以下载 群里面也可以下载
2. git仓库下载https://github.com/testerSunshine/12306model.git 2. git仓库下载https://github.com/testerSunshine/12306model.git
``` ```
- 自托管云打码服务器搭建:[12306_code_server](https://github.com/YinAoXiong/12306_code_server) - 自托管云打码服务器搭建:[12306_code_server](https://github.com/YinAoXiong/12306_code_server)
- 如果大家有空闲的服务器,可搭建之后这个 [issues](https://github.com/testerSunshine/12306/issues/446) 里面填入自己的服务器(请注意服务器安全!) - 如果大家有空闲的服务器,可搭建之后这个 [issues](https://github.com/testerSunshine/12306/issues/446) 里面填入自己的服务器(请注意服务器安全!)
- 项目依赖包查看 [requirements.txt](requirements.txt) - 项目依赖 [requirements.txt](requirements.txt)
- 安装方法x: - 安装方法x:
- root用户(避免多python环境产生问题): `pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt` - 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` - 非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)文件
- 可以配置邮箱,配置邮箱的格式在[配置](TickerConfig.py)里面可以看到ex - 可以配置邮箱,配置邮箱的格式在[配置](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语法格式 - 配置[配置](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`脚本对此进行了封装,可以通过如下命令进行启动 - 如果你的服务器安装了docker与docker-compose, 那么就可以通过`docker-compose`进行启动,`docker.sh`脚本对此进行了封装,可以通过如下命令进行启动
- 1、`sudo ./docker.sh run` #创建一个镜像并启动容器,如果镜像已经创建过了会直接启动容器。 - 1、`sudo ./docker.sh run` #创建一个镜像并启动容器,如果镜像已经创建过了会直接启动容器。
- 2、`sudo ./docker.sh restart` #修改配置文件后,通过此名命令可重新加载容器运行 - 2、`sudo ./docker.sh restart` #修改配置文件后,通过此名命令可重新加载容器运行

View File

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

View File

@ -1,88 +1,81 @@
# encoding=utf8 # encoding=utf8
import collections import datetime
import json
import os import os
import re
import sys
import csv
import requests import requests
from config import urlConf from config import urlConf
import threading
from config.urlConf import urls
try: from myUrllib.httpUtils import HTTPClient
reload(sys)
sys.setdefaultencoding('utf-8') cdn_list = []
except NameError:
pass
class CDNProxy: class CDNProxy(threading.Thread):
def __init__(self, host=None): def __init__(self, cdns):
self.host = host super().__init__()
self.cdns = cdns
self.urlConf = urlConf.urls self.urlConf = urlConf.urls
self.httpClint = requests self.httpClint = requests
self.city_list = [] self.city_list = []
self.timeout = 5 self.timeout = 5
def _set_header(self): def run(self):
"""设置header""" for cdn in self.cdns:
return { http = HTTPClient(0)
"Content-Type": "application/x-www-form-urlencoded; charset=utf-8", url = urls["loginInitCdn"]
"X-Requested-With": "xmlHttpRequest", http._cdn = cdn.replace("\n", "")
"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", start_time = datetime.datetime.now()
"Referer": "https://kyfw.12306.cn/otn/login/init", rep = http.send(url)
"Accept": "*/*", 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 = []
# cdn_re = re.compile("CONNECT (\S+) HTTP/1.1") path = os.path.join(os.path.dirname(__file__), f'../{cdnFile}')
# path = os.path.join(os.path.dirname(__file__), '../cdn_list') try:
# with open(path, "r") as f: with open(path, "r", encoding="utf-8") as f:
# for i in f.readlines(): for i in f.readlines():
# # print(i.replace("\n", "")) if i and "kyfw.12306.cn:443" not in i:
# cdn_list = re.findall(cdn_re, i) cdn.append(i.replace("\n", ""))
# if cdn_list and "kyfw.12306.cn:443" not in cdn_list: return cdn
# print(cdn_list[0].split(":")[0]) except Exception:
# cdn.append(cdn_list[0].split(":")[0]) with open(path, "r") as f:
# return cdn for i in f.readlines():
path = os.path.join(os.path.dirname(__file__), '../cdn_list') if i and "kyfw.12306.cn:443" not in i:
try: cdn.append(i.replace("\n", ""))
with open(path, "r", encoding="utf-8") as f: return cdn
for i in f.readlines():
# print(i.replace("\n", ""))
if i and "kyfw.12306.cn:443" not in i: def filterCdn():
cdn.append(i.replace("\n", "")) """
return cdn 过滤cdn, 过滤逻辑为当前cdn响应值小于1000毫秒
except Exception: 过滤日志:
with open(path, "r") as f: 加入cdn: 116.77.75.146
for i in f.readlines(): :return:
# print(i.replace("\n", "")) """
if i and "kyfw.12306.cn:443" not in i: cdns = open_cdn_file("cdn_list")
cdn.append(i.replace("\n", "")) cdnss = [cdns[i:i + 50] for i in range(0, len(cdns), 50)]
return cdn 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__': if __name__ == '__main__':
cdn = CDNProxy() filterCdn()
print(cdn.open_cdn_file())

View File

@ -15,6 +15,7 @@ urls = {
"s_time": 0.1, "s_time": 0.1,
"is_logger": True, "is_logger": True,
"is_json": True, "is_json": True,
"is_cdn": True,
}, },
"uamtk-static": { # 登录接口 "uamtk-static": { # 登录接口
"req_url": "/passport/web/auth/uamtk-static", "req_url": "/passport/web/auth/uamtk-static",
@ -27,6 +28,7 @@ urls = {
"s_time": 0.1, "s_time": 0.1,
"is_logger": True, "is_logger": True,
"is_json": True, "is_json": True,
"is_cdn": True,
}, },
"login": { # 登录接口 "login": { # 登录接口
"req_url": "/passport/web/login", "req_url": "/passport/web/login",
@ -38,6 +40,7 @@ urls = {
"re_time": 1, "re_time": 1,
"s_time": 0.5, "s_time": 0.5,
"is_logger": True, "is_logger": True,
"is_cdn": True,
"is_json": True, "is_json": True,
}, },
@ -51,6 +54,7 @@ urls = {
"re_time": 1, "re_time": 1,
"s_time": 0.1, "s_time": 0.1,
"is_logger": False, "is_logger": False,
"is_cdn": True,
"is_json": False, "is_json": False,
}, },
@ -65,6 +69,7 @@ urls = {
"s_time": 0.1, "s_time": 0.1,
"is_logger": False, "is_logger": False,
"is_json": False, "is_json": False,
"is_cdn": True,
"not_decode": True, "not_decode": True,
}, },
"getCodeImg1": { # 登录验证码 "getCodeImg1": { # 登录验证码
@ -77,6 +82,7 @@ urls = {
"re_time": 1, "re_time": 1,
"s_time": 0.1, "s_time": 0.1,
"is_logger": True, "is_logger": True,
"is_cdn": True,
"is_json": False, "is_json": False,
}, },
"codeCheck": { # 验证码校验 "codeCheck": { # 验证码校验
@ -89,6 +95,7 @@ urls = {
"re_time": 1, "re_time": 1,
"s_time": 0.1, "s_time": 0.1,
"is_logger": True, "is_logger": True,
"is_cdn": True,
"is_json": False, "is_json": False,
}, },
"codeCheck1": { # 验证码校验 "codeCheck1": { # 验证码校验
@ -100,6 +107,7 @@ urls = {
"re_try": 10, "re_try": 10,
"re_time": 1, "re_time": 1,
"s_time": 0.1, "s_time": 0.1,
"is_cdn": True,
"is_logger": True, "is_logger": True,
"is_json": False, "is_json": False,
}, },
@ -112,6 +120,7 @@ urls = {
"re_time": 1, "re_time": 1,
"s_time": 0.1, "s_time": 0.1,
"is_logger": False, "is_logger": False,
"is_cdn": True,
"is_json": False, "is_json": False,
}, },
"loginInitCdn": { # 登录页面 "loginInitCdn": { # 登录页面
@ -124,6 +133,7 @@ urls = {
"s_time": 0.1, "s_time": 0.1,
"is_logger": False, "is_logger": False,
"is_test_cdn": True, "is_test_cdn": True,
"is_cdn": True,
"is_json": False, "is_json": False,
}, },
"loginInitCdn1": { # 登录页面 "loginInitCdn1": { # 登录页面
@ -136,6 +146,7 @@ urls = {
"s_time": 0.1, "s_time": 0.1,
"is_logger": False, "is_logger": False,
"is_test_cdn": False, "is_test_cdn": False,
"is_cdn": True,
"is_json": False, "is_json": False,
}, },
"getDevicesId": { # 获取用户信息 "getDevicesId": { # 获取用户信息
@ -146,6 +157,7 @@ urls = {
"re_try": 10, "re_try": 10,
"re_time": 1, "re_time": 1,
"s_time": 0.01, "s_time": 0.01,
"is_cdn": True,
"is_logger": True, "is_logger": True,
"is_json": False, "is_json": False,
}, },
@ -157,6 +169,7 @@ urls = {
"re_try": 10, "re_try": 10,
"re_time": 1, "re_time": 1,
"s_time": 0.01, "s_time": 0.01,
"is_cdn": True,
"is_logger": False, "is_logger": False,
"is_json": False, "is_json": False,
}, },
@ -169,6 +182,7 @@ urls = {
"re_time": 1, "re_time": 1,
"s_time": 0.1, "s_time": 0.1,
"is_logger": True, "is_logger": True,
"is_cdn": True,
"is_json": True, "is_json": True,
}, },
"uamauthclient": { # 登录 "uamauthclient": { # 登录
@ -180,6 +194,7 @@ urls = {
"re_try": 10, "re_try": 10,
"re_time": 1, "re_time": 1,
"s_time": 0.1, "s_time": 0.1,
"is_cdn": True,
"is_logger": True, "is_logger": True,
"is_json": True, "is_json": True,
}, },
@ -192,6 +207,7 @@ urls = {
"re_time": 0.1, "re_time": 0.1,
"s_time": 1, "s_time": 1,
"is_logger": False, "is_logger": False,
"is_cdn": True,
"is_json": False, "is_json": False,
}, },
"GetJS": { # 订单页面js "GetJS": { # 订单页面js
@ -203,6 +219,7 @@ urls = {
"re_time": 0.1, "re_time": 0.1,
"s_time": 0.1, "s_time": 0.1,
"is_logger": False, "is_logger": False,
"is_cdn": True,
"is_json": False, "is_json": False,
}, },
"odxmfwg": { # 订单页面js "odxmfwg": { # 订单页面js
@ -214,6 +231,7 @@ urls = {
"re_time": 0.1, "re_time": 0.1,
"s_time": 0.1, "s_time": 0.1,
"is_logger": False, "is_logger": False,
"is_cdn": True,
"is_json": False, "is_json": False,
}, },
"get_passengerDTOs": { # 获取乘车人 "get_passengerDTOs": { # 获取乘车人
@ -224,6 +242,7 @@ urls = {
"re_try": 10, "re_try": 10,
"re_time": 0.1, "re_time": 0.1,
"s_time": 0.1, "s_time": 0.1,
"is_cdn": True,
"is_logger": True, "is_logger": True,
"is_json": True, "is_json": True,
}, },
@ -247,6 +266,7 @@ urls = {
"re_try": 1, "re_try": 1,
"re_time": 1, "re_time": 1,
"s_time": 1, "s_time": 1,
"is_cdn": True,
"is_logger": True, "is_logger": True,
"is_json": True, "is_json": True,
}, },
@ -258,6 +278,7 @@ urls = {
"re_try": 10, "re_try": 10,
"re_time": 0.01, "re_time": 0.01,
"s_time": 0.1, "s_time": 0.1,
"is_cdn": True,
"is_logger": True, "is_logger": True,
"is_json": True, "is_json": True,
}, },
@ -270,6 +291,7 @@ urls = {
"re_time": 0.01, "re_time": 0.01,
"s_time": 0.1, "s_time": 0.1,
"is_logger": True, "is_logger": True,
"is_cdn": True,
"is_json": True, "is_json": True,
}, },
"getQueueCountUrl": { # 剩余余票数 "getQueueCountUrl": { # 剩余余票数
@ -281,6 +303,7 @@ urls = {
"re_time": 0.01, "re_time": 0.01,
"s_time": 0.1, "s_time": 0.1,
"is_logger": True, "is_logger": True,
"is_cdn": True,
"is_json": True, "is_json": True,
}, },
"checkQueueOrderUrl": { # 订单队列排队 "checkQueueOrderUrl": { # 订单队列排队
@ -292,6 +315,7 @@ urls = {
"re_time": 0.01, "re_time": 0.01,
"s_time": 0.1, "s_time": 0.1,
"is_logger": True, "is_logger": True,
"is_cdn": True,
"is_json": True, "is_json": True,
}, },
"checkRandCodeAnsyn": { # 暂时没用到 "checkRandCodeAnsyn": { # 暂时没用到
@ -302,6 +326,7 @@ urls = {
"re_try": 10, "re_try": 10,
"re_time": 0.01, "re_time": 0.01,
"s_time": 0.1, "s_time": 0.1,
"is_cdn": True,
"is_logger": True, "is_logger": True,
"is_json": True, "is_json": True,
}, },
@ -314,6 +339,7 @@ urls = {
"re_time": 0.01, "re_time": 0.01,
"s_time": 0.1, "s_time": 0.1,
"is_logger": False, "is_logger": False,
"is_cdn": True,
"is_json": False, "is_json": False,
}, },
"queryOrderWaitTimeUrl": { # 订单等待页面 "queryOrderWaitTimeUrl": { # 订单等待页面
@ -325,6 +351,7 @@ urls = {
"re_time": 0.01, "re_time": 0.01,
"s_time": 0.1, "s_time": 0.1,
"is_logger": True, "is_logger": True,
"is_cdn": True,
"is_json": True, "is_json": True,
}, },
"queryMyOrderNoCompleteUrl": { # 订单查询页面 "queryMyOrderNoCompleteUrl": { # 订单查询页面
@ -336,6 +363,7 @@ urls = {
"re_time": 0.01, "re_time": 0.01,
"s_time": 0.1, "s_time": 0.1,
"is_logger": True, "is_logger": True,
"is_cdn": True,
"is_json": True, "is_json": True,
}, },
"initNoCompleteUrl": { # 获取订单列表 "initNoCompleteUrl": { # 获取订单列表
@ -347,6 +375,7 @@ urls = {
"re_time": 0.01, "re_time": 0.01,
"s_time": 0.1, "s_time": 0.1,
"is_logger": False, "is_logger": False,
"is_cdn": True,
"is_json": False, "is_json": False,
}, },
"cancelNoCompleteMyOrder": { # 取消订单 "cancelNoCompleteMyOrder": { # 取消订单
@ -357,6 +386,7 @@ urls = {
"re_try": 10, "re_try": 10,
"re_time": 0.01, "re_time": 0.01,
"s_time": 0.1, "s_time": 0.1,
"is_cdn": True,
"is_logger": True, "is_logger": True,
"is_json": True, "is_json": True,
}, },
@ -370,6 +400,7 @@ urls = {
"re_time": 0.01, "re_time": 0.01,
"s_time": 0.1, "s_time": 0.1,
"is_logger": True, "is_logger": True,
"is_cdn": True,
"is_json": True, "is_json": True,
}, },
"getQueueCountAsync": { # 快速获取订单数据 "getQueueCountAsync": { # 快速获取订单数据
@ -382,6 +413,7 @@ urls = {
"re_time": 0.01, "re_time": 0.01,
"s_time": 0.1, "s_time": 0.1,
"is_logger": True, "is_logger": True,
"is_cdn": True,
"is_json": True, "is_json": True,
}, },
"confirmSingleForQueueAsys": { # 快速订单排队 "confirmSingleForQueueAsys": { # 快速订单排队
@ -394,6 +426,7 @@ urls = {
"re_time": 0.01, "re_time": 0.01,
"s_time": 0.1, "s_time": 0.1,
"is_logger": True, "is_logger": True,
"is_cdn": True,
"is_json": True, "is_json": True,
}, },
"Pushbear": { # push通知 "Pushbear": { # push通知
@ -420,68 +453,6 @@ urls = {
"is_logger": True, "is_logger": True,
"is_json": 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 "loginHtml": { # 登录接口2
"req_url": "/otn/resources/login.html", "req_url": "/otn/resources/login.html",
"req_type": "get", "req_type": "get",
@ -490,6 +461,7 @@ urls = {
"re_try": 10, "re_try": 10,
"re_time": 0.3, "re_time": 0.3,
"s_time": 0.1, "s_time": 0.1,
"is_cdn": True,
"is_logger": True, "is_logger": True,
"is_json": True, "is_json": True,
}, },
@ -501,6 +473,7 @@ urls = {
"re_try": 10, "re_try": 10,
"re_time": 0.3, "re_time": 0.3,
"s_time": 0.1, "s_time": 0.1,
"is_cdn": True,
"is_logger": True, "is_logger": True,
"is_json": True, "is_json": True,
}, },
@ -511,6 +484,7 @@ urls = {
"Host": "kyfw.12306.cn", "Host": "kyfw.12306.cn",
"re_try": 10, "re_try": 10,
"re_time": 0.3, "re_time": 0.3,
"is_cdn": True,
"s_time": 0.1, "s_time": 0.1,
"is_logger": True, "is_logger": True,
"is_json": True, "is_json": True,
@ -528,6 +502,7 @@ urls = {
"re_try": 10, "re_try": 10,
"re_time": 0.01, "re_time": 0.01,
"s_time": 0.01, "s_time": 0.01,
"is_cdn": True,
"is_logger": True, "is_logger": True,
"is_json": True, "is_json": True,
}, },
@ -539,6 +514,7 @@ urls = {
"re_try": 10, "re_try": 10,
"re_time": 0.01, "re_time": 0.01,
"s_time": 0.01, "s_time": 0.01,
"is_cdn": True,
"is_logger": True, "is_logger": True,
"is_json": True, "is_json": True,
}, },
@ -550,6 +526,7 @@ urls = {
"re_try": 10, "re_try": 10,
"re_time": 0.01, "re_time": 0.01,
"s_time": 0.01, "s_time": 0.01,
"is_cdn": True,
"is_logger": True, "is_logger": True,
"is_json": True, "is_json": True,
}, },
@ -561,6 +538,7 @@ urls = {
"re_try": 10, "re_try": 10,
"re_time": 0.01, "re_time": 0.01,
"s_time": 0.01, "s_time": 0.01,
"is_cdn": True,
"is_logger": True, "is_logger": True,
"is_json": True, "is_json": True,
}, },
@ -572,6 +550,7 @@ urls = {
"re_try": 10, "re_try": 10,
"re_time": 0.01, "re_time": 0.01,
"s_time": 0.01, "s_time": 0.01,
"is_cdn": True,
"is_logger": True, "is_logger": True,
"is_json": True, "is_json": True,
}, },
@ -583,6 +562,7 @@ urls = {
"re_try": 10, "re_try": 10,
"re_time": 0.01, "re_time": 0.01,
"s_time": 0.01, "s_time": 0.01,
"is_cdn": True,
"is_logger": True, "is_logger": True,
"is_json": True, "is_json": True,
}, },

View File

@ -32,13 +32,6 @@ class GoLogin:
验证码校验 验证码校验
:return: :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 = copy.deepcopy(self.session.urls["codeCheck1"])
codeCheckUrl["req_url"] = codeCheckUrl["req_url"].format(self.randCode, int(time.time() * 1000)) codeCheckUrl["req_url"] = codeCheckUrl["req_url"].format(self.randCode, int(time.time() * 1000))
fresult = self.session.httpClint.send(codeCheckUrl) fresult = self.session.httpClint.send(codeCheckUrl)
@ -124,7 +117,6 @@ class GoLogin:
login_num = 0 login_num = 0
while True: while True:
if loginConf(self.session): if loginConf(self.session):
# self.auth()
result = getPassCodeNewOrderAndLogin1(session=self.session, imgType="login") result = getPassCodeNewOrderAndLogin1(session=self.session, imgType="login")
if not result: if not result:

View File

@ -8,7 +8,7 @@ import threading
import time import time
import TickerConfig import TickerConfig
import wrapcache import wrapcache
from agency.cdn_utils import CDNProxy from agency.cdn_utils import CDNProxy, open_cdn_file
from config import urlConf, configCommon from config import urlConf, configCommon
from config.TicketEnmu import ticket from config.TicketEnmu import ticket
from config.configCommon import seat_conf_2, seat_conf from config.configCommon import seat_conf_2, seat_conf
@ -34,13 +34,14 @@ class select:
快速提交车票通道 快速提交车票通道
""" """
def __init__(self): def __init__(self):
self.cdn_list = open_cdn_file("filter_cdn_list")
self.get_ticket_info() self.get_ticket_info()
self._station_seat = [seat_conf[x] for x in TickerConfig.SET_TYPE] self._station_seat = [seat_conf[x] for x in TickerConfig.SET_TYPE]
self.auto_code_type = TickerConfig.AUTO_CODE_TYPE self.auto_code_type = TickerConfig.AUTO_CODE_TYPE
self.httpClint = HTTPClient(TickerConfig.IS_PROXY) 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.urls = urlConf.urls
self.login = GoLogin(self, TickerConfig.IS_AUTO_CODE, self.auto_code_type) self.login = GoLogin(self, TickerConfig.IS_AUTO_CODE, self.auto_code_type)
self.cdn_list = []
self.cookies = "" self.cookies = ""
self.queryUrl = "leftTicket/queryO" self.queryUrl = "leftTicket/queryO"
self.passengerTicketStrList = "" self.passengerTicketStrList = ""
@ -115,47 +116,11 @@ class select:
configCommon.checkSleepTime(self) # 防止网上启动晚上到点休眠 configCommon.checkSleepTime(self) # 防止网上启动晚上到点休眠
self.login.go_login() 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): def main(self):
l = liftTicketInit(self) l = liftTicketInit(self)
l.reqLiftTicketInit() l.reqLiftTicketInit()
getDrvicesID(self) getDrvicesID(self)
self.call_login() self.call_login()
self.cdn_certification()
check_user = checkUser(self) check_user = checkUser(self)
t = threading.Thread(target=check_user.sendCheckUser) t = threading.Thread(target=check_user.sendCheckUser)
t.setDaemon(True) t.setDaemon(True)

View File

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

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 requests==2.18.4
Pillow Pillow
wrapcache==1.0.8 wrapcache==1.0.8
@ -9,7 +5,7 @@ ntplib==0.3.3
sklearn sklearn
opencv-python opencv-python
keras==2.2.4 keras==2.2.4
tensorflow==1.15.0rc1 tensorflow==1.14.0
matplotlib>=3.0.2 matplotlib>=3.0.2
numpy>=1.14.6 numpy>=1.14.6
scipy>=1.1.0 scipy>=1.1.0

39
run.py
View File

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