要在Selenium中通过扫描登录获取并保存登录信息,您可以使用以下步骤:
- 获取Cookie:在用户登录后,服务器通常会在响应的Header中返回一个Set-Cookie字段,其中包含了用户的身份信息。您可以使用
get_cookies()
方法获取这些Cookie,并将其保存到本地文件中。 - 保存Cookie:将获取到的Cookie列表保存到本地文件中,例如使用
json
格式保存。您可以使用json.dump()
方法将Cookie列表保存到文件中。 - 读取Cookie:在下次需要登录时,您可以读取本地文件中的Cookie,并将其设置为浏览器会话的一部分。这可以通过
add_cookie()
方法实现。 - 刷新页面:在添加了Cookie之后,您需要刷新页面以使Cookie生效。
一、修改目标网站
我们要进行自动化操作AI,这儿以Kimi.ai - 帮你看更大的世界 (moonshot.cn) https://kimi.moonshot.cn/ 为例。
二、判断头像,做为是否登录的依据
分析:模拟操作时,通过判断是否有头像判断登录。如何登录成功,则返回true。如何通过xpath判断。 /html/body/div[1]/div/div[2]/div[3]/div/div[1]/div[2]/div/div/div/div/img 这是一个完整的xpath。如果没有此路径,则未登录。如何写代码能保证,查找不以时不出错,查找到返回成功的标志,方便让另一函数将当前的cookies,保存下来。下次如果有保存信息则直接引用,如果无,则等待,直至有登录cookies.
from selenium.common.exceptions import NoSuchElementException
def is_logged_in(driver):
# 定义头像元素的XPath
avatar_xpath = "/html/body/div[1]/div/div[2]/div[3]/div/div[1]/div[2]/div/div/div/div/img"
try:
# 尝试查找头像元素
avatar = driver.find_element_by_xpath(avatar_xpath)
return True # 如果找到头像元素,返回True(登录成功)
except NoSuchElementException:
return False # 如果找不到头像元素,返回False(未登录)
def wait_for_login(driver, max_wait_time=30):
import time
start_time = time.time()
while time.time() - start_time < max_wait_time:
if is_logged_in(driver):
return True # 登录成功,返回True
time.sleep(1) # 等待1秒后继续检查
return False # 超过最大等待时间仍未登录,返回False
# 示例用法
if not wait_for_login(driver):
print("登录超时或失败,请检查登录过程。")
else:
print("登录成功,可以保存当前Cookies。")
三、保存cookies到配置文件
分析:如果您希望将Cookies保存到名为process.ini的INI配置文件的user_infos部分,并将Cookies以avatar_name字段的形式存储,可以使用Python的内置库configparser来操作INI文件。以下是相应的代码示例:
首先,确保已经安装了configparser库(通常已随Python标准库提供,无需额外安装)。然后,使用以下代码将Cookies保存到INI文件:
import configparser
def save_cookies_to_ini(cookies, ini_file_path="process.ini", section="user_infos", key="avatar_name"):
config = configparser.ConfigParser()
# 如果配置文件不存在,创建一个新的
if not config.read(ini_file_path):
config.add_section(section)
# 将Cookies序列化为JSON字符串(便于存储和解析)
json_cookies = json.dumps(cookies)
# 将Cookies字符串写入INI文件的指定部分和键下
config.set(section, key, json_cookies)
with open(ini_file_path, "w") as ini_file:
config.write(ini_file)
print("Cookies已保存到INI文件。")
# 示例用法
save_cookies_to_ini(driver.get_cookies())
三、修改读取按钮的代码
def read_work_directory():
directory = filedialog.askdirectory()
if directory:
print(f"正在读取工作目录 '{directory}'...")
global global_work_directory, global_main_file_path
# 将工作目录路径赋值给全局变量
global_work_directory = directory
global_questions_file_path = os.path.join(directory, "questions.txt") # 假设主文件名为"main_file.txt"
global_answers_file_path = os.path.join(directory, "answers.txt") # 假设主文件名为"main_file.txt"
global_process_file_path = os.path.join(directory, "process.ini") # 假设主文件名为"main_file.txt"
print(f"工作目录已保存到全局变量:global_work_directory = {global_work_directory}, "
f"global_file_path = {global_questions_file_path},{global_answers_file_path},{global_process_file_path}")
添加全局变量
# 假设您希望将工作目录路径分别赋值给以下全局变量:
global_work_directory = ""
global_questions_file_path = ""
global_answers_file_path = ""
global_process_file_path = ""
三、测试结果
发现在文本中没有存储信息。继续修改。发现src的值是一直变化的,找规则固定。
# 尝试查找头像元素
avatar = driver.find_element(by=By.XPATH, value=avatar_xpath)
# 获取头像图片的URL
avatar_name = avatar.get_attribute('src').split("?")[0][-5:]
print(avatar_name)
return True, avatar_name # 如果找到头像元素,返回True(登录成功)
三、最后登录成功,并保证cookies的代码。
import tkinter as tk
from tkinter import filedialog
from datetime import datetime
import os
from tkinter import messagebox
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
import json
import time
import configparser
from configparser import ConfigParser
# 创建窗口
window = tk.Tk()
window.title("工作目录管理")
window.geometry("800x600")
# 假设您希望将工作目录路径分别赋值给以下全局变量:
global_work_directory = ""
global_questions_file_path = ""
global_answers_file_path = ""
global_process_file_path = ""
# 建立工作目录的函数
def create_work_directory():
# 弹出文件对话框,让用户选择目录
directory = filedialog.askdirectory()
if directory:
# 获取当前日期和时间
current_time = datetime.now().strftime("%Y%m%d-%H%M%S")
# 创建以当前日期和时间命名的新目录
new_directory = os.path.join(directory, f"work_{current_time}")
os.makedirs(new_directory)
# 在新目录下创建三个文本文件
questions_file = os.path.join(new_directory, "questions.txt")
answers_file = os.path.join(new_directory, "answers.txt")
process_ini_file = os.path.join(new_directory, "process.ini")
with open(questions_file, 'w') as f:
f.write("这里是问题列表\n")
with open(answers_file, 'w') as f:
f.write("这里是答案列表\n")
with open(process_ini_file, 'w') as f:
f.write("[Process]\n[user_info]")
# 提示用户工作目录已创建
print(f"工作目录 '{new_directory}' 已创建。")
# 读取工作目录的函数(此处仅打印路径,实际应用中可以添加更多功能)
def read_work_directory():
global global_work_directory
global global_questions_file_path
global global_answers_file_path
global global_process_file_path
directory = filedialog.askdirectory()
if directory:
print(f"正在读取工作目录 '{directory}'...")
# global global_work_directory, global_main_file_path
# 将工作目录路径赋值给全局变量
global_work_directory = directory
global_questions_file_path = os.path.join(directory, "questions.txt") # 假设主文件名为"main_file.txt"
global_answers_file_path = os.path.join(directory, "answers.txt") # 假设主文件名为"main_file.txt"
global_process_file_path = os.path.join(directory, "process.ini") # 假设主文件名为"main_file.txt"
print(f"工作目录已保存到全局变量:global_work_directory = {global_work_directory}, "f"global_file_path = {global_questions_file_path},{global_answers_file_path},{global_process_file_path}")
# 打开Edge浏览器的函数
def open_edge_browser():
# 检查Edge驱动程序是否正确安装
try:
# 设置Edge选项
edge_options = Options()
edge_options.use_chromium = True
# 向Edge浏览器传递启动参数
edge_options.add_argument('--disable-extensions') # 禁用浏览器扩展
edge_options.add_argument('--disable-gpu') # 禁用GPU硬件加速
# 初始化Edge浏览器驱动(假设msedgedriver.exe已添加到PATH)
driver = webdriver.Edge(options=edge_options)
driver.get("https://kimi.moonshot.cn/") # 替换为你想要打开的URL
# # 示例用法
# if not wait_for_login(driver):
# print("登录超时或失败,请检查登录过程。")
# else:
# print("登录成功,可以保存当前Cookies。")
while True:
logged, avatar_name = wait_for_login(driver, max_wait_time=30)
# global global_process_file_path
if not logged:
print("登录超时或失败,请检查登录过程。")
# 休息一段时间后重新尝试登录(可根据需要调整间隔时间)
time.sleep(5)
continue # 继续下一轮循环
print(f"登录成功,头像图片的URL为:{avatar_name}")
"""
示例函数,保存当前Cookies和头像URL。
实际项目中请根据您的存储方式(文件、数据库等)进行相应实现。
"""
cookies = driver.get_cookies()
print("ini文件路径:",global_process_file_path)
print(cookies)
# 在这里执行登录成功后的操作,如保存Cookies和头像URL_name
save_cookies_to_ini(cookies=cookies,ini_file_path=global_process_file_path,section="user_info",key=avatar_name)
break # 登录成功,退出循环
# 保持运行
print("\n浏览器已打开,请按回车键退出程序...")
input() # 等待用户按下回车键
except Exception as e:
messagebox.showerror("Error", f"Edge驱动程序未找到或发生错误:{str(e)}。请确保已正确安装并配置环境变量。")
def is_logged_in(driver):
# 定义头像元素的XPath
avatar_xpath = "/html/body/div[1]/div/div[2]/div[3]/div/div[1]/div[2]/div/div/div/div/img"
try:
# 尝试查找头像元素
avatar = driver.find_element(by=By.XPATH, value=avatar_xpath)
# 获取头像图片的URL
avatar_name = avatar.get_attribute('src').split("?")[0][-5:]
# print("找到了固定值:",avatar_name)
return True, avatar_name # 如果找到头像元素,返回True(登录成功)
except NoSuchElementException:
return False,None # 如果找不到头像元素,返回False(未登录)
def wait_for_login(driver, max_wait_time=30):
start_time = time.time()
while time.time() - start_time < max_wait_time:
is_logged, avatar_name = is_logged_in(driver)
if is_logged:
return True, avatar_name # 登录成功,返回True以及头像URL
time.sleep(1) # 等待1秒后继续检查
return False, None # 超过最大等待时间仍未登录,返回False以及None作为URL占位符
#保存cookies到ini中
def save_cookies_to_ini(cookies, ini_file_path, section="user_info", key=""):
# config = configparser.ConfigParser()
print("ini:",ini_file_path,"\n","cookies:",cookies,"\n","section:",section,"\n","key:",key)
config = ConfigParser()
if not config.has_section('user_info'):
config.add_section('user_info')
# 如果配置文件不存在,创建一个新的
if not config.read(ini_file_path):
config.add_section(section)
# 将Cookies序列化为JSON字符串(便于存储和解析)
json_cookies = json.dumps(cookies)
# 将Cookies字符串写入INI文件的指定部分和键下
config.set(section, key, json_cookies)
with open(ini_file_path, "w") as ini_file:
config.write(ini_file)
print("Cookies已保存到INI文件。")
# 创建按钮
button_create = tk.Button(window, text="建立工作目录", command=create_work_directory)
button_create.pack()
button_read = tk.Button(window, text="选择工作目录", command=read_work_directory)
button_read.pack()
# 创建按钮
button_open = tk.Button(window, text="打开Edge浏览器", command=lambda: open_edge_browser())
button_open.pack()
# 运行窗口
window.mainloop()