selenium自动化操作

selenium自动化操作之六:基于cookies绕过验证码登录

2019-08-20  本文已影响0人  52d19f475fe5

cookies是储存在用户本地终端上的数据,可以叫做浏览器缓存。cookies可以帮助Web站点保存有关访问者的信息,方便用户的访问。如记住用户名密码实现自动登录

1 webdriver操作cookies的方法

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
for cookie in driver.get_cookies():
    print(cookie)
driver.quit()

运行结果:

{'domain': 'baidu.com', 'httpOnly': False, 'name': 'H_PS_PSSID', 'path': '/', 'secure': False, 'value': '1464_21114_29522_29518_29098_29568_29220_29641'}
{'domain': 'baidu.com', 'expiry': 3713749787.353785, 'httpOnly': False, 'name': 'BIDUPSID', 'path': '/', 'secure': False, 'value': '8A5ED58DED579E5012FEFE654B59E182'}
{'domain': 'baidu.com', 'httpOnly': False, 'name': 'delPer', 'path': '/', 'secure': False, 'value': '0'}
{'domain': 'baidu.com', 'expiry': 3713749787.353819, 'httpOnly': False, 'name': 'PSTM', 'path': '/', 'secure': False, 'value': '1566266135'}
{'domain': 'baidu.com', 'expiry': 1566352540.633414, 'httpOnly': False, 'name': 'BDORZ', 'path': '/', 'secure': False, 'value': 'B490B5EBF6F3CD402E515D22BCDA1598'}
{'domain': 'www.baidu.com', 'expiry': 1567130140, 'httpOnly': False, 'name': 'BD_UPN', 'path': '/', 'secure': False, 'value': '12314753'}
{'domain': 'www.baidu.com', 'httpOnly': False, 'name': 'BD_HOME', 'path': '/', 'secure': False, 'value': '0'}
{'domain': 'baidu.com', 'expiry': 3713749787.353728, 'httpOnly': False, 'name': 'BAIDUID', 'path': '/', 'secure': False, 'value': '8A5ED58DED579E5012FEFE654B59E182:FG=1'}

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
print(driver.get_cookie('BAIDUID'))
driver.quit()

运行结果:

{'domain': 'baidu.com', 'expiry': 3713751770.625061, 'httpOnly': False, 'name': 'BAIDUID', 'path': '/', 'secure': False, 'value': 'A1BFF6D63CC791A6F1F3978B864FABAA:FG=1'}

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.delete_all_cookies()
cookies = driver.get_cookies()
print(cookies)
driver.quit()

运行结果:

[]
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
print(driver.get_cookie('BAIDUID'))
driver.delete_cookie('BAIDUID')
print(driver.get_cookie('BAIDUID'))
driver.quit()

运行结果:

{'domain': 'baidu.com', 'expiry': 3713752514.478564, 'httpOnly': False, 'name': 'BAIDUID', 'path': '/', 'secure': False, 'value': 'A8DC2AEFA3061036E6E502F17855D79A:FG=1'}
None

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.delete_all_cookies()
driver.add_cookie({'name': 'python', 'value': 'selenium'})
cookies = driver.get_cookies()
print(cookies)
driver.quit()

运行结果:

[{'domain': 'www.baidu.com', 'httpOnly': False, 'name': 'python', 'path': '/', 'secure': True, 'value': 'selenium'}]

2 基于cookies绕过验证码登录

我们可以在用户登录之前,通过add_cookie()方法将用户名密码写入浏览器cookie,然后刷新driver.refresh(),将自动登录。例如下面的方式:

from selenium import webdriver
from time import sleep

# 访问 https://www.xxxx.cn/ 网站
driver = webdriver.Chrome()
driver.get("https://www.xxxx.cn/")

# 将用户名密码写入浏览器 cookie
driver.add_cookie({'name': 'Login_UserNumber', 'value': 'username'})
driver.add_cookie({'name': 'Login_Passwd', 'value': 'password'})

sleep(2)
driver.refresh()
sleep(3)
driver.quit()

使用 cookie 进行登录最大的难点是如何获得用户名密码的 name ,如果找到不到 name 的名字,就没办法向 value 中输用户名、密码信息。

我们可以通过 get_cookies()方法来获取登录的所有的 cookie 信息,从而进行找到用户名、密码的 name 对象的名字;如果做自动化测试,最简单的方法还是询问前端开发人员。

使用Cookie绕过百度验证码自动登录账户
1 人为登录,生成cookies
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
input('如果已登录,按enter键继续!')
for cookie in driver.get_cookies():
    print(cookie)
driver.quit()

运行结果:

如果已登录,按enter键继续!
{'domain': 'baidu.com', 'expiry': 1825592198.751748, 'httpOnly': True, 'name': 'BDUSS', 'path': '/', 'secure': False, 'value': 'M0ZHFQSmZTYnJyYlBKNEl2YVpOTktQaHZRbHJFRndKaHhXcn5ucW5VR0F6SVJkSVFBQUFBJCQAAAAAAAAAAAEAAAC1tOJwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIA~XV2AP11dUj'}
{'domain': 'www.baidu.com', 'httpOnly': False, 'name': 'BD_HOME', 'path': '/', 'secure': False, 'value': '1'}
{'domain': 'baidu.com', 'expiry': 1566478562.822935, 'httpOnly': False, 'name': 'BDORZ', 'path': '/', 'secure': False, 'value': 'B490B5EBF6F3CD402E515D22BCDA1598'}
{'domain': 'www.baidu.com', 'expiry': 1567256200, 'httpOnly': False, 'name': 'BD_UPN', 'path': '/', 'secure': False, 'value': '12314753'}
{'domain': 'baidu.com', 'httpOnly': False, 'name': 'H_PS_PSSID', 'path': '/', 'secure': False, 'value': '1454_21081_29522_29519_29098_29568_29221'}
{'domain': 'baidu.com', 'expiry': 3713875809.402672, 'httpOnly': False, 'name': 'PSTM', 'path': '/', 'secure': False, 'value': '1566392156'}
{'domain': 'baidu.com', 'httpOnly': False, 'name': 'delPer', 'path': '/', 'secure': False, 'value': '0'}
{'domain': 'baidu.com', 'expiry': 3713875809.402645, 'httpOnly': False, 'name': 'BIDUPSID', 'path': '/', 'secure': False, 'value': '41946DF98D70EF194684D248F4B5B638'}
{'domain': 'baidu.com', 'expiry': 3713875809.402578, 'httpOnly': False, 'name': 'BAIDUID', 'path': '/', 'secure': False, 'value': '41946DF98D70EF194684D248F4B5B638:FG=1'}

拿到记录用户名、密码等cookie信息

2 用Fiddler 4 抓包工具分析

用Fiddler 4 抓包发现,百度账号用户名、密码的name为BAIDUIDBDUSS

3 百度账号登录成功的条件

分析发现,百度在账号登录后会生成一个记录用户名的标签,这样就可以用显示等待的方式自动判断用户是否登录成功

4 用cookie登录

范例代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import os
import json
import time


class Spider(object):
    def __init__(self):
        self.driver = webdriver.Chrome()
        self.login_url = 'https://www.baidu.com'
        self.driver.get(self.login_url)

    def _login(self):
        print('请手动登录百度账号!')
        WebDriverWait(self.driver, 1000).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, 'span.user-name'))
        )
        print('登录成功!')
        username = self.driver.get_cookie('BAIDUID')
        password = self.driver.get_cookie('BDUSS')
        user_cookie = {'name': 'BAIDUID', 'value': username['value']}
        pass_cookie = {'name': 'BDUSS', 'value': password['value']}
        cookies = [user_cookie, pass_cookie]
        cookies_str = json.dumps(cookies)

        f = open('cookies.txt', 'w')
        f.write(cookies_str)
        f.close()

    def _add_cookies(self, cookies):
        self.driver.delete_all_cookies()
        for cookie in cookies:
            self.driver.add_cookie(cookie)
        time.sleep(3)
        self.driver.refresh()
        WebDriverWait(self.driver, 7).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, 'span.user-name'))
        )
        print('登录成功!')

    def _check_cookies(self):
        try:
            if os.path.exists('cookies.txt'):
                f = open('cookies.txt', 'r')
                cookies_str = f.read()
                f.close()

                cookies = json.loads(cookies_str)
                self._add_cookies(cookies)
            else:
                self._login()
        except:
            self._login()

    def run(self):
        self._check_cookies()
        time.sleep(6)
        self.driver.quit()


if __name__ == '__main__':
    spider = Spider()
    spider.run()

上一篇下一篇

猜你喜欢

热点阅读