极验滑动验证码的识别

获取验证码图片

识别缺口位置

生成滑块拖动路径

模拟实现滑块拼合

  1 import time
  2 from io import BytesIO
  3 from PIL import Image
  4 from selenium import webdriver
  5 from selenium.webdriver import ActionChains
  6 from selenium.webdriver.common.by import By
  7 from selenium.webdriver.support.ui import WebDriverWait
  8 from selenium.webdriver.support import expected_conditions as EC
  9 
 10 EMAIL = '[email protected]'
 11 PASSWORD = '***'
 12 BORDER = 6
 13 INIT_LEFT = 60
 14 
 15 
 16 class CrackGeetest():
 17     def __init__(self):
 18         self.url = 'https://account.geetest.com/login'
 19         self.browser = webdriver.Chrome()
 20         self.wait = WebDriverWait(self.browser, 20)
 21         self.email = EMAIL
 22         self.password = PASSWORD
 23     
 24     def __del__(self):
 25         self.browser.close()
 26     
 27     def get_geetest_button(self):
 28         """
 29         获取初始验证按钮
 30         :return:
 31         """
 32         button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_radar_tip')))
 33         return button
 34     
 35     def get_position(self):
 36         """
 37         获取验证码位置
 38         :return: 验证码位置元组
 39         """
 40         img = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_canvas_img')))
 41         time.sleep(2)
 42         location = img.location
 43         size = img.size
 44         top, bottom, left, right = location['y'], location['y'] + size['height'], location['x'], location['x'] + size[
 45             'width']
 46         return (top, bottom, left, right)
 47     
 48     def get_screenshot(self):
 49         """
 50         获取网页截图
 51         :return: 截图对象
 52         """
 53         screenshot = self.browser.get_screenshot_as_png()
 54         screenshot = Image.open(BytesIO(screenshot))
 55         return screenshot
 56     
 57     def get_slider(self):
 58         """
 59         获取滑块
 60         :return: 滑块对象
 61         """
 62         slider = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_slider_button')))
 63         return slider
 64     
 65     def get_geetest_image(self, name='captcha.png'):
 66         """
 67         获取验证码图片
 68         :return: 图片对象
 69         """
 70         top, bottom, left, right = self.get_position()
 71         print('验证码位置', top, bottom, left, right)
 72         screenshot = self.get_screenshot()
 73         captcha = screenshot.crop((left, top, right, bottom))
 74         captcha.save(name)
 75         return captcha
 76     
 77     def open(self):
 78         """
 79         打开网页输入用户名密码
 80         :return: None
 81         """
 82         self.browser.get(self.url)
 83         email = self.wait.until(EC.presence_of_element_located((By.ID, 'email')))
 84         password = self.wait.until(EC.presence_of_element_located((By.ID, 'password')))
 85         email.send_keys(self.email)
 86         password.send_keys(self.password)
 87     
 88     def get_gap(self, image1, image2):
 89         """
 90         获取缺口偏移量
 91         :param image1: 不带缺口图片
 92         :param image2: 带缺口图片
 93         :return:
 94         """
 95         left = 60
 96         for i in range(left, image1.size[0]):
 97             for j in range(image1.size[1]):
 98                 if not self.is_pixel_equal(image1, image2, i, j):
 99                     left = i
100                     return left
101         return left
102     
103     def is_pixel_equal(self, image1, image2, x, y):
104         """
105         判断两个像素是否相同
106         :param image1: 图片1
107         :param image2: 图片2
108         :param x: 位置x
109         :param y: 位置y
110         :return: 像素是否相同
111         """
112         # 取两个图片的像素点
113         pixel1 = image1.load()[x, y]
114         pixel2 = image2.load()[x, y]
115         threshold = 60
116         if abs(pixel1[0] - pixel2[0]) < threshold and abs(pixel1[1] - pixel2[1]) < threshold and abs(
117                 pixel1[2] - pixel2[2]) < threshold:
118             return True
119         else:
120             return False
121     
122     def get_track(self, distance):
123         """
124         根据偏移量获取移动轨迹
125         :param distance: 偏移量
126         :return: 移动轨迹
127         """
128         # 移动轨迹
129         track = []
130         # 当前位移
131         current = 0
132         # 减速阈值
133         mid = distance * 4 / 5
134         # 计算间隔
135         t = 0.2
136         # 初速度
137         v = 0
138         
139         while current < distance:
140             if current < mid:
141                 # 加速度为正2
142                 a = 2
143             else:
144                 # 加速度为负3
145                 a = -3
146             # 初速度v0
147             v0 = v
148             # 当前速度v = v0 + at
149             v = v0 + a * t
150             # 移动距离x = v0t + 1/2 * a * t^2
151             move = v0 * t + 1 / 2 * a * t * t
152             # 当前位移
153             current += move
154             # 加入轨迹
155             track.append(round(move))
156         return track
157     
158     def move_to_gap(self, slider, track):
159         """
160         拖动滑块到缺口处
161         :param slider: 滑块
162         :param track: 轨迹
163         :return:
164         """
165         ActionChains(self.browser).click_and_hold(slider).perform()
166         for x in track:
167             ActionChains(self.browser).move_by_offset(xoffset=x, yoffset=0).perform()
168         time.sleep(0.5)
169         ActionChains(self.browser).release().perform()
170     
171     def login(self):
172         """
173         登录
174         :return: None
175         """
176         submit = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'login-btn')))
177         submit.click()
178         time.sleep(10)
179         print('登录成功')
180     
181     def crack(self):
182         # 输入用户名密码
183         self.open()
184         # 点击验证按钮
185         button = self.get_geetest_button()
186         button.click()
187         # 获取验证码图片
188         image1 = self.get_geetest_image('captcha1.png')
189         # 点按呼出缺口
190         slider = self.get_slider()
191         slider.click()
192         # 获取带缺口的验证码图片
193         image2 = self.get_geetest_image('captcha2.png')
194         # 获取缺口位置
195         gap = self.get_gap(image1, image2)
196         print('缺口位置', gap)
197         # 减去缺口位移
198         gap -= BORDER
199         # 获取移动轨迹
200         track = self.get_track(gap)
201         print('滑动轨迹', track)
202         # 拖动滑块
203         self.move_to_gap(slider, track)
204         
205         success = self.wait.until(
206             EC.text_to_be_present_in_element((By.CLASS_NAME, 'geetest_success_radar_tip_content'), '验证成功'))
207         print(success)
208         
209         # 失败后重试
210         if not success:
211             self.crack()
212         else:
213             self.login()
214 
215 
216 if __name__ == '__main__':
217     crack = CrackGeetest()
218     crack.crack()

估计是高分屏的原因,截全图下来的时候我用画图软件看了图形验证码的像素位置,刚好是给的位置参数乘以2,所以保存下来的2张验证码的图还要压缩一下分辨率,加入下面语句就可以做对比匹配了。

1 captcha = screenshot.crop((2*left, 2*top, 2*right, 2*bottom))
2 size = 258,159
3 captcha.thumbnail(size)

修改参数

  1 import time
  2 from io import BytesIO
  3 from PIL import Image
  4 from selenium import webdriver
  5 from selenium.webdriver import ActionChains
  6 from selenium.webdriver.common.by import By
  7 from selenium.webdriver.support.ui import WebDriverWait
  8 from selenium.webdriver.support import expected_conditions as EC
  9 
 10 EMAIL = '[email protected]'
 11 PASSWORD = '***'
 12 BORDER = 6
 13 INIT_LEFT = 60
 14 
 15 
 16 class CrackGeetest():
 17     def __init__(self):
 18         self.url = 'https://account.geetest.com/login'
 19         self.browser = webdriver.Chrome()
 20         self.wait = WebDriverWait(self.browser, 20)
 21         self.email = EMAIL
 22         self.password = PASSWORD
 23     
 24     def __del__(self):
 25         self.browser.close()
 26     
 27     def get_geetest_button(self):
 28         """
 29         获取初始验证按钮
 30         :return:
 31         """
 32         button = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_radar_tip')))
 33         return button
 34     
 35     def get_position(self):
 36         """
 37         获取验证码位置
 38         :return: 验证码位置元组
 39         """
 40         img = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_canvas_img')))
 41         time.sleep(2)
 42         location = img.location
 43         size = img.size
 44         top, bottom, left, right = location['y'], location['y'] + size['height'], location['x'], location['x'] + size[
 45             'width']
 46         return (top, bottom, left, right)
 47     
 48     def get_screenshot(self):
 49         """
 50         获取网页截图
 51         :return: 截图对象
 52         """
 53         screenshot = self.browser.get_screenshot_as_png()
 54         screenshot = Image.open(BytesIO(screenshot))
 55         return screenshot
 56     
 57     def get_slider(self):
 58         """
 59         获取滑块
 60         :return: 滑块对象
 61         """
 62         slider = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'geetest_slider_button')))
 63         return slider
 64     
 65     def get_geetest_image(self, name='captcha.png'):
 66         """
 67         获取验证码图片
 68         :return: 图片对象
 69         """
 70         top, bottom, left, right = self.get_position()
 71         print('验证码位置', top, bottom, left, right)
 72         screenshot = self.get_screenshot()
 73         #captcha = screenshot.crop((left, top, right, bottom))
 74         captcha = screenshot.crop((2*left, 2*top, 2*right, 2*bottom))
 75         size = 258,159
 76         captcha.thumbnail(size)
 77         captcha.save(name)
 78         return captcha
 79     
 80     def open(self):
 81         """
 82         打开网页输入用户名密码
 83         :return: None
 84         """
 85         self.browser.get(self.url)
 86         email = self.wait.until(EC.presence_of_element_located((By.ID, 'email')))
 87         password = self.wait.until(EC.presence_of_element_located((By.ID, 'password')))
 88         email.send_keys(self.email)
 89         password.send_keys(self.password)
 90     
 91     def get_gap(self, image1, image2):
 92         """
 93         获取缺口偏移量
 94         :param image1: 不带缺口图片
 95         :param image2: 带缺口图片
 96         :return:
 97         """
 98         left = 60
 99         for i in range(left, image1.size[0]):
100             for j in range(image1.size[1]):
101                 if not self.is_pixel_equal(image1, image2, i, j):
102                     left = i
103                     return left
104         return left
105     
106     def is_pixel_equal(self, image1, image2, x, y):
107         """
108         判断两个像素是否相同
109         :param image1: 图片1
110         :param image2: 图片2
111         :param x: 位置x
112         :param y: 位置y
113         :return: 像素是否相同
114         """
115         # 取两个图片的像素点
116         pixel1 = image1.load()[x, y]
117         pixel2 = image2.load()[x, y]
118         threshold = 60
119         if abs(pixel1[0] - pixel2[0]) < threshold and abs(pixel1[1] - pixel2[1]) < threshold and abs(
120                 pixel1[2] - pixel2[2]) < threshold:
121             return True
122         else:
123             return False
124     
125     def get_track(self, distance):
126         """
127         根据偏移量获取移动轨迹
128         :param distance: 偏移量
129         :return: 移动轨迹
130         """
131         # 移动轨迹
132         track = []
133         # 当前位移
134         current = 0
135         # 减速阈值
136         mid = distance * 4 / 5
137         print("距离")
138         print(distance)
139         print(mid)
140         # 计算间隔
141         t = 0.1
142         # 初速度
143         v = 0
144         
145         while current < distance:
146             if current < mid:
147                 # 加速度为正2
148                 a = 2
149             else:
150                 # 加速度为负3
151                 a = -3
152             # 初速度v0
153             v0 = v
154             print("速度")
155             print(v)
156             # 当前速度v = v0 + at
157             v = v0 + a * t
158             # 移动距离x = v0t + 1/2 * a * t^2
159             move = v0 * t + 1 / 2 * a * t * t
160             print("移动距离")
161             print(move)
162             # 当前位移
163             current += move
164             print("当前位移")
165             print(current)
166             # 加入轨迹
167             track.append(round(move))
168         return track
169     
170     def move_to_gap(self, slider, track):
171         """
172         拖动滑块到缺口处
173         :param slider: 滑块
174         :param track: 轨迹
175         :return:
176         """
177         ActionChains(self.browser).click_and_hold(slider).perform()
178         for x in track:
179             ActionChains(self.browser).move_by_offset(xoffset=x, yoffset=0).perform()
180         time.sleep(0.5)
181         ActionChains(self.browser).release().perform()
182     
183     def login(self):
184         """
185         登录
186         :return: None
187         """
188         submit = self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME, 'login-btn')))
189         submit.click()
190         time.sleep(10)
191         print('登录成功')
192     
193     def crack(self):
194         # 输入用户名密码
195         self.open()
196         # 点击验证按钮
197         button = self.get_geetest_button()
198         button.click()
199         # 获取验证码图片
200         image1 = self.get_geetest_image('captcha1.png')
201         # 点按呼出缺口
202         slider = self.get_slider()
203         slider.click()
204         # 获取带缺口的验证码图片
205         image2 = self.get_geetest_image('captcha2.png')
206         # 获取缺口位置
207         gap = self.get_gap(image1, image2)
208         print('缺口位置', gap)
209         # 减去缺口位移
210         gap -= BORDER
211         # 获取移动轨迹
212         track = self.get_track(gap)
213         print('滑动轨迹', track)
214         # 拖动滑块
215         self.move_to_gap(slider, track)
216         
217         success = self.wait.until(
218             EC.text_to_be_present_in_element((By.CLASS_NAME, 'geetest_success_radar_tip_content'), '验证成功'))
219         print(success)
220         
221         # 失败后重试
222         if not success:
223             self.crack()
224         else:
225             self.login()
226 
227 
228 if __name__ == '__main__':
229     crack = CrackGeetest()
230     crack.crack()

结果输出:

  1 wljdeMacBook-Pro:Desktop wlj$ python3 000.py
  2 验证码位置 172 331 528 786
  3 验证码位置 172 331 528 786
  4 缺口位置 94
  5 距离
  6 88
  7 70.4
  8 速度
  9 0
 10 移动距离
 11 0.010000000000000002
 12 当前位移
 13 0.010000000000000002
 14 速度
 15 0.2
 16 移动距离
 17 0.030000000000000006
 18 当前位移
 19 0.04000000000000001
 20 速度
 21 0.4
 22 移动距离
 23 0.05000000000000001
 24 当前位移
 25 0.09000000000000002
 26 速度
 27 0.6000000000000001
 28 移动距离
 29 0.07
 30 当前位移
 31 0.16000000000000003
 32 速度
 33 0.8
 34 移动距离
 35 0.09000000000000002
 36 当前位移
 37 0.25000000000000006
 38 速度
 39 1.0
 40 移动距离
 41 0.11000000000000001
 42 当前位移
 43 0.3600000000000001
 44 速度
 45 1.2
 46 移动距离
 47 0.13
 48 当前位移
 49 0.4900000000000001
 50 速度
 51 1.4
 52 移动距离
 53 0.15
 54 当前位移
 55 0.6400000000000001
 56 速度
 57 1.5999999999999999
 58 移动距离
 59 0.17
 60 当前位移
 61 0.8100000000000002
 62 速度
 63 1.7999999999999998
 64 移动距离
 65 0.19
 66 当前位移
 67 1.0000000000000002
 68 速度
 69 1.9999999999999998
 70 移动距离
 71 0.21
 72 当前位移
 73 1.2100000000000002
 74 速度
 75 2.1999999999999997
 76 移动距离
 77 0.22999999999999998
 78 当前位移
 79 1.4400000000000002
 80 速度
 81 2.4
 82 移动距离
 83 0.25
 84 当前位移
 85 1.6900000000000002
 86 速度
 87 2.6
 88 移动距离
 89 0.27
 90 当前位移
 91 1.9600000000000002
 92 速度
 93 2.8000000000000003
 94 移动距离
 95 0.29000000000000004
 96 当前位移
 97 2.25
 98 速度
 99 3.0000000000000004
100 移动距离
101 0.31000000000000005
102 当前位移
103 2.56
104 速度
105 3.2000000000000006
106 移动距离
107 0.33000000000000007
108 当前位移
109 2.89
110 速度
111 3.400000000000001
112 移动距离
113 0.3500000000000001
114 当前位移
115 3.24
116 速度
117 3.600000000000001
118 移动距离
119 0.3700000000000001
120 当前位移
121 3.6100000000000003
122 速度
123 3.800000000000001
124 移动距离
125 0.3900000000000001
126 当前位移
127 4.0
128 速度
129 4.000000000000001
130 移动距离
131 0.41000000000000014
132 当前位移
133 4.41
134 速度
135 4.200000000000001
136 移动距离
137 0.43000000000000016
138 当前位移
139 4.84
140 速度
141 4.400000000000001
142 移动距离
143 0.4500000000000002
144 当前位移
145 5.29
146 速度
147 4.600000000000001
148 移动距离
149 0.4700000000000002
150 当前位移
151 5.76
152 速度
153 4.800000000000002
154 移动距离
155 0.4900000000000002
156 当前位移
157 6.25
158 速度
159 5.000000000000002
160 移动距离
161 0.5100000000000002
162 当前位移
163 6.76
164 速度
165 5.200000000000002
166 移动距离
167 0.5300000000000002
168 当前位移
169 7.29
170 速度
171 5.400000000000002
172 移动距离
173 0.5500000000000003
174 当前位移
175 7.84
176 速度
177 5.600000000000002
178 移动距离
179 0.5700000000000003
180 当前位移
181 8.41
182 速度
183 5.8000000000000025
184 移动距离
185 0.5900000000000003
186 当前位移
187 9.0
188 速度
189 6.000000000000003
190 移动距离
191 0.6100000000000003
192 当前位移
193 9.61
194 速度
195 6.200000000000003
196 移动距离
197 0.6300000000000003
198 当前位移
199 10.24
200 速度
201 6.400000000000003
202 移动距离
203 0.6500000000000004
204 当前位移
205 10.89
206 速度
207 6.600000000000003
208 移动距离
209 0.6700000000000004
210 当前位移
211 11.56
212 速度
213 6.800000000000003
214 移动距离
215 0.6900000000000004
216 当前位移
217 12.25
218 速度
219 7.0000000000000036
220 移动距离
221 0.7100000000000004
222 当前位移
223 12.96
224 速度
225 7.200000000000004
226 移动距离
227 0.7300000000000004
228 当前位移
229 13.690000000000001
230 速度
231 7.400000000000004
232 移动距离
233 0.7500000000000004
234 当前位移
235 14.440000000000001
236 速度
237 7.600000000000004
238 移动距离
239 0.7700000000000005
240 当前位移
241 15.21
242 速度
243 7.800000000000004
244 移动距离
245 0.7900000000000005
246 当前位移
247 16.0
248 速度
249 8.000000000000004
250 移动距离
251 0.8100000000000004
252 当前位移
253 16.81
254 速度
255 8.200000000000003
256 移动距离
257 0.8300000000000003
258 当前位移
259 17.64
260 速度
261 8.400000000000002
262 移动距离
263 0.8500000000000003
264 当前位移
265 18.490000000000002
266 速度
267 8.600000000000001
268 移动距离
269 0.8700000000000002
270 当前位移
271 19.360000000000003
272 速度
273 8.8
274 移动距离
275 0.8900000000000001
276 当前位移
277 20.250000000000004
278 速度
279 9.0
280 移动距离
281 0.91
282 当前位移
283 21.160000000000004
284 速度
285 9.2
286 移动距离
287 0.9299999999999999
288 当前位移
289 22.090000000000003
290 速度
291 9.399999999999999
292 移动距离
293 0.95
294 当前位移
295 23.040000000000003
296 速度
297 9.599999999999998
298 移动距离
299 0.9699999999999999
300 当前位移
301 24.01
302 速度
303 9.799999999999997
304 移动距离
305 0.9899999999999998
306 当前位移
307 25.0
308 速度
309 9.999999999999996
310 移动距离
311 1.0099999999999996
312 当前位移
313 26.009999999999998
314 速度
315 10.199999999999996
316 移动距离
317 1.0299999999999996
318 当前位移
319 27.04
320 速度
321 10.399999999999995
322 移动距离
323 1.0499999999999996
324 当前位移
325 28.09
326 速度
327 10.599999999999994
328 移动距离
329 1.0699999999999994
330 当前位移
331 29.16
332 速度
333 10.799999999999994
334 移动距离
335 1.0899999999999994
336 当前位移
337 30.25
338 速度
339 10.999999999999993
340 移动距离
341 1.1099999999999994
342 当前位移
343 31.36
344 速度
345 11.199999999999992
346 移动距离
347 1.1299999999999992
348 当前位移
349 32.49
350 速度
351 11.399999999999991
352 移动距离
353 1.1499999999999992
354 当前位移
355 33.64
356 速度
357 11.59999999999999
358 移动距离
359 1.169999999999999
360 当前位移
361 34.81
362 速度
363 11.79999999999999
364 移动距离
365 1.189999999999999
366 当前位移
367 36.0
368 速度
369 11.99999999999999
370 移动距离
371 1.209999999999999
372 当前位移
373 37.21
374 速度
375 12.199999999999989
376 移动距离
377 1.2299999999999989
378 当前位移
379 38.44
380 速度
381 12.399999999999988
382 移动距离
383 1.249999999999999
384 当前位移
385 39.69
386 速度
387 12.599999999999987
388 移动距离
389 1.269999999999999
390 当前位移
391 40.959999999999994
392 速度
393 12.799999999999986
394 移动距离
395 1.2899999999999987
396 当前位移
397 42.24999999999999
398 速度
399 12.999999999999986
400 移动距离
401 1.3099999999999987
402 当前位移
403 43.55999999999999
404 速度
405 13.199999999999985
406 移动距离
407 1.3299999999999985
408 当前位移
409 44.889999999999986
410 速度
411 13.399999999999984
412 移动距离
413 1.3499999999999985
414 当前位移
415 46.23999999999999
416 速度
417 13.599999999999984
418 移动距离
419 1.3699999999999986
420 当前位移
421 47.609999999999985
422 速度
423 13.799999999999983
424 移动距离
425 1.3899999999999983
426 当前位移
427 48.999999999999986
428 速度
429 13.999999999999982
430 移动距离
431 1.4099999999999984
432 当前位移
433 50.40999999999998
434 速度
435 14.199999999999982
436 移动距离
437 1.4299999999999982
438 当前位移
439 51.83999999999998
440 速度
441 14.39999999999998
442 移动距离
443 1.4499999999999982
444 当前位移
445 53.28999999999998
446 速度
447 14.59999999999998
448 移动距离
449 1.4699999999999982
450 当前位移
451 54.75999999999998
452 速度
453 14.79999999999998
454 移动距离
455 1.489999999999998
456 当前位移
457 56.24999999999997
458 速度
459 14.999999999999979
460 移动距离
461 1.509999999999998
462 当前位移
463 57.75999999999997
464 速度
465 15.199999999999978
466 移动距离
467 1.5299999999999978
468 当前位移
469 59.28999999999997
470 速度
471 15.399999999999977
472 移动距离
473 1.5499999999999978
474 当前位移
475 60.83999999999997
476 速度
477 15.599999999999977
478 移动距离
479 1.5699999999999978
480 当前位移
481 62.40999999999997
482 速度
483 15.799999999999976
484 移动距离
485 1.5899999999999976
486 当前位移
487 63.999999999999964
488 速度
489 15.999999999999975
490 移动距离
491 1.6099999999999977
492 当前位移
493 65.60999999999996
494 速度
495 16.199999999999974
496 移动距离
497 1.6299999999999975
498 当前位移
499 67.23999999999995
500 速度
501 16.399999999999974
502 移动距离
503 1.6499999999999975
504 当前位移
505 68.88999999999994
506 速度
507 16.599999999999973
508 移动距离
509 1.6699999999999975
510 当前位移
511 70.55999999999995
512 速度
513 16.799999999999972
514 移动距离
515 1.6649999999999974
516 当前位移
517 72.22499999999994
518 速度
519 16.49999999999997
520 移动距离
521 1.6349999999999973
522 当前位移
523 73.85999999999993
524 速度
525 16.19999999999997
526 移动距离
527 1.6049999999999973
528 当前位移
529 75.46499999999993
530 速度
531 15.89999999999997
532 移动距离
533 1.5749999999999973
534 当前位移
535 77.03999999999994
536 速度
537 15.59999999999997
538 移动距离
539 1.544999999999997
540 当前位移
541 78.58499999999994
542 速度
543 15.299999999999969
544 移动距离
545 1.514999999999997
546 当前位移
547 80.09999999999994
548 速度
549 14.999999999999968
550 移动距离
551 1.484999999999997
552 当前位移
553 81.58499999999994
554 速度
555 14.699999999999967
556 移动距离
557 1.454999999999997
558 当前位移
559 83.03999999999994
560 速度
561 14.399999999999967
562 移动距离
563 1.424999999999997
564 当前位移
565 84.46499999999993
566 速度
567 14.099999999999966
568 移动距离
569 1.3949999999999967
570 当前位移
571 85.85999999999993
572 速度
573 13.799999999999965
574 移动距离
575 1.3649999999999967
576 当前位移
577 87.22499999999992
578 速度
579 13.499999999999964
580 移动距离
581 1.3349999999999966
582 当前位移
583 88.55999999999992
584 滑动轨迹 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1]
585 True
586 登录成功
587 wljdeMacBook-Pro:Desktop wlj$ 

猜你喜欢

转载自www.cnblogs.com/wanglinjie/p/9195208.html