[ Web Proxy ]
URL:
Viewing: https://raw.githubusercontent.com/krfcode520/python-spider/master/geetest.py [Back]  [Original]

# -*-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('')

Web Proxy Viewer  |  New URL  |  Original Page