# -*-coding:utf-8 -*-
import random
import re
import time
from urllib.request import urlretrieve
from bs4 import BeautifulSoup
import PIL.Image as image
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
class Crack():
def __init__(self,keyword):
self.url = 'http://bj.gsxt.gov.cn/sydq/loginSydqAction!sydq.dhtml'
self.browser = webdriver.Chrome('D:\\chromedriver.exe')
self.wait = WebDriverWait(self.browser, 100)
self.keyword = keyword
self.BORDER = 6
def open(self):
"""
,
"""
self.browser.get(self.url)
keyword = self.wait.until(EC.presence_of_element_located((By.ID, 'keyword_qycx')))
bowton = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'btn')))
keyword.send_keys(self.keyword)
bowton.click()
def get_images(self, bg_filename = 'bg.jpg', fullbg_filename = 'fullbg.jpg'):
"""
:return: location
"""
bg = []
fullgb = []
while bg == [] and fullgb == []:
bf = BeautifulSoup(self.browser.page_source, 'lxml')
bg = bf.find_all('div', class_ = 'gt_cut_bg_slice')
fullgb = bf.find_all('div', class_ = 'gt_cut_fullbg_slice')
bg_url = re.findall('url\(\"(.*)\"\);', bg[0].get('style'))[0].replace('webp', 'jpg')
fullgb_url = re.findall('url\(\"(.*)\"\);', fullgb[0].get('style'))[0].replace('webp', 'jpg')
bg_location_list = []
fullbg_location_list = []
for each_bg in bg:
location = {}
location['x'] = int(re.findall('background-position: (.*)px (.*)px;',each_bg.get('style'))[0][0])
location['y'] = int(re.findall('background-position: (.*)px (.*)px;',each_bg.get('style'))[0][1])
bg_location_list.append(location)
for each_fullgb in fullgb:
location = {}
location['x'] = int(re.findall('background-position: (.*)px (.*)px;',each_fullgb.get('style'))[0][0])
location['y'] = int(re.findall('background-position: (.*)px (.*)px;',each_fullgb.get('style'))[0][1])
fullbg_location_list.append(location)
urlretrieve(url = bg_url, filename = bg_filename)
print('')
urlretrieve(url = fullgb_url, filename = fullbg_filename)
print('')
return bg_location_list, fullbg_location_list
def get_merge_image(self, filename, location_list):
"""
:filename:
:location_list:
"""
im = image.open(filename)
new_im = image.new('RGB', (260,116))
im_list_upper=[]
im_list_down=[]
for location in location_list:
if location['y'] == -58:
im_list_upper.append(im.crop((abs(location['x']),58,abs(location['x']) + 10, 166)))
if location['y'] == 0:
im_list_down.append(im.crop((abs(location['x']),0,abs(location['x']) + 10, 58)))
new_im = image.new('RGB', (260,116))
x_offset = 0
for im in im_list_upper:
new_im.paste(im, (x_offset,0))
x_offset += im.size[0]
x_offset = 0
for im in im_list_down:
new_im.paste(im, (x_offset,58))
x_offset += im.size[0]
new_im.save(filename)
return new_im
def get_merge_image(self, filename, location_list):
"""
:filename:
:location_list:
"""
im = image.open(filename)
new_im = image.new('RGB', (260,116))
im_list_upper=[]
im_list_down=[]
for location in location_list:
if location['y']==-58:
im_list_upper.append(im.crop((abs(location['x']),58,abs(location['x'])+10,166)))
if location['y']==0:
im_list_down.append(im.crop((abs(location['x']),0,abs(location['x'])+10,58)))
new_im = image.new('RGB', (260,116))
x_offset = 0
for im in im_list_upper:
new_im.paste(im, (x_offset,0))
x_offset += im.size[0]
x_offset = 0
for im in im_list_down:
new_im.paste(im, (x_offset,58))
x_offset += im.size[0]
new_im.save(filename)
return new_im
def is_pixel_equal(self, img1, img2, x, y):
"""
:param image1: 1
:param image2: 2
:param x: x
:param y: y
:return:
"""
#
pix1 = img1.load()[x, y]
pix2 = img2.load()[x, y]
threshold = 60
if (abs(pix1[0] - pix2[0] < threshold) and abs(pix1[1] - pix2[1] < threshold) and abs(pix1[2] - pix2[2] < threshold)):
return True
else:
return False
def get_gap(self, img1, img2):
"""
:param img1:
:param img2:
:return:
"""
left = 43
for i in range(left, img1.size[0]):
for j in range(img1.size[1]):
if not self.is_pixel_equal(img1, img2, i, j):
left = i
return left
return left
def get_track(self, distance):
"""
:param distance:
:return:
"""
#
track = []
#
current = 0
#
mid = distance * 4 / 5
#
t = 0.2
#
v = 0
while current < distance:
if current < mid:
# 2
a = 2
else:
# 3
a = -3
# v0
v0 = v
# v = v0 + at
v = v0 + a * t
# x = v0t + 1/2 * a * t^2
move = v0 * t + 1 / 2 * a * t * t
#
current += move
#
track.append(round(move))
return track
def get_slider(self):
"""
:return:
"""
while True:
try:
slider = self.browser.find_element_by_xpath("//div[@class='gt_slider_knob gt_show']")
break
except:
time.sleep(0.5)
return slider
def move_to_gap(self, slider, track):
"""
:param slider:
:param track:
:return:
"""
ActionChains(self.browser).click_and_hold(slider).perform()
while track:
x = random.choice(track)
ActionChains(self.browser).move_by_offset(xoffset=x, yoffset=0).perform()
track.remove(x)
time.sleep(0.5)
ActionChains(self.browser).release().perform()
def crack(self):
#
self.open()
#
bg_filename = 'bg.jpg'
fullbg_filename = 'fullbg.jpg'
#
bg_location_list, fullbg_location_list = self.get_images(bg_filename, fullbg_filename)
#
bg_img = self.get_merge_image(bg_filename, bg_location_list)
fullbg_img = self.get_merge_image(fullbg_filename, fullbg_location_list)
#
gap = self.get_gap(fullbg_img, bg_img)
print('', gap)
track = self.get_track(gap-self.BORDER)
print('')
print(track)
# #
# slider = self.get_slider()
# #
# self.move_to_gap(slider, track)
if __name__ == '__main__':
print('')
crack = Crack(u'')
crack.crack()
print('')