绕过登录 验证码的方法
WebDriver相关的Cookies操作
- get_cookies(): 获取当前会话中当前域名所有cookies
- get_cookie(name): 获取当前会话中当前域名指定name对应的cookie值
- delete_cookie(name): 删除指定cookie
- delete_all_cookies(): 删除所有cookie
- add_cookie(self, cookie_dict): 添加cookie
添加Cookie时需要逐条添加,cookie_dict示例:
- driver.add_cookie({'name' : 'foo', 'value' : 'bar'})
- driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/'})
- driver.add_cookie({'name' : 'foo', 'value' : 'bar', 'path' : '/', 'secure':True})"
如何添加cookie实现绕过登录
以百度为例
- 我们先登录百度为例,通过F12查看响应头的cookie值如下图
)
从图中可以找出:name= "BDUSS",value = "3R-T21PamZseEJmLVlmQ1ZNS2ZRQ3VPeUJE"
构造cookie字典
cookie = {'name' : 'BIDUPSID', 'value' : '3R-T21PamZseEJmLVlmQ1ZNS2ZRQ3VPeUJEVUtXUE**'}
然后调用:driver.add_cookie(cookie_dict=cookie)
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.maximize_window()
time.sleep(1)
cookie = {"name":"BDUSS", "value":"3R-T21PamZseEJmLVlmQ1ZNS2ZRQ3VPeUJEVUtXUEoxUkx2ODVTZ1REZmczOVZmSVFBQUFBJCQAAAAAAAAAAAEAAAA1p7iuyeTI1WluZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBSrl~gUq5fb"}
driver.add_cookie(cookie_dict=cookie)
driver.get("https://www.baidu.com/")
time.sleep(10)
driver.quit(
Traceback (most recent call last):
File "I:/python/softwaredate/py_basics/1****/14 selenium cookie绕过登录.py", line 10, in
driver.add_cookie(cookie_dict=cookie)
File "D:\software\python38\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 894, in add_cookie
self.execute(Command.ADD_COOKIE, {'cookie': cookie_dict})
File "D:\software\python38\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
self.error_handler.check_response(response)
File "D:\software\python38\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain
(Session info: chrome=85.0.4183.102)**
如发现如上报错怎么解决呢:
只需要在添加cookie上方增加一个打开网页的地址即可
from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.maximize_window()
time.sleep(1)
cookie = {"name":"BDUSS", "value":"3R-T21PamZseEJmLVlmQ1ZNS2ZRQ3VPeUJEVUtXUEoxUkx2ODVTZ1REZmczOVZmSVFBQUFBJCQAAAAAAAAAAAEAAAA1p7iuyeTI1WluZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBSrl~gUq5fb"}
driver.get("https://www.baidu.com/") 添加这一行即可
driver.add_cookie(cookie_dict=cookie)
driver.get("https://www.baidu.com/")
time.sleep(10)
driver.quit(
上面的方式就可以实现绕过登录,不过这要注意以下两点:
- 生成 cookie 的账号不能有退出操作,否则 cookie 会失效。
- 注意 cookie 的有效期(
Expires/Max-Age
列),可能需要定时更新 cookie
第2种:接口登录获取cookie,构造成cookie_dict添加到add_cookie
import requests
from selenium import webdriver
from time import sleep
def get_cookie(username, password):
login_url = 'http://****/newecshop/admin/privilege.php'
data = dict(username=username,password=password, act='signin')
res = requests.post(login_url, data=data, allow_redirects=False)
esscp_id = res.cookies.get('ECSCP_ID')
cookie = dict(name='ECSCP_ID',value=esscp_id)
return cookie
admin_url = 'http://****/newecshop/admin/index.php'
driver = webdriver.Chrome()
driver.get(admin_url)
cookie = get_cookie(****, ****)
driver.add_cookie(cookie)
driver.get('http://***/newecshop/admin/order.php?act=list')
sleep(3)
driver.quit()
第三种: 启动 Chrome 浏览器绕过登录
我们每次打开浏览器做相应操作时,对应的缓存和 cookie 会保存到浏览器默认的路径下,我们先查看个人资料路径,以 chrome 为例,我们在地址栏输入chrome://version/
图中的个人资料路径就是我们需要的,我们去掉后面的 \Default,然后在路径前加上「–user-data-dir=」就拼接出我们要的路径了。
profile_directory = r'--user-data-dir=C:\Users\xxx\AppData\Local\Google\Chrome\User Data'
接下来,我们启动浏览器的时候采用带选项时的启动,这种方式启动浏览器需要注意,运行代码前需要关闭所有的正在运行 chrome 程序,不然会报错。全部代码如下。
from selenium import webdriver
import time
import os,platform
if platform.system() =="Windows":
os.system("taskkill -im chrome* -f") # 把chrome开头的进程都杀掉
else:
os.system("killall -9 chrome*")
# 获取用户目录
my_dir = os.path.expanduser("~")
profile_directory = r'--user-data-dir={}\AppData\Local\Google\Chrome\User Data'.format(my_dir)
print(profile_directory)
option = webdriver.ChromeOptions()
option.add_argument(profile_directory)
driver = webdriver.Chrome(chrome_options=option)
driver.get("https://www.baidu.com/")
time.sleep(2)
selenium 自动化启动浏览器后我们会发现我之前保存的书签完整在浏览器上方,baidu 账号也是登录的状态。
启动 Firfox 浏览器****绕过登录
Firfox 火狐浏览也可以这样启动它,设置略有不同。
首先,查看配置文件的存储路径,查看方法:帮助–故障排除信息–配置文件夹,把里面的路径复制过来就行。
profile_path=r'C:\Users\guixianyang\AppData\Local\Temp\rust_mozprofile. eL9WjoEWqIP1
from selenium import webdriver
import time
import os,platform
if platform.system() =="Windows":
os.system("taskkill -im chrome* -f") # 把chrome开头的进程都杀掉
else:
os.system("killall -9 chrome*")
# 获取用户目录
my_dir = os.path.expanduser("~")
profile_directory = r'--user-data-dir={}\AppData\Local\Temp\rust_mozprofile. eL9WjoEWqIP1 Data'.format(my_dir)
print(profile_directory)
option = webdriver.FirefoxOptions()
option.add_argument(profile_directory)
driver = webdriver.Firefox(chrome_options=option)
driver.get("https://www.baidu.com/")
time.sleep(2)
我们也在火狐浏览器中登录好百度的账号,用 selenium 自动化启动带配置文件的火狐浏览器,也会发现启动时已经启动了浏览器安装的插件和登录好的百度账号。
绕过图形验证码的网站
文中第一个图是登录时的图形验证码,我们登录后(cookie 有一定的时效,貌似有 10 天半个月左右),把上面代码中的链接换成的,再用上面的方法觉可以实现绕过登录页的图形验证码。