溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何進(jìn)行Selenium自動登錄淘寶的登錄漏洞分析

發(fā)布時間:2021-12-09 09:14:30 來源:億速云 閱讀:123 作者:柒染 欄目:大數(shù)據(jù)

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)如何進(jìn)行Selenium自動登錄淘寶的登錄漏洞分析,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。


 

一、前言

之前手動登錄淘寶使瀏覽器保存我的信息,然后使用本地用戶配置控制瀏覽器,投機(jī)取巧地解決了登錄問題。

雖然這不失為一種方法,但這卻讓selenium的全自動變成了半自動,不配Python之美。

那么如何全自動登錄淘寶呢?起初我是在互聯(lián)網(wǎng)上找一些資源項目,直接拿來分析,但隨著淘寶的反爬機(jī)制的增強(qiáng),他們的這些方法都行不通了。于是我決定,自己動手!

 

二、分析

為了方便使用,我將整個代碼進(jìn)行了封裝,文件名為login,類名為Login,請大家接著往下看。

 
1)相關(guān)依賴
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium import webdriver
import time
   
2)構(gòu)造函數(shù)
def __init__(self, username, password):
     """
     初始化瀏覽器配置和登錄信息
     """
     self.url = 'https://login.taobao.com/member/login.jhtml'
     # 初始化瀏覽器選項
     options = webdriver.ChromeOptions()
     # 禁止加載圖片
     options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
     # 設(shè)置為開發(fā)者模式
     options.add_experimental_option('excludeSwitches', ['enable-automation'])
     # 加載瀏覽器選項
     self.browser = webdriver.Chrome(options=options)
     # 設(shè)置顯式等待時間40s
     self.wait = WebDriverWait(self.browser, 40)
     self.username = username  # 用戶名
     self.password = password  # 密碼
   
3)原始登錄,使用淘寶賬號或手機(jī)號登錄
def original(self):
    """
    直接使用淘寶賬號登錄

    :return: None
    """
    self.browser.get(url=self.url)
    try:
        input_username = self.wait.until(EC.presence_of_element_located((
            By.CSS_SELECTOR, 'div.fm-field > div.input-plain-wrap.input-wrap-loginid > input'
        )))
        input_password = self.wait.until(EC.presence_of_element_located((
            By.CSS_SELECTOR, 'div.fm-field > div.input-plain-wrap.input-wrap-password > input'
        )))
        # 等待滑塊按鈕加載
        div = self.wait.until(EC.presence_of_element_located((
            By.ID, 'nc_1__bg'
        )))
        input_username.send_keys(self.username)
        input_password.send_keys(self.password)
        # 休眠2s,等待滑塊按鈕加載
        time.sleep(2)
        # 點(diǎn)擊并按住滑塊
        ActionChains(self.browser).click_and_hold(div).perform()
        # 移動滑塊
        ActionChains(self.browser).move_by_offset(xoffset=300, yoffset=0).perform()
        # 等待驗證通過
        self.wait.until(EC.text_to_be_present_in_element((
            By.CSS_SELECTOR, 'div#nc_1__scale_text > span.nc-lang-cnt > b'), '驗證通過'
        ))
        # 登錄
        input_password.send_keys(Keys.ENTER)
        print('Successful !')
    except TimeoutException as e:
        print('Error:', e.args)
        self.original()
 

其它的結(jié)點(diǎn)元素的定位我就不多說了,主要說一下滑塊的定位。

如何進(jìn)行Selenium自動登錄淘寶的登錄漏洞分析  

利用瀏覽器定位的話,會定位到 span這個結(jié)點(diǎn),但經(jīng)過我模仿單擊按住,拖拽后滑塊一動不動,參數(shù)也沒有任何改變。于是我嘗試了一下它的父節(jié)點(diǎn)div還是按住后拖拽,這次成功了。所以有時候不要懷疑自己的代碼,有可能是其它方面的問題。

還有關(guān)于拖拽還要說明一下,淘寶的登錄驗證不是極驗驗證碼,不是拖動滑塊拼圖的操作,而是將滑塊拖到最右端。所以,至于這個最右端,只要距離夠長,且不超出界面范圍,長度隨便定!

最后補(bǔ)充一下,偶爾會出現(xiàn)這種情況。

如何進(jìn)行Selenium自動登錄淘寶的登錄漏洞分析  

得到這張圖也是很不容易啊,因為這種情況真的是太少了。經(jīng)過反復(fù)實驗,大概是因為滑動的軌跡不是基本水平導(dǎo)致的,就是說朝著斜下方滑動,雖然也能到達(dá)最右端,但會給出這個錯誤。我的程序是讓它水平方向滑動300,豎直方向坐標(biāo)為0。雖然是水平滑動,但是為了提高程序的容錯率,還是加上了一個驗證通過的等待。

 
4)使用新浪微博賬號登錄,巧妙利用漏洞

提示:在用新浪微博登錄之前,請在淘寶上綁定你的新浪賬號。

def sina(self):
    """
    使用新浪微博賬號登錄(提前綁定新浪賬號)

    :return: None
    """
    self.browser.get(url=self.url)
    try:
        # 等待新浪登錄鏈接加載
        weibo_login = self.wait.until(EC.element_to_be_clickable((
            By.CSS_SELECTOR, '#login-form a.weibo-login'
        )))
        weibo_login.click()
        input_username = self.wait.until(EC.presence_of_element_located((
            By.CSS_SELECTOR, 'div.info_list > div.inp.username > input.W_input'
        )))
        input_password = self.wait.until(EC.presence_of_element_located((
            By.CSS_SELECTOR, 'div.info_list > div.inp.password > input.W_input'
        )))
        input_username.send_keys(self.username)
        input_password.send_keys(self.password)
        input_password.send_keys(Keys.ENTER)
        # 等待瀏覽器保存我方信息,網(wǎng)速不好可以設(shè)置長一點(diǎn)
        time.sleep(5)
        # 刷新頁面
        self.browser.refresh()
        # 等待快速登錄按鈕加載
        quick_login = self.wait.until(EC.element_to_be_clickable((
            By.CSS_SELECTOR, 'div.info_list > div.btn_tip > a.W_btn_g'
        )))
        quick_login.click()
        print('login successful !')
    except TimeoutException as e:
        print('Error:', e.args)
        self.sina()
 

關(guān)于結(jié)點(diǎn)元素的定位我就不多說了,主要說一下這個漏洞

正常情況下,輸入完信息后點(diǎn)擊登錄,就該進(jìn)入淘寶頁面了,但是這個登錄按鈕不管怎么點(diǎn),頁面都是無動于衷。

定位一下,可以發(fā)現(xiàn):

如何進(jìn)行Selenium自動登錄淘寶的登錄漏洞分析  

這個按鈕的鏈接是javascript:void(0),假鏈接!?。?/p>

由于我的前端基礎(chǔ)不好,不知道這啥意思。我瘋狂的在互聯(lián)網(wǎng)上查找如何使用selenium點(diǎn)擊這種鏈接,可依舊沒找到解決的辦法。有沒有人知道如何處理這種,請給原文作者留言!

然而就在我快放棄的時候,按了下F5刷新,奇跡出現(xiàn)了!

如何進(jìn)行Selenium自動登錄淘寶的登錄漏洞分析  

檢測到已登錄的微博賬號,快速登錄???原來雖然我沒有進(jìn)入淘寶,但是瀏覽器左下角一直在顯示如:等待**相應(yīng),正在解析主機(jī)等信息。所以淘寶還是保存了我的賬號信息,只要下次自動登錄的勾打上(默認(rèn)打勾),它就會保存賬號信息。

這就是為什么上面的代碼,在輸入好信息并回車登錄后,要等待5秒,就是讓它保存我的賬號信息。

最后刷新頁面,點(diǎn)擊快速登錄,大功告成!

 

三、完整代碼及使用方法

 
1)完整代碼
# -*- coding: utf-8 -*-
"""
@author:Pineapple

@contact:cppjavapython@foxmail.com

@time:2020/7/28 9:09

@file:login.py

@desc: login taobao .
"""

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.keys import Keys
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium import webdriver
import time


class Login:
    def __init__(self, username, password):
        """
        初始化瀏覽器配置和登錄信息
        """
        self.url = 'https://login.taobao.com/member/login.jhtml'
        # 初始化瀏覽器選項
        options = webdriver.ChromeOptions()
        # 禁止加載圖片
        options.add_experimental_option("prefs", {"profile.managed_default_content_settings.images": 2})
        # 設(shè)置為開發(fā)者模式
        options.add_experimental_option('excludeSwitches', ['enable-automation'])
        # 加載瀏覽器選項
        self.browser = webdriver.Chrome(options=options)
        # 設(shè)置顯式等待時間40s
        self.wait = WebDriverWait(self.browser, 40)
        self.username = username  # 用戶名
        self.password = password  # 密碼

    def original(self):
        """
        直接使用淘寶賬號登錄

        :return: None
        """
        self.browser.get(url=self.url)
        try:
            input_username = self.wait.until(EC.presence_of_element_located((
                By.CSS_SELECTOR, 'div.fm-field > div.input-plain-wrap.input-wrap-loginid > input'
            )))
            input_password = self.wait.until(EC.presence_of_element_located((
                By.CSS_SELECTOR, 'div.fm-field > div.input-plain-wrap.input-wrap-password > input'
            )))
            # 等待滑塊按鈕加載
            div = self.wait.until(EC.presence_of_element_located((
                By.ID, 'nc_1__bg'
            )))
            input_username.send_keys(self.username)
            input_password.send_keys(self.password)
            # 休眠2s,等待滑塊按鈕加載
            time.sleep(2)
            # 點(diǎn)擊并按住滑塊
            ActionChains(self.browser).click_and_hold(div).perform()
            # 移動滑塊
            ActionChains(self.browser).move_by_offset(xoffset=300, yoffset=0).perform()
            # 等待驗證通過
            self.wait.until(EC.text_to_be_present_in_element((
                By.CSS_SELECTOR, 'div#nc_1__scale_text > span.nc-lang-cnt > b'), '驗證通過'
            ))
            # 登錄
            input_password.send_keys(Keys.ENTER)
            print('Successful !')
        except TimeoutException as e:
            print('Error:', e.args)
            self.original()

    def sina(self):
        """
        使用新浪微博賬號登錄(提前綁定新浪賬號)

        :return: None
        """
        self.browser.get(url=self.url)
        try:
            # 等待新浪登錄鏈接加載
            weibo_login = self.wait.until(EC.element_to_be_clickable((
                By.CSS_SELECTOR, '#login-form a.weibo-login'
            )))
            weibo_login.click()
            input_username = self.wait.until(EC.presence_of_element_located((
                By.CSS_SELECTOR, 'div.info_list > div.inp.username > input.W_input'
            )))
            input_password = self.wait.until(EC.presence_of_element_located((
                By.CSS_SELECTOR, 'div.info_list > div.inp.password > input.W_input'
            )))
            input_username.send_keys(self.username)
            input_password.send_keys(self.password)
            input_password.send_keys(Keys.ENTER)
            # 等待瀏覽器保存我方信息,網(wǎng)速不好可以設(shè)置長一點(diǎn)
            time.sleep(5)
            # 刷新頁面
            self.browser.refresh()
            # 等待快速登錄按鈕加載
            quick_login = self.wait.until(EC.element_to_be_clickable((
                By.CSS_SELECTOR, 'div.info_list > div.btn_tip > a.W_btn_g'
            )))
            quick_login.click()
            print('login successful !')
        except TimeoutException as e:
            print('Error:', e.args)
            self.sina()
   
2)使用

在使用的時候要導(dǎo)入這個Login類,然后初始化這個類,最后登錄方法使用相應(yīng)的函數(shù),文件名為login,類名為Login。

from login import Login

username = '******'  # 賬號
password = '******.'  # 密碼
# 初始化Login類
login = Login(username, password)
# 使用淘寶賬號或手機(jī)號登錄
login.original()
# 使用新浪微博賬號登錄
# login.sina()
   

上述就是小編為大家分享的如何進(jìn)行Selenium自動登錄淘寶的登錄漏洞分析了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI