爬蟲: 滑塊驗證碼破解

如下代碼應用於頭條號登陸獲取cookie,99%經過率。但願頭條號可以提供受權發表文章的API。bash

測試地址:sso.toutiao.com/login/?serv…服務器

借鑑的原文連接zhuanlan.zhihu.com/p/57675338zhuanlan.zhihu.com/p/57976223cookie

服務器使用cv2報錯的看這裏,juejin.im/post/5cfb41…app

第一步,計算缺口距離

先對背景圖與缺口圖發請求,保存爲本地文件,而後使用函數FindPic計算出缺口距離函數

def FindPic(target, template):
    """ 找出圖像中最佳匹配位置 :param target: 目標即背景圖 :param template: 模板即須要找到的圖 :return: 返回最佳匹配及其最差匹配和對應的座標 """
    target_rgb = cv2.imread(target)
    target_gray = cv2.cvtColor(target_rgb, cv2.COLOR_BGR2GRAY)
    template_rgb = cv2.imread(template, 0)
    res = cv2.matchTemplate(target_gray, template_rgb, cv2.TM_CCOEFF_NORMED)
    value = cv2.minMaxLoc(res)
    return value[2:][0][0], value[2:][1][0]  # 採用value[2:][1][0]
複製代碼

第二步,生成加減速爲主的滑動軌跡

def generate_tracks(distance):
    distance += 20
    v = 0
    t = 0.2
    forward_tracks = []
    current = 0
    mid = distance * 3 / 5  # 減速閥值
    while current < distance:
        if current < mid:
            a = 2  # 加速度爲+2
        else:
            a = -3  # 加速度-3
        s = v * t + 0.5 * a * (t ** 2)
        v = v + a * t
        current += s
        forward_tracks.append(round(s))
    back_tracks = [-3, -3, -2, -2, -2, -2, -2, -1, -1, -1]
    return forward_tracks, back_tracks
複製代碼

第三步,使用selenium實現滑動

value_1, value_2 = findpic(target_name, template_name)
action = ActionChains(driver)  # 實例化一個action對象
button = driver.find_element_by_xpath('//*[@id="validate-drag-wrapper"]/div[2]/img')  # 找到滑塊
try:
    action.click_and_hold(button).perform()  # perform()用來執行ActionChains中存儲的行爲
except StaleElementReferenceException as e:
    pass
action.reset_actions()
forward_tracks, back_tracks = generate_tracks(value_2)
for x in forward_tracks:
    action.move_by_offset(x, 0)  # 前進移動滑塊
for x in back_tracks:
    action.move_by_offset(x, 0)  # 後退移動滑塊
action.release().perform()  # 鬆開鼠標
複製代碼
相關文章
相關標籤/搜索