本文旨在經驗交流,如若侵犯利益,請聯系刪除。
2019.09.10
下面的例子已經改為阿里的人機認證了,但是其實用selenium啟動瀏覽器后,依舊可以用pynput來操控鍵鼠來完成模擬操作,單純調用send_keys()和click()都會被識別出來了。webdriver參數太多了,有興趣的可以考慮puppeteer來實現。
阿里系滑塊驗證碼以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)