Skip to content
This repository has been archived by the owner on Dec 19, 2023. It is now read-only.

添加滑块验证功能 #744

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file modified .dockerignore
100755 → 100644
Empty file.
Empty file modified .gitignore
100755 → 100644
Empty file.
5 changes: 5 additions & 0 deletions README.md
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,11 @@
- 开始抢票:`docker-compose up --build -d`
- 停止抢票:`docker-compose down`
- 查看抢票log: `docker logs --follow ticket`
- 关于滑块验证
- 下单模式3采用pyppeteer模拟鼠标操作下单,可以过放票时的滑块验证。但目前还不稳定,可能出现进入订单页面时仍需要登陆的情况,原因未知。
- 建议将headless设置为False,如果出现问题可以手动操作,特别是在进入订单页面显示需要登陆时,可以手动登陆。
- 该功能还在完善中,目前肯定有BUG,请不要过于依赖此功能
- **注意:pyppeteer 需要安装hromium (~100MB).脚本会在第一次运行时自动安装,你也可以在跑脚本之前执行pyppeteer-install进行安装**

#### 目录对应说明
- agency - cdn代理
Expand Down
37 changes: 20 additions & 17 deletions TickerConfig.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

# 出发日期(list) "2018-01-06", "2018-01-07"
STATION_DATES = [
"2020-01-18"
"2020-02-09"
]

# 填入需要购买的车次(list),"G1353"
Expand All @@ -18,10 +18,10 @@
STATION_TRAINS = []

# 出发城市,比如深圳北,就填深圳就搜得到
FROM_STATION = "广州南"
FROM_STATION = "海口"

# 到达城市 比如深圳北,就填深圳就搜得到
TO_STATION = "隆回"
TO_STATION = "三亚"

# 座位(list) 多个座位ex:
# "商务座",
Expand All @@ -33,7 +33,7 @@
# "硬座",
# "无座",
# "动卧",
SET_TYPE = ["二等座"]
SET_TYPE = ["二等座","软卧","硬卧"]

# 当余票小于乘车人,如果选择优先提交,则删减联系人和余票数一致在提交
# bool
Expand All @@ -56,7 +56,7 @@

# 设置2本地自动打码,需要配置tensorflow和keras库,3为云打码,由于云打码服务器资源有限(为2h4C的cpu服务器),请不要恶意请求,不然只能关闭服务器
# ps: 请不要一直依赖云服务器资源,在此向所有提供服务器同学表示感谢
AUTO_CODE_TYPE = 3
AUTO_CODE_TYPE = 2

# 此处设置云打码服务器地址,如果有自建的服务器,可以自行更改
HOST = "120.77.154.140:8000"
Expand All @@ -80,12 +80,12 @@
# password: "授权码"
# host: "smtp.qq.com"
EMAIL_CONF = {
"IS_MAIL": True,
"IS_MAIL": False,
"email": "",
"notice_email_list": "",
"username": "",
"password": "",
"host": "smtp.qq.com",
"host": "",
}

# 是否开启 server酱 微信提醒, 使用前需要前往 http://sc.ftqq.com/3.version 扫码绑定获取 SECRET 并关注获得抢票结果通知的公众号
Expand All @@ -97,12 +97,17 @@
# 是否开启cdn查询,可以更快的检测票票 1为开启,2为关闭
IS_CDN = 1

# 下单接口分为两种,1 模拟网页自动捡漏下单(不稳定),2 模拟车次后面的购票按钮下单(稳如老狗)
ORDER_TYPE = 2
# 下单接口分为两种,1 模拟网页自动捡漏下单(不稳定),2 模拟车次后面的购票按钮下单(稳如老狗),3 pyppeteer模拟下单(可以模拟鼠标拖动滑块,但速度较慢,且不稳定)
ORDER_TYPE = 3

# 如果采用pyppeteer下单,可以选择浏览器在前台显示(Flase) 或后台运行(True),前台运行的话,如果有啥BUG可以手动操作,后台显示尚未测试
IS_HEADLESS = False



# 下单模式 1 为预售,整点刷新,刷新间隔0.1-0.5S, 然后会校验时间,比如12点的预售,那脚本就会在12.00整检票,刷新订单
# 2 是捡漏,捡漏的刷新间隔时间为0.5-3秒,时间间隔长,不容易封ip
ORDER_MODEL = 1
ORDER_MODEL = 2

# 是否开启代理, 0代表关闭, 1表示开始
# 开启此功能的时候请确保代理ip是否可用,在测试放里面经过充分的测试,再开启此功能,不然可能会耽误你购票的宝贵时间
Expand All @@ -117,19 +122,17 @@
# 1=使用selenium获取devicesID
# 2=使用网页端/otn/HttpZF/logdevice获取devicesId,这个接口的算法目前可能有点问题,如果登录一直302的请改为配置1
# 3=自己打开浏览器在headers-Cookies中抓取RAIL_DEVICEID和RAIL_EXPIRATION,这个就不用配置selenium
COOKIE_TYPE = 3
COOKIE_TYPE = 1
# 如果COOKIE_TYPE=1,则需配置chromeDriver路径,下载地址http://chromedriver.storage.googleapis.com/index.html
# chromedriver配置版本只要和chrome的大版本匹配就行
CHROME_PATH = "/usr/src/app/chromedriver"
CHROME_PATH = "/home/homura/12306/12306dev/12306/chromedriver"

# 为了docker37 准备的环境变量,windows环境可以不用管这个参数
CHROME_CHROME_PATH = "/opt/google/chrome/google-chrome"

# 如果COOKIE_TYPE=3, 则需配置RAIL_EXPIRATION、RAIL_DEVICEID的值
RAIL_EXPIRATION = ""
RAIL_DEVICEID = ""
# RAIL_EXPIRATION = "1577034103293"
# RAIL_DEVICEID = "CDno29Erc_Pf3FSXb4dzq-Op64EhWrsi5yUZKVIKR1MAfYo2qFlCeXD8VkexY7_1qg-ClV-fE8j9jgVlPZxRh3wVc2iqLe_5A8sdr62qZx4B22JPF8lFCjpgTKZ5ODW90HJd5tiQsJ1KR9nOqHRxHj1FT5LEIwfw"
RAIL_EXPIRATION = "1577034103293"
RAIL_DEVICEID = "CDno29Erc_Pf3FSXb4dzq-Op64EhWrsi5yUZKVIKR1MAfYo2qFlCeXD8VkexY7_1qg-ClV-fE8j9jgVlPZxRh3wVc2iqLe_5A8sdr62qZx4B22JPF8lFCjpgTKZ5ODW90HJd5tiQsJ1KR9nOqHRxHj1FT5LEIwfw"


# 1=>为一直随机ua,2->只启动的时候随机一次ua
Expand All @@ -154,4 +157,4 @@
MIN_TIME = 1

# 软件版本
RE_VERSION = "1.2.004"
RE_VERSION = "1.2.005"
Empty file modified __init__.py
100755 → 100644
Empty file.
Empty file modified agency/__init__.py
100755 → 100644
Empty file.
Empty file modified agency/agency_tools.py
100755 → 100644
Empty file.
Binary file added chromedriver
Binary file not shown.
Empty file modified config/__init__.py
100755 → 100644
Empty file.
Empty file modified config/configCommon.py
100755 → 100644
Empty file.
Empty file modified config/emailConf.py
100755 → 100644
Empty file.
Empty file modified config/logger.py
100755 → 100644
Empty file.
13 changes: 13 additions & 0 deletions config/urlConf.py
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,19 @@
"is_cdn": True,
"is_json": True,
},
"leftTicketPage":{ #车票查询页面
"req_url": "otn/leftTicket/init?linktypeid=dc&fs={0}&ts={1}&date={2}&flag=N,N,Y",
"req_type":"get",
"Referer":"",
"Content-Type": 1,
"Host": "kyfw.12306.cn",
"re_try": 10,
"re_time": 0.01,
"s_time": 0.1,
"is_logger": False,
"is_cdn": True,
"is_json": False
},
"Pushbear": { # push通知
"req_url": "/sub",
"req_type": "post",
Expand Down
Empty file modified docker_install_centos.sh
100755 → 100644
Empty file.
Empty file modified init/__init__.py
100755 → 100644
Empty file.
Empty file modified init/login.py
100755 → 100644
Empty file.
21 changes: 21 additions & 0 deletions init/select_ticket_info.py
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
from inter.LiftTicketInit import liftTicketInit
from inter.Query import query
from inter.SubmitOrderRequest import submitOrderRequest
from inter.SimulateOrderRequest import SimulateOrderRequest
from myException.PassengerUserException import PassengerUserException
from myException.UserPasswordException import UserPasswordException
from myException.ticketConfigException import ticketConfigException
Expand Down Expand Up @@ -211,6 +212,26 @@ def main(self):
self.passengerTicketStrList, self.oldPassengerStr, train_date,
TickerConfig.TICKET_PEOPLES)
sor.sendSubmitOrderRequest()
elif TickerConfig.ORDER_TYPE == 3: # selenium模拟下单
sele = SimulateOrderRequest(selectObj=self,
from_station=from_station,
to_station=to_station,
from_station_h=TickerConfig.FROM_STATION,
to_station_h=TickerConfig.TO_STATION,
_station_seat=self._station_seat,
station_trains=TickerConfig.STATION_TRAINS,
station_dates=TickerConfig.STATION_DATES,
ticke_peoples_num=len(TickerConfig.TICKET_PEOPLES),
train_no = train_no,
secretStr = secretStr,
set_type = self.set_type,
train_date=train_date,
passengerTicketStr=self.passengerTicketStrList,
oldPassengerStr=self.oldPassengerStr,
start_time = queryResult.get("start_time"),
)
sele.Do_simulate()

elif secretList: # 候补订单
c = chechFace(self, secretList, train_no)
c.sendChechFace()
Expand Down
4 changes: 3 additions & 1 deletion inter/CheckOrderInfo.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
from collections import OrderedDict
from inter.GetQueueCount import getQueueCount
from inter.GetRepeatSubmitToken import getRepeatSubmitToken

import sys
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

class checkOrderInfo:

Expand Down
1 change: 1 addition & 0 deletions inter/LiftTicketInit.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ def reqLiftTicketInit(self):
# 获取初始化的结果
result = self.session.httpClint.send(urls)
# 用正则表达式查出CLeftTicketUrl的值
#print(result)
matchObj = re.search('var CLeftTicketUrl = \'(.*)\'', result, re.M|re.I);
if matchObj:
# 如果有值,替换queryUrl
Expand Down
1 change: 1 addition & 0 deletions inter/Query.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ def sendQuery(self):
"is_more_ticket_num": is_more_ticket_num,
"cdn": self.httpClint.cdn,
"status": True,
"start_time":start_time
}
elif is_ticket_pass == '无' and ticket_info[37] == "1" and TickerConfig.TICKET_TYPE is 2:
"""
Expand Down
Loading