면책 조항 :이 기사는 연구 및 연구용이며 불법적 인 용도로 사용하는 것은 금지되어 있습니다. 그렇지 않으면 귀하의 책임입니다. 침해 사항이있는 경우 통지하고 삭제하십시오. 감사합니다!
프로젝트 장면 :
이번에는 QQ에서 인증 한 로그인 항목을 사용하여 Zhihu의 셀레늄 자동 로그인을 가져 왔습니다. 링크는 여기 입니다. 로그인 API 인터페이스를 사용하여 이전에 로그인 시뮬레이션을 시도했지만 성공하지 못했기 때문에 여전히 정직합니다. 먼저 브라우저로 로그인하십시오.
해결책:
1. 좋아, 이제 시도 해보자. qq 인증 아이콘을 클릭 한 다음 계정 암호를 클릭하여 로그인합니다. qq 계정 암호를 입력하면 간격을 채우기위한 슬라이더 유형 인증 코드가 나타납니다.
2. 언뜻보기에 잃어버린 블록의 인증 코드가 골칫거리입니다이 웹 사이트는 괜찮습니다 생물학적 행동 특징 감지 기능이 없습니다 슬라이더가 미끄러지는 데 필요한 거리를 계산하기 만하면됩니다. 구체적인 검증 아이디어는 다음과 같습니다.
- 먼저 두 장의 사진을 얻으십시오. 하나는 틈이있는 완전한 사진이고 다른 하나는 누락 된 블록이있는 사진입니다.
- 그런 다음 이진화 처리를 수행합니다.
- 그런 다음 cv2.matchTemplate을 사용하여 슬라이더가있는 갭 맵의 위치를 일치시키고 거리 x를 반환 한 다음 브라우저로 이동하여 실제 슬라이딩 거리를 얻습니다.
- 이때 얻은 x는 셀레늄이 슬라이딩 거리를 시뮬레이션 할 수있는 거리가 아니므로 (x, distance)의 여러 세트를 측정 한 다음 커브 피팅 도구 를 사용하여 실제 슬라이딩 거리 공식을 계산해야합니다.
- 마지막으로 얻은 거리는 셀레늄의 실제 슬라이딩 거리입니다.
3. 먼저 두 개의 사진을 얻는 방법에 대해 이야기하겠습니다. 두 사진 주소는 괜찮습니다.
4. 누락 된 블록의 위치를 계산합니다.
def get_diff_location():
# 获取图片并灰度化
block = cv2.imread("block.jpg", 0) # 缺块图片
index = cv2.imread("index.jpg", 0) # 背景图片
# 二值化后的图片名称
block1 = "block1.jpg"
index1 = "index1.jpg"
# 将二值化后的图片进行保存
cv2.imwrite(block1, block)
cv2.imwrite(index1, index)
block = cv2.imread(block1)
block = cv2.cvtColor(block, cv2.COLOR_RGB2GRAY)
block = abs(255 - block)
cv2.imwrite(block1, block)
block = cv2.imread(block1)
template = cv2.imread(index1)
# 获取偏移量
result = cv2.matchTemplate(block, template, cv2.TM_CCOEFF_NORMED) # 查找block在template中的位置,返回result是一个矩阵,是每个点的匹配结果
x, y = np.unravel_index(result.argmax(), result.shape)
# print("x方向的偏移", int(y * 0.4 + 18), 'x:', x, 'y:', y)
return y
5. 실제 슬라이딩 거리를 구하고 두 값을 뺍니다.
6. 그런 다음 4 단계와 5 단계에서 데이터 세트를 몇 개 더 가져 와서 커브 피팅 웹 사이트에 올려 변환 공식을 출력합니다. 마지막으로 셀레늄을 사용하여 테스트합니다. 보통 1-3 번 성공합니다!
7. 마지막으로 완전한 코드를 게시하십시오!
import cv2
import numpy as np
import time
import requests
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
def get_diff_location():
# 获取图片并灰度化
block = cv2.imread("block.jpg", 0) # 缺块图片
index = cv2.imread("index.jpg", 0) # 背景图片
# 二值化后的图片名称
block1 = "block1.jpg"
index1 = "index1.jpg"
# 将二值化后的图片进行保存
cv2.imwrite(block1, block)
cv2.imwrite(index1, index)
block = cv2.imread(block1)
block = cv2.cvtColor(block, cv2.COLOR_RGB2GRAY)
block = abs(255 - block)
cv2.imwrite(block1, block)
block = cv2.imread(block1)
template = cv2.imread(index1)
# 获取偏移量
result = cv2.matchTemplate(block, template, cv2.TM_CCOEFF_NORMED) # 查找block在template中的位置,返回result是一个矩阵,是每个点的匹配结果
x, y = np.unravel_index(result.argmax(), result.shape)
# print("x方向的偏移", int(y * 0.4 + 18), 'x:', x, 'y:', y)
return y
def run():
url = 'https://www.zhihu.com/signin?next=%2F'
option = webdriver.ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation']) # webdriver防检测
option.add_argument("--no-sandbox")
option.add_argument("--disable-dev-usage")
desired_capabilities = DesiredCapabilities.CHROME # 修改页面加载策略
desired_capabilities["pageLoadStrategy"] = "none" # 注释这两行会导致最后输出结果的延迟,即等待页面加载完成再输出
driver = webdriver.Chrome(options=option)
driver.get(url)
time.sleep(2)
driver.find_element_by_xpath('//*[@id="root"]/div/main/div/div/div/div[3]/span[2]/button[2]').click() # 点击qq授权登入
time.sleep(2)
driver.switch_to.window(driver.window_handles[-1]) # 切换句柄
time.sleep(1)
driver.switch_to.frame("ptlogin_iframe")
driver.find_element_by_id('switcher_plogin').click() # 点击密码登入
time.sleep(2)
#输入账号密码
driver.find_element_by_id('u').send_keys('123123123')
driver.find_element_by_id('p').send_keys('123123123')
time.sleep(1)
# 点击登入
driver.find_element_by_id('login_button').click()
time.sleep(3)
driver.switch_to.frame('tcaptcha_iframe')
while True:
# 保存带缺块的背景图
with open('index.jpg','wb') as f:
url = driver.find_element_by_id('slideBg').get_attribute('src')
f.write(requests.get(url).content)
# 保存缺块图
with open('block.jpg','wb') as f:
url = driver.find_element_by_id('slideBlock').get_attribute('src')
f.write(requests.get(url).content)
#获取滑块
button = driver.find_element_by_id('tcaptcha_drag_thumb')
# 滑动滑块
ActionChains(driver).click_and_hold(button).perform()
x = get_diff_location()
print('拟合前的距离',x)
if x > 500:
# 刷新验证码
print('拟合前的距离有误')
ActionChains(driver).release().perform() # 释放鼠标
driver.find_element_by_id('e_reload').click()
time.sleep(2)
continue
distance = int(-0.002886710239855681*x*x*x+4.044880174577657*x*x-1888.1544118978823*x+293800.78433441074)
if (distance > 200) and (distance < 300):
distance -= 100
elif distance > 300:
print('距离出错')
# 刷新验证码
ActionChains(driver).release().perform() # 释放鼠标
driver.find_element_by_id('e_reload').click()
time.sleep(2)
continue
print('需要滑动的大概距离',distance)
ActionChains(driver).move_by_offset(xoffset=distance, yoffset=0).perform()
time.sleep(1)
ActionChains(driver).release().perform() # 释放鼠标
time.sleep(2)
# 检测是否滑动成功
try:
driver.find_element_by_id('tcaptcha_drag_thumb')
print('滑动失败,即将再次尝试!')
# 刷新验证码
driver.find_element_by_id('e_reload').click()
time.sleep(2)
except Exception:
break
print('验证成功!')
time.sleep(11111)
if __name__ == '__main__':
run()