Skip to content

Commit 3519cd3

Browse files
committed
绕过乱序图拼接,直接根据 canvas 标签获取完整背景图和缺口背景图
1 parent 03d47c1 commit 3519cd3

File tree

1 file changed

+62
-3
lines changed

1 file changed

+62
-3
lines changed

geetest.py

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
import random
33
import re
44
import time
5+
# 图片转换
6+
import base64
57
from urllib.request import urlretrieve
68

79
from bs4 import BeautifulSoup
@@ -13,6 +15,63 @@
1315
from selenium.webdriver.support import expected_conditions as EC
1416
from selenium.webdriver.support.ui import WebDriverWait
1517

18+
def save_base64img(data_str, save_name):
19+
"""
20+
将 base64 数据转化为图片保存到指定位置
21+
:param data_str: base64 数据,不包含类型
22+
:param save_name: 保存的全路径
23+
"""
24+
img_data = base64.b64decode(data_str)
25+
file = open(save_name, 'wb')
26+
file.write(img_data)
27+
file.close()
28+
29+
30+
def get_base64_by_canvas(driver, class_name, contain_type):
31+
"""
32+
将 canvas 标签内容转换为 base64 数据
33+
:param driver: webdriver 对象
34+
:param class_name: canvas 标签的类名
35+
:param contain_type: 返回的数据是否包含类型
36+
:return: base64 数据
37+
"""
38+
# 防止图片未加载完就下载一张空图
39+
bg_img = ''
40+
while len(bg_img) < 5000:
41+
getImgJS = 'return document.getElementsByClassName("' + class_name + '")[0].toDataURL("image/png");'
42+
bg_img = driver.execute_script(getImgJS)
43+
time.sleep(0.5)
44+
# print(bg_img)
45+
if contain_type:
46+
return bg_img
47+
else:
48+
return bg_img[bg_img.find(',') + 1:]
49+
50+
51+
def save_bg(driver, bg_path="bg.png", bg_class="geetest_canvas_bg geetest_absolute"):
52+
"""
53+
保存包含缺口的背景图
54+
:param driver: webdriver 对象
55+
:param bg_path: 保存路径
56+
:param bg_class: 背景图的 class 属性
57+
:return: 保存路径
58+
"""
59+
bg_img_data = get_base64_by_canvas(driver, bg_class, False)
60+
save_base64img(bg_img_data, bg_path)
61+
return bg_path
62+
63+
64+
def save_full_bg(driver, full_bg_path="fbg.png", full_bg_class="geetest_canvas_fullbg geetest_fade geetest_absolute"):
65+
"""
66+
保存完整的的背景图
67+
:param driver: webdriver 对象
68+
:param full_bg_path: 保存路径
69+
:param full_bg_class: 完整背景图的 class 属性
70+
:return: 保存路径
71+
"""
72+
bg_img_data = get_base64_by_canvas(driver, full_bg_class, False)
73+
save_base64img(bg_img_data, full_bg_path)
74+
return full_bg_path
1675

1776
class Crack():
1877
def __init__(self,keyword):
@@ -239,11 +298,11 @@ def crack(self):
239298
bg_location_list, fullbg_location_list = self.get_images(bg_filename, fullbg_filename)
240299

241300
# 根据位置对图片进行合并还原
242-
bg_img = self.get_merge_image(bg_filename, bg_location_list)
243-
fullbg_img = self.get_merge_image(fullbg_filename, fullbg_location_list)
301+
bg_img = save_bg(self.browser)
302+
full_bg_img = save_full_bg(self.browser)
244303

245304
# 获取缺口位置
246-
gap = self.get_gap(fullbg_img, bg_img)
305+
gap = self.get_gap(image.open(full_bg_img), image.open(bg_img))
247306
print('缺口位置', gap)
248307

249308
track = self.get_track(gap-self.BORDER)

0 commit comments

Comments
 (0)