[2020-09-24] Zhihu 시뮬레이션 로그인-셀레늄

면책 조항 :이 기사는 연구 및 연구용이며 불법적 인 용도로 사용하는 것은 금지되어 있습니다. 그렇지 않으면 귀하의 책임입니다. 침해 사항이있는 경우 통지하고 삭제하십시오. 감사합니다!

프로젝트 장면 :

이번에는 QQ에서 인증 한 로그인 항목을 사용하여 Zhihu의 셀레늄 자동 로그인을 가져 왔습니다. 링크는 여기 입니다. 로그인 API 인터페이스를 사용하여 이전에 로그인 시뮬레이션을 시도했지만 성공하지 못했기 때문에 여전히 정직합니다. 먼저 브라우저로 로그인하십시오.

여기에 사진 설명 삽입


해결책:


1. 좋아, 이제 시도 해보자. qq 인증 아이콘을 클릭 한 다음 계정 암호를 클릭하여 로그인합니다. qq 계정 암호를 입력하면 간격을 채우기위한 슬라이더 유형 인증 코드가 나타납니다.

여기에 사진 설명 삽입

2. 언뜻보기에 잃어버린 블록의 인증 코드가 골칫거리입니다이 웹 사이트는 괜찮습니다 생물학적 행동 특징 감지 기능이 없습니다 슬라이더가 미끄러지는 데 필요한 거리를 계산하기 만하면됩니다. 구체적인 검증 아이디어는 다음과 같습니다.
  1. 먼저 두 장의 사진을 얻으십시오. 하나는 틈이있는 완전한 사진이고 다른 하나는 누락 된 블록이있는 사진입니다.
  2. 그런 다음 이진화 처리를 수행합니다.
  3. 그런 다음 cv2.matchTemplate을 사용하여 슬라이더가있는 갭 맵의 위치를 ​​일치시키고 거리 x를 반환 한 다음 브라우저로 이동하여 실제 슬라이딩 거리를 얻습니다.
  4. 이때 얻은 x는 셀레늄이 슬라이딩 거리를 시뮬레이션 할 수있는 거리가 아니므로 (x, distance)의 여러 세트를 측정 한 다음 커브 피팅 도구 를 사용하여 실제 슬라이딩 거리 공식을 계산해야합니다.
  5. 마지막으로 얻은 거리는 셀레늄의 실제 슬라이딩 거리입니다.

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()


추천

출처blog.csdn.net/qq_26079939/article/details/108777370