获得iOS设备独一标示UUID,7兑现的二零一七年春节

作者:云顶最新线路检测

状态栏操作

作品首发:作者的博客

1、setNeedsUpdateConstraints当贰个自定义view的某部属性产生退换,并且或者影响到constraint时,须要调用此措施去标志constraints供给在今后的某部点更新,系统然后调用updateConstraints.2、needsUpdateConstraintsconstraint-based layout system使用此重临值去调整是还是不是要求调用updateConstraints作为健康布局进程的一有个别。3、updateConstraintsIfNeeded立即触发约束更新,自动更新布局。4、updateConstraints自定义view应该重写此方法在里面树立constraints. 注意:要在贯彻在最后调用[super updateConstraints]Auto Layout Process 自动布局进度与使用springs and struts(autoresizingMask)比较,Auto layout在view展现从前,多引入了八个步骤:updating constraints 和laying out views。每三个手续都依附于上贰个。display注重layout,而layout信赖updating constraints。 updating constraints->layout->display第一步:updating constraints,被喻为度量阶段,其从下向上(from subview to super view),为下一步layout盘算新闻。能够通过调用方法setNeedUpdateConstraints去接触此步。constraints的转移也会自行的触发此步。然而,当你自定义view的时候,假设局地更换可能会潜移暗化到布局的时候,经常需求团结去文告Auto layout,updateConstraintsIfNeeded。自定义view的话,平时能够重写updateConstraints方法,在里边可以增加view需求的有的的contraints。第二步:layout,其从上向下(from super view to subview),此步主要选择上一步的新闻去设置view的center和bounds。可以经过调用setNeedsLayout去触发此步骤,此措施不会应声选拔layout。借使想要系统及时的更新layout,能够调用layoutIfNeeded。其它,自定义view能够重写方法layoutSubViews来在layout的工程中赢得更加的多的定制化效果。第三步:display,此步时把view渲染到荧屏上,它与你是还是不是接纳Auto layout毫不相关,其操作是从上向下(from super view to subview),通过调用setNeedsDisplay触发,因为每一步都信任前一步,由此三个display也许会触发layout,当有任何layout没有被拍卖的时候,同理,layout恐怕会触发updating constraints,当constraint system更新改动的时候。需求潜心的是,那三步不是单向的,constraint-based layout是叁个迭代的进度,layout进度中,恐怕去改动constraints,有叁回触发updating constraints,进行一轮layout进度。注意:倘诺您每贰回调用自定义layoutSubviews都会产生另多少个布局传递,那么你将会陷于叁个最为循环中。

规律: 只可以识别图片,计算距离,模拟点击,自动化测量试验

在支付进度中,大家平日会被必要获取每种设备的举世无双标示,以便后台做相应的拍卖。大家来会见有怎样措施来获得道具的独一标示,然后再剖判下那些点子的优劣点。具体能够分为如下二种:

在斯威夫特开采进程中,针对状态栏操作的历程有不菲。

又到每年每度春运大会,二零一七年春节旅客运输抢火车票恐怕那么难,各大网络集团都推出抢票服务,只要加钱给服务费就能够增添抢到票的可能率,某个代售火车票点,说给100元服务费,能够帮抢到,看来那水很深啊!

移步支付调换群:264706196

1.先去github上下载WebDriverAgent这么些种类,即使地点有git能够经过指令

  1. UDID
  2. IDFA
  3. IDFV
  4. MAC
  5. keychain

1、在ViewController中操作当前ViewController的状态栏

上面大家选取协和学的手艺来机关抢票,此番脚本基于Python2.7+selenium来兑现

git clone

下边大家来具体深入分析下各种得到方式的利弊

[objc] view plaincopy本事分享技能分享

首先介绍一下selenium的使用

selenium操作chrome浏览器须求有ChromeDriver驱动来辅助。什么是ChromeDriver?ChromeDriver是Chromium team开拓尊敬的,它是贯彻WebDriver有线左券的四个独立的服务。ChromeDriver通过chrome的自动代理框架调控浏览器,ChromeDriver只与12.0.712.0以上版本的chrome浏览器宽容。那么要想selenium成功的操作chrome浏览器供给经验如下步骤:

  • 1、下载ChromeDriver驱动包(下载地址:
  • 2、指定ChromeDriver所在地点和安装景况变量1)把ChromeDriver.exe放到Chrome浏览器的装置地点application的目录下2)通过配备ChromeDriver.exe地方到path情状变量达成。

云顶游戏网站 ,2.进去WebDriverAgent夹数文件 施行如下指令

UDID 「Unique Device Identifier Description」是由子母和数字构成的叁二十一个字符串的序号,用来分别每多个独一的iOS设备,富含One pluss, 三星平板s, 以及 iPod touches,这几个编码看起来是即兴的,实际上是跟硬件装置特点相沟通的,别的你能够到iTunes,pp援手或itools等软件查看你的udid

/**遮蔽状态栏*/override func prefersStatusBarHidden() -> Bool {return true;}

1.流程分析
  • 率先大家要登陆12306网站,登入的时候境遇很蛋疼的图纸验证码,然后采用出发地方和指标位置,接着选拔时间,选用车的车的班次类型,然后查询,再选拔车的班次定票,接纳乘车人,提交订单,再次选择蛋疼的图片验证码。最后才会帮大家锁住座位。** 遵照这样的流程手动点击走下来,推测票都未曾了藍**

./Scripts/bootstrap.sh

获得iOS设备独一标示UUID,7兑现的二零一七年春节旅客运输抢票脚本。正如图所示:

/**设置情况栏风格*/override func preferredStatusBarStyle() -> UIStatusBarStyle {return UIStatusBarStyle.LightContent;}2、在AppDelegate中设置状态栏

2.预期完毕指标
  • 不论什么事工艺流程全自动,实现自动登入,自动查询,自动买票,自动提交订单** (一时半刻不落到实处自动点击验证码,验证码成功概率好低,所以权且不合併进去,能够参照破解12306验证码)**

3.打开xcode.打开WebDriverAgent.xcodeproj'

云顶游戏网站 1

[objc] view plaincopy手艺分享本事共享

3.贯彻代码
  • 抢票代码
# -*- coding: utf-8 -*-'''2017年春运火车票抢票火车票预订时间对照:1月25日 12月27日1月26日 12月28日1月27日 12月29日2月1日1月3日2月2日1月4日2月3日1月5日2月4日1月6日'''from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0from selenium.webdriver.support import expected_conditions as EC # available since 2.26.0import timevalue_fromstation = '%u6DF1%u5733%u5317%2CIOQ' # 始发站value_tostation = '%u4E91%u6D6E%u4E1C%2CIXQ' # 终点站value_date = '2017-01-25' # 出发时间def login_proc(username, password): # 打开登录页面 sel = webdriver.Chrome('C:Program Files GoogleChromeApplicationchromedriver.exe') # sel=webdriver.Firefox() sel.implicitly_wait login_url = 'https://kyfw.12306.cn/otn/login/init' sel.get(login_url) # sign in the username try: user_input = sel.find_element_by_id("username") user_input.clear() user_input.send_keys print 'user-id write success!' except: print 'user-id write error!' # sign in the pasword try: pwd_input = sel.find_element_by_id("password") pwd_input.clear() pwd_input.send_keys print 'pw write success!' except: print 'pw write error!' # Check for Login success while True: curpage_url = sel.current_url if curpage_url != login_url: if curpage_url[:-1] != login_url: # choose wrong verify_pic print 'Login finished!' break else: time.sleep print u'------------>等待用户图片验证' return seldef search_proc(sel, train_type='', timer=False): print u'--------->选择车次类型', train_type # 定时抢票时间点 if timer == True: while True: current_time = time.localtime() if ((current_time.tm_hour == 14) and (current_time.tm_min >= 25) and ( current_time.tm_sec >= 00)): print u'开始刷票...' break else: time.sleep if current_time.tm_sec % 30 == 0: print time.strftime('%H:%M:%S', current_time) # 打开订票网页 book_url = 'https://kyfw.12306.cn/otn/leftTicket/init' sel.get # 始发站 # sel.find_element_by_id('fromStationText').click() # from_station = sel.find_element_by_xpath('//*[@]/li[32]') # 深圳 # from_station.click() sel.add_cookie({"name": "_jc_save_fromStation", "value": value_fromstation}) # 终点站 # sel.find_element_by_id('toStationText').click() # sel.find_element_by_id('nav_list3').click()#点击事件 # tation = sel.find_element_by_xpath('//*[@]/li[9]') # 广州 # to_station.click() sel.add_cookie({"name": "_jc_save_toStation", "value": value_tostation}) # 出发日期 # date_sel = sel.find_element_by_id('train_date') # js = "document.getElementById('train_date').removeAttribute('readonly')" # del train_date readonly property # sel.execute_script # date_sel.clear() # date_sel.send_keys(leave_date) sel.add_cookie({"name": "_jc_save_fromDate", "value": value_date}) sel.refresh() # 车次类型选择 train_type_dict = {'T': '//input[@name="cc_type" and @value="T"]', # 特快 'G': '//input[@name="cc_type" and @value="G"]', # 高铁 'D': '//input[@name="cc_type" and @value="D"]', # 动车 'Z': '//input[@name="cc_type" and @value="Z"]'} # 直达 if train_type == 'T' or train_type == 'G' or train_type == 'D' or train_type == 'Z': sel.find_element_by_xpath(train_type_dict[train_type]).click() else: print u"车次类型异常或未选择!(train_type=%s)" % train_typedef book_proc(sel, refresh_interval=0): # 等待状态查询 query_times = 0 time_begin = time.time() while True: # 循环查询 time.sleep(refresh_interval) # 开始查询 @ search_btn = WebDriverWait.until( EC.presence_of_element_located((By.XPATH, '//*[@]'))) search_btn.click() # 扫描查询结果 try: # T17 tic_tb_item = WebDriverWait.until( EC.presence_of_element_located((By.XPATH, '//*[@]'))) # G381 # tic_tb_item = WebDriverWait.until(EC.presence_of_element_located((By.XPATH, '//*[@]'))) tic_ava_num = tic_tb_item.text except: # 应对查询按钮一次点击后,网站未返回查询结果 search_btn.click() # T17 tic_tb_item = WebDriverWait.until( EC.presence_of_element_located((By.XPATH, '//*[@]'))) # G381 # tic_tb_item = WebDriverWait.until(EC.presence_of_element_located((By.XPATH, '//*[@]'))) tic_ava_num = tic_tb_item.text if tic_ava_num == u'无' or tic_ava_num == u'*': # 无票或未开售 query_times += 1 time_cur = time.time() print u'第%d次查询,总计耗时%s秒' % (query_times, time_cur - time_begin) continue else: # 订票 @ sel.find_element_by_xpath('//*[@]/td[13]/a').click() # T17 # sel.find_element_by_xpath('//*[@]/td[13]/a').click() # G381 break # 判断页面跳是否转至乘客选择页面 cust_sel_url = 'https://kyfw.12306.cn/otn/leftTicket/init' while True: if (sel.current_url == cust_sel_url): print u'页面跳转成功!' break else: print u'等待页面跳转...' # 乘车人选择 while True: try: # sel.find_element_by_xpath.click() sel.find_element_by_xpath.click() break except: print u'等待常用联系人列表...' # 席别选择 # 提交订票 sel.find_element_by_xpath.click() # 确认订票信息 while True: try: sel.switch_to.frame(sel.find_element_by_xpath('//*[@]/iframe[2]')) print sel.find_element_by_xpath.click() print 'Pass!' break except: print u'请手动通过图片验证码' time.sleep break return 'yeah'if __name__ == '__main__': # 变量定义 leave_date = '2016-12-23' train_type = 'G' refresh_interval = 0.1 timer = False sel = login_proc('****************', '***********') search_proc(sel, train_type, timer) book_proc(sel, refresh_interval)
  • 大局配置
#-*- coding: utf-8 -*-# 对抗12306多次查询后,会出现服务器繁忙问题from auto_book import login_proc,search_proc,book_procimport configparserconfig=configparser.ConfigParser()config.read('user.cfg')result = 'gogogo'username=config.get('user','username')password=config.get('user','password')begin_time = '15:35:00'refresh_interval = 0.1timer=Falsetype='G'for i in range: if result == 'gogogo': try: sel = login_proc(username,password) search_proc(sel,type,timer) book_proc(sel,refresh_interval) except: continue else: print result break
  • 布置登入个人音讯
[user]username = yournamepassword = yourpassword

product -> destination 选择你的无绳电电话机

UDID能够提到另外种种数码到相关道具上。比如,连接受开垦者账号,能够允许在公布前让设备安装或测量试验应用;也得以让开拓者得到iOS测验版张开体验。苹果用UDID连接到苹果的ID,这么些设施能够自动下载和安装从App Store购买的运用、保存从iTunes购买的音乐、帮忙苹果发送推送文告、即时音讯。 在iOS 应用开始时期,UDID被第三方使用开拓者和网络广告商用来搜罗客户数据,能够用来波及地址、记录应用使用习贯……以便推送精准广告。

本文由云顶最新线路检测发布,转载请注明来源

关键词: