某验五子棋验证码


测试地址

aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20=

python代码

#!/usr/bin/python
# -*- coding: UTF-8 -*-    
# Author:Jruing
# FileName:极验证码v4五子棋
# DateTime:2021/10/14 15:08
# SoftWare: PyCharm


from lxml.html import etree
import re
import copy

# from selenium.webdriver import Chrome
# from selenium.webdriver.common.action_chains import ActionChains
#
# import time
#
# driver = Chrome(executable_path=r'D:\tools\chromedriver.exe')
# driver.get("https://gt4.geetest.com/")
# driver.maximize_window()
# time.sleep(10)
# input("ssss")
# print(driver.page_source)
# html = etree.HTML(driver.page_source)

page_source = """
""" html = etree.HTML(page_source) class_list = html.xpath('//div[@class="geetest_subitem geetest_winlinze"]/div/div/@class') class_lists = [[class_list[j], class_list[j + 1]] for j in range(0, len(class_list), 2)] """ 0 空 1 蓝 2 黄 3 白 4 黑 """ rs = [] for i in range(0, 5): rs.append(class_lists[i * 5:(i + 1) * 5]) for index, i in enumerate(rs): for j in i: colors = html.xpath(f"""//div/div/div[@class="{j[1]}"]/@style""")[0] if "url" in colors: colors = re.compile('url\("https://static.geetest.com/.*?img_winlinze_(\d+).png"\)', re.S).findall(colors)[ 0] else: colors = '0' j.clear() j.append(colors) rs_list = [[k[0] for k in i] for i in rs] width = 60 high = 50 center = 30 def check_rows(): rs = copy.deepcopy(rs_list) # 获取符合条件的行 target_x, target_y, check_x, check_y = 0, 0, 0, 0 flag = -1 for rows in rs: if rows.count('0') == 1 and len(set(rows)) == 2: target_y = rows.index('0')+1 target_x = rs.index(rows)+1 # 获取应该放在该位置棋子的颜色代码 rows.remove('0') flag = rows[0] row_num = rs.index(rows) rs[row_num]=[] break if flag != -1: for i in rs: if flag in i: print(i.index(flag),rs.index(i)) check_y = i.index(flag)+1 check_x = rs.index(i)+1 break return target_x, target_y, check_x, check_y def check_columns(): # 按照列 rs = copy.deepcopy(rs_list) target_x, target_y, check_x, check_y = 0, 0, 0, 0 flag = -1 for columns in range(0, 5): rs_columns = [col[columns] for col in rs] if rs_columns.count('0') == 1 and len(set(rs_columns)) == 2: target_x = rs_columns.index('0')+1 target_y = columns+1 # 获取应该放在该位置棋子的颜色代码 rs_columns.remove('0') flag = rs_columns[0] break if flag != -1: for i in rs: row_num = rs.index(i) rs[row_num][target_y-1]=-2 if flag in i: check_y = i.index(flag)+1 check_x = rs.index(i)+1 break return target_x, target_y, check_x, check_y def slash_right(): # \ 斜着 rs = copy.deepcopy(rs_list) flag = -1 target_x, target_y, check_x, check_y = 0, 0, 0, 0 right = [rs[i][i] for i in range(0, 5)] if right.count('0') == 1 and len(set(right)) == 2: target_x = right.index('0')+1 target_y = right.index('0')+1 right.remove('0') flag = right[0] for index, item in enumerate(rs): rs[index][index] = -2 if flag in item: check_x = index+1 check_y = item.index(flag)+1 break return target_x, target_y, check_x, check_y def slash_left(): # / 斜着 rs = copy.deepcopy(rs_list) flag = -1 target_x, target_y, check_x, check_y = 0, 0, 0, 0 left = [rs[i][-1 - i] for i in range(0, 5)] if left.count('0') == 1 and len(set(left)) == 2: target_x = left.index('0')+1 target_y = 5-left.index('0') left.remove('0') flag = left[0] for index, item in enumerate(rs): rs[index][-1 - index] = -2 if flag in item: check_x = index+1 check_y = item.index(flag)+1 break return target_x, target_y, check_x, check_y target_x, target_y, check_x, check_y = check_rows() if target_x == target_y == check_x == check_y: print("未发现符合规则的行") else: print(f"行: 棋子{check_x}:{check_y} 移动到{target_x}:{target_y}") target_x, target_y, check_x, check_y = check_columns() if target_x == target_y == check_x == check_y: print("未发现符合规则的列") else: print(f"列: 棋子{check_x}:{check_y} 移动到{target_x}:{target_y}") target_x, target_y, check_x, check_y = slash_right() if target_x == target_y == check_x == check_y: print("未发现符合规则的对角(\)") else: print(f"\: 棋子{check_x}:{check_y} 移动到{target_x}:{target_y}") target_x, target_y, check_x, check_y = slash_left() if target_x == target_y == check_x == check_y: print("未发现符合规则的对角(/)") else: print(f"/: 棋子{check_x}:{check_y} 移动到{target_x}:{target_y}") # ActionChains(driver).move_by_offset(x - 30 + 1060, y - 30).click().perform() # 鼠标左键点击, 200为x坐标, 100为y坐标