import base64
import json
import os
import random
import sys
import time
import requests
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
class Code():
'''
滑动验证码识别
'''
def __int__(self, slider_ele=None, background_ele=None, count=1, save_image=False):
'''
参数:
: params: slider_ele:滑块元素
: params: background_ele:背景元素
: params: count:尝试次数
: params: save_image:是否保存图片 默认不保存
'''
self.count = count
self.save_images = save_image
self.slider_ele = slider_ele
self.background_ele = background_ele
def get_slide_locus(self, distance):
'''
计算滑块的滑动轨迹
:param distance: 偏移量
:return: 滑动轨迹
'''
distance += 7.9
v = 0
m = 0.3
tracks = []
current = 0
mid = distance * 4 / 5
while current <= distance:
if current < mid:
a = 2
else:
a = -3
v0 = v
s = v0 * m + 0.6 * a * (m ** 2)
current += s
tracks.append(round(s))
v = v0 + a * m
return tracks
def slide_verification(self, driver, slide_element, distance):
'''
滑动验证
:param driver: 浏览器驱动
:param slide_element: 滑块元素
:param distance: 滑动距离
:return: 是否验证成功
'''
locus = self.get_slide_locus(distance)
ActionChains(driver).click_and_hold(slide_element).perform()
time.sleep(0.5)
for loc in locus:
time.sleep(0.01)
ActionChains(driver).move_by_offset(loc, random.randint(-5, 5)).perform()
ActionChains(driver).context_click(slide_element)
ActionChains(driver).release(on_element=slide_element).perform()
def onload_save_img(self, url, filename='image.png'):
try:
response = requests.get(url)
except Exception as e:
print('图片下载失败')
else:
with open(filename, 'wb') as f:
f.write(response.content)
class Login(object):
def __init__(self, user, password, retry):
browser_options = webdriver.ChromeOptions()
browser_options.add_argument('--disable-extensions')
browser_options.add_experimental_option('debuggerAddress', '127.0.0.1:9222')
self.browser = webdriver.Chrome(browser_options)
self.wait = WebDriverWait(self.browser, 20)
self.url = 'https://txzbqy.miit.gov.cn/#/gateway/list'
self.sli = Code()
self.user = user
self.password = password
self.retry = retry
def login(self):
self.browser.get('https://www.dadan.vip/')
time.sleep(2)
self.browser.get(self.url)
time.sleep(2)
self.browser.find_element(By.XPATH, '//div[@class="invite"]/header/span').click()
k = 1
while k < self.retry:
time.sleep(3)
bg_img = self.browser.find_element(By.XPATH, '//img[@class="slide-canvas"]').get_attribute('src')
front_image = self.browser.find_element(By.XPATH, '//img[@class="slide-block"]').get_attribute('src')
slider_button_location = self.browser.find_element(By.XPATH, '//div[@class="slider-button-icon"]').location
custom_url = "http://api.jfbym.com/api/YmServer/customApi"
token = "yhq"
headers = {'Content-Type': 'application/json'}
payload = {"slide_image": front_image, "token": token, "type": 20111, "background_image": bg_img}
resp = requests.post(custom_url, headers=headers, data=json.dumps(payload))
distutils = resp.json()['data']['data']
element = self.browser.find_element(By.XPATH, '//div[@class="slider-button"]')
self.sli.slide_verification(self.browser, element, int(distutils))
time.sleep(5)
def get_cookies(self):
cookies = self.browser.get_cookies()
self.cookies = ''
for cookie in cookies:
self.cookies += '{}={};'.format(cookie.get('name'), cookie.get('value'))
return cookies
def __del__(self):
self.browser.close()
print('页面关闭')
if __name__ == '__main__':
l = Login('用户名', '密码', 6)
l.login()