阿里系純滑塊驗證碼破解思路

本文旨在經驗交流,如若侵犯利益,請聯繫刪除。


阿里系滑塊驗證碼以nc_1開頭,通過調用XXXnc.js來實現。

給個例子,視覺中國的登陸頁面www.vcg.com/login

對於這樣的驗證碼,進行JS破解是比較難得,所以應該通過selenium進行破解。

在破解過程中會遇到被網站識別出來,一般都是send_keys後面再拖動再點擊登陸,但是這樣大部分不行的,多半是阿里的js識別出來了。

大抵是出現:

瀏覽器最大化時被識別

執行滑動的action被識別

send_keys後被識別

處理邏輯是:

打開瀏覽器後,最大化後get(url)再刷新頁面。

滑動滑塊不能利用webdriver,利用pynput這個模塊去做拖動操作,這個庫是比較底層的,調用win32。之前使用pyautogui發現不行,估計被封裝多次,已經被識別出來了

from pynput.mouse import Button, Controller as c1

send_keys應該在滑塊拖動之後,這樣不會被識別了

import json
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from pynput.keyboard import Key, Controller as c2
from pynput.mouse import Button, Controller as c1

class vcg_get_cookies():
    mouse = c1()
    url = 'https://www.vcg.com/login'
    options = webdriver.ChromeOptions()
    # 不加載圖片,加快訪問速度
    options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
    # 此步驟很重要,設置爲開發者模式,防止被各大網站識別出來使用了Selenium
    options.add_experimental_option('excludeSwitches', ['enable-automation'])
    # 添加本地代理
    # options.add_argument("--proxy--server=127.0.0.1:8080")
    # 添加UA
    ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
    options.add_argument('user-agent=' + ua)

    driver = webdriver.Chrome(executable_path="D:\chromedriver.exe", options=options)
    driver.maximize_window()
    wait = WebDriverWait(driver, 10)
    driver.get(url)
    time.sleep(3)
    driver.refresh()
    while True:
        # pyautogui.press('f5')
        # keyboard.press(Key.f5)
        driver.refresh()
        time.sleep(3)
        mouse.position = (1562, 355)
        mouse.press(Button.left)
        mouse.move(1890, 358)
        mouse.release(Button.left)
        time.sleep(3)
        WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.CLASS_NAME, 'nc-lang-cnt')))
        if driver.find_element_by_class_name('nc-lang-cnt').text == '驗證通過':
            break

    time.sleep(2)
    driver.find_element_by_name('id').send_keys('用戶名')
    time.sleep(2)
    driver.find_element_by_name('password').send_keys('密碼')
    driver.find_element_by_class_name('sign-in-form__btn').click()
    time.sleep(5)
    user_name = wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'userInfo')))
    print(user_name)
    cookies = driver.get_cookies()  # Selenium爲我們提供了get_cookies來獲取登錄cookies
    driver.close()  # 獲取cookies便可以關閉瀏覽器
    # 然後的關鍵就是保存cookies,之後請求從文件中讀取cookies就可以省去每次都要登錄一次的
    # 當然可以把cookies返回回去,但是之後的每次請求都要先執行一次login沒有發揮cookies的作用
    jsonCookies = json.dumps(cookies)  # 通過json將cookies寫入文件
    with open('vcgCookies.json', 'w') as f:
        f.write(jsonCookies)
    print(cookies)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章