本文目录导读:

- 使用 Selenium(Web 自动化)
- 使用 Requests(API 模拟登录)
- 使用 PyAutoGUI(桌面应用控制)
- 使用 Playwright(现代自动化框架)
- 配置文件管理(安全建议)
- 完整示例(带错误处理)
- 安全建议
使用 Selenium(Web 自动化)
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
# 初始化浏览器
driver = webdriver.Chrome()
try:
# 访问登录页面
driver.get("https://example.com/login")
# 等待页面加载
time.sleep(2)
# 填写用户名和密码
username_input = driver.find_element(By.ID, "username")
password_input = driver.find_element(By.ID, "password")
username_input.send_keys("your_username")
password_input.send_keys("your_password")
# 点击登录按钮
login_button = driver.find_element(By.ID, "login-btn")
login_button.click()
# 等待登录完成
time.sleep(3)
finally:
driver.quit()
使用 Requests(API 模拟登录)
import requests
# 创建会话
session = requests.Session()
# 登录信息
login_data = {
"username": "your_username",
"password": "your_password",
"_token": "" # 可能需要CSRF token
}
# 发送POST请求登录
login_url = "https://example.com/api/login"
response = session.post(login_url, data=login_data)
if response.status_code == 200:
print("登录成功!")
# 使用已登录的会话访问其他页面
profile_response = session.get("https://example.com/profile")
print(profile_response.text)
使用 PyAutoGUI(桌面应用控制)
import pyautogui
import time
# 等待手动打开应用
time.sleep(5)
# 定位并点击用户名输入框
username_field = pyautogui.locateOnScreen('username_field.png')
if username_field:
pyautogui.click(username_field)
pyautogui.typewrite('your_username', interval=0.1)
# 按Tab键移动到密码框
pyautogui.press('tab')
pyautogui.typewrite('your_password', interval=0.1)
# 提交登录
pyautogui.press('enter')
使用 Playwright(现代自动化框架)
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
# 访问登录页面
page.goto("https://example.com/login")
# 填写表单
page.fill("#username", "your_username")
page.fill("#password", "your_password")
# 点击登录
page.click("#login-btn")
# 等待页面跳转
page.wait_for_url("**/dashboard")
browser.close()
配置文件管理(安全建议)
import json
import os
from cryptography.fernet import Fernet
class LoginManager:
def __init__(self, config_file="credentials.json"):
self.config_file = config_file
self.key_file = "secret.key"
def generate_key(self):
"""生成加密密钥"""
key = Fernet.generate_key()
with open(self.key_file, "wb") as key_file:
key_file.write(key)
def save_credentials(self, username, password):
"""加密保存凭据"""
# 加载密钥
with open(self.key_file, "rb") as f:
key = f.read()
cipher = Fernet(key)
# 加密密码
encrypted_password = cipher.encrypt(password.encode())
# 保存到文件
credentials = {
"username": username,
"password": encrypted_password.decode()
}
with open(self.config_file, "w") as f:
json.dump(credentials, f)
def load_credentials(self):
"""加载并解密凭据"""
# 读取配置文件
with open(self.config_file, "r") as f:
credentials = json.load(f)
# 加载密钥
with open(self.key_file, "rb") as f:
key = f.read()
cipher = Fernet(key)
# 解密密码
username = credentials["username"]
password = cipher.decrypt(credentials["password"].encode()).decode()
return username, password
完整示例(带错误处理)
import time
import logging
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
from selenium.common.exceptions import TimeoutException, NoSuchElementException
logging.basicConfig(level=logging.INFO)
class AutoLogin:
def __init__(self, username, password, url):
self.username = username
self.password = password
self.url = url
self.driver = None
def setup_driver(self):
"""初始化浏览器驱动"""
options = webdriver.ChromeOptions()
options.add_argument('--headless') # 无头模式
self.driver = webdriver.Chrome(options=options)
def login(self):
"""执行登录"""
try:
self.setup_driver()
self.driver.get(self.url)
# 等待登录表单加载
wait = WebDriverWait(self.driver, 10)
# 定位元素
username_input = wait.until(
EC.presence_of_element_located((By.ID, "username"))
)
password_input = self.driver.find_element(By.ID, "password")
login_button = self.driver.find_element(By.ID, "login-btn")
# 填写登录信息
username_input.clear()
username_input.send_keys(self.username)
password_input.clear()
password_input.send_keys(self.password)
# 点击登录
login_button.click()
# 等待登录完成
time.sleep(3)
logging.info("登录成功!")
return True
except TimeoutException:
logging.error("登录超时")
return False
except NoSuchElementException as e:
logging.error(f"找不到元素: {e}")
return False
finally:
if self.driver:
self.driver.quit()
# 使用示例
if __name__ == "__main__":
auto_login = AutoLogin("username", "password", "https://example.com/login")
success = auto_login.login()
if success:
print("登录成功")
else:
print("登录失败")
安全建议
- 不要硬编码密码:使用环境变量或加密配置文件
- 使用虚拟环境:隔离项目依赖
- 添加重试机制:处理网络波动
- 设置超时时间:避免无限等待
- 处理Cookies:保存会话状态
- 避免触发反爬:设置合理的等待时间
选择哪种方法取决于你的具体需求:Web应用用Selenium/Playwright,API接口用Requests,桌面应用用PyAutoGUI。