• 极验滑动验证码的识别


    获取验证码图片

    识别缺口位置

    生成滑块拖动路径

    模拟实现滑块拼合

      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 = '1764662628@qq.com'
     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 = '1764662628@qq.com'
     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 CrackGeetest.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$ 
  • 相关阅读:
    Java面向对象(继承、抽象类)
    Java面向对象(类、封装)
    Java基础语法(Eclipse)
    JavaScript new对象的四个过程
    原生js实现深复制
    es6 实现双链表
    快速排序
    跨域问题
    pm2 使用
    js冒泡排序
  • 原文地址:https://www.cnblogs.com/wanglinjie/p/9195208.html
Copyright © 2020-2023  润新知