HMHYY 2019-03-14
image
每逢佳节抢票难,刷爆了抢票软件,透支了好友助力功能,甚至花钱开通了VIP包,可回家的票还是与自己一面之缘,只能看看却抢不到手!
这种状况不仅发生在我们身上,明星也是一样买不到票的!23日吴京发微博,称只要能回家,坐哪都成。故带了个小板凳坐在火车过道。
image
可对于连站票都抢不到的,又或者路途遥远的人,该怎么办呢?
当你还在忧伤这些问题的时候,程序员们已经开始通过 Python 程序控制浏览器自动抢票了。号称是史上最简单的抢票方式哦,领超其他抢票软件。前方高能,请拿小本本记下来,操作起来!
所需知识点
· selenium 自动化测试工具使用
**· **打码平台
**selenium **
SELENIUM是一个WEB的自动化测试工具,最初是为网站自动化测试而开发的,SELENIUM可以直接运行在浏览器上,它支持所有主流的浏览器(包括PHANTOMJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏。
程序脚本可以通过 SELENIUM API 控制浏览器。
官方地址:HTTPS://WWW.SELENIUMHQ.ORG/
运行流程
image
环境搭建与安装
安装 SELENIUM 模块:
PIP INSTALL SELENIUM</pre>
下载对应的浏览器驱动:
**· **chrome 驱动下载地址:https://sites.google.com/a/chromium.org/chromedriver/
**· **国内淘宝镜像:http://npm.taobao.org/mirrors/chromedriver/
注:必须在下对应的 chrome 版本对应的驱动
打码平台
可以通过第三方平台进行智能识别或者人工识别图片。
流程
image
优点
· 价格便宜
· 使用简单
· 识别率高
平台介绍:云打码 http://www.yundama.com/
基本使用
后台创建软件
image
在线测试:
http://www.yundama.com/demo.html
选择对应识别类型:
http://www.yundama.com/price.html
下载SDK:
http://www.yundama.com/apidoc/YDM_SDK.html
识别12306登录验证码
1 #!/USR/BIN/PYTHON3
2 # -- CODING: UTF-8 --
3 FROM YDMHTTP IMPORT DECODE
4 PRINT(DECODE('./TEST_PICS/TEST.JPG',CODETYPE=6701))</pre>
12306案例实现****分析购票流程
image
实现步骤
· 访问列表页
**· **通过时间判定选择点击预订
**· **点击账号登录
**· **输入用户名和密码
**· **截图获取验证码图片
**· **发送打码平台获取识别数字
**· **定义8个点击坐标
**· **模拟点击坐标
**· **点击登录
**· **点击选择人物
**· **点击提交订单
**· **点击确认订单
代码实现****访问列表页
1 # 访问列表页
2 FS = "上海,SHH"
3 TS = "北京,BJP"
4 DATE = "2019-01-11"
5 URL = "HTTPS://KYFW.12306.CN/OTN/LEFTTICKET/INIT?LINKTYPEID=DC&FS={}&TS={}&DATE={}&FLAG=N,N,Y"
6 BROWSER.GET(URL.FORMAT(FS,TS,DATE))</pre>
通过时间判定选择点击预订
1 # 获取 TR 列表
2 TR_LIST = WAIT.UNTIL(EC.VISIBILITY_OF_ALL_ELEMENTS_LOCATED((BY.CLASS_NAME,'BGC')))
3 FOR TR IN TR_LIST:
4 START_TIME = TR.FIND_ELEMENT_BY_CLASS_NAME('START-T').TEXT
5 # 内部可以判定出发时间
6 TR.FIND_ELEMENT_BY_CLASS_NAME('BTN72').CLICK()
7 BREAK</pre>
点击账号
1 ACCOUNT_LOGIN_ELEMENT = WAIT.UNTIL(EC.PRESENCE_OF_ELEMENT_LOCATED((BY.LINK_TEXT,'账号登录')))
2 ACCOUNT_LOGIN_ELEMENT.CLICK()</pre>
输入用户名和密码
1 BROWSER.FIND_ELEMENT_BY_ID('J-USERNAME').SEND_KEYS(USERNAME)
2 BROWSER.FIND_ELEMENT_BY_ID('J-PASSWORD').SEND_KEYS(PWD)</pre>
截取验证码图片
**· **需要安装图片操作库 PIP INSTALL PILLOW
**· **在MAC平台下如果是RETINA屏幕,屏幕上的一个点相当于2个像素
important;">
1 scale = 2
2 login_img_element = wait.until(EC.visibility_of_element_located((By.ID,'J-loginImg')))
3 full_img_data = browser.get_screenshot_as_png()
4 full_img = Image.open(BytesIO(full_img_data))
5 x1 = login_img_element.location["x"] * 2
6 y1 = login_img_element.location["y"] * 2
7 x2 = x1 + login_img_element.size["width"] * 2
8 y2 = y1 + login_img_element.size["height"] * 2
9 cut_info = (x1,y1,x2,y2)
10 cut_img = full_img.crop(cut_info)
11 cut_img.save('cut_img.png')</pre>
发送打码平台获取数字
RESULT = DECODE('CUT_IMG.PNG',6701)
定义8个点击坐标点
1 POSITIONS = [
2 (80,140),
3 (230,140),
4 (380,140),
5 (530,140),
6 (80, 280),
7 (230, 280),
8 (380, 280),
9 (530, 280)
10 ]</pre>
模拟点击坐标
1 FOR NUM IN RESULT:
2 POSITION = POSITIONS[INT(NUM) - 1]
3 # 模拟点击
4 ACTIONCHAINS(BROWSER).MOVE_TO_ELEMENT_WITH_OFFSET(LOGIN_IMG_ELEMENT,POSITION[0] / SCALE,POSITION[1] / SCALE).CLICK().PERFORM()
点击登录
BROWSER.FIND_ELEMENT_BY_LINK_TEXT('立即登录').CLICK()</pre>
点击选择人物
WAIT.UNTIL(EC.VISIBILITY_OF_ELEMENT_LOCATED((BY.ID,'NORMALPASSENGER_0'))).CLICK()</pre>
点击提交订单
BROWSER.FIND_ELEMENT_BY_ID('SUBMITORDER_ID').CLICK()</pre>
点击确认订单
WAIT.UNTIL(EC.VISIBILITY_OF_ELEMENT_LOCATED((BY.ID,'QR_SUBMIT_ID'))).CLICK()</pre>
pytyhon学习资料
python学习资料