|
2 | 2 | import random
|
3 | 3 | import re
|
4 | 4 | import time
|
| 5 | +# 图片转换 |
| 6 | +import base64 |
5 | 7 | from urllib.request import urlretrieve
|
6 | 8 |
|
7 | 9 | from bs4 import BeautifulSoup
|
|
13 | 15 | from selenium.webdriver.support import expected_conditions as EC
|
14 | 16 | from selenium.webdriver.support.ui import WebDriverWait
|
15 | 17 |
|
| 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 |
16 | 75 |
|
17 | 76 | class Crack():
|
18 | 77 | def __init__(self,keyword):
|
@@ -239,11 +298,11 @@ def crack(self):
|
239 | 298 | bg_location_list, fullbg_location_list = self.get_images(bg_filename, fullbg_filename)
|
240 | 299 |
|
241 | 300 | # 根据位置对图片进行合并还原
|
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) |
244 | 303 |
|
245 | 304 | # 获取缺口位置
|
246 |
| - gap = self.get_gap(fullbg_img, bg_img) |
| 305 | + gap = self.get_gap(image.open(full_bg_img), image.open(bg_img)) |
247 | 306 | print('缺口位置', gap)
|
248 | 307 |
|
249 | 308 | track = self.get_track(gap-self.BORDER)
|
|
0 commit comments