python自动操作edge浏览器,登录后保存登录信息及使用带插件的edge

本文介绍了如何使用Python的Selenium库自动化登录Edge浏览器,并保存登录后的Cookies信息。通过判断页面上的头像元素是否存在来确认登录状态,成功登录后将Cookies保存到配置文件,以便后续使用。
摘要由CSDN通过智能技术生成

要在Selenium中通过扫描登录获取并保存登录信息,您可以使用以下步骤:

  1. 获取Cookie:在用户登录后,服务器通常会在响应的Header中返回一个Set-Cookie字段,其中包含了用户的身份信息。您可以使用get_cookies()方法获取这些Cookie,并将其保存到本地文件中。
  2. 保存Cookie:将获取到的Cookie列表保存到本地文件中,例如使用json格式保存。您可以使用json.dump()方法将Cookie列表保存到文件中。
  3. 读取Cookie:在下次需要登录时,您可以读取本地文件中的Cookie,并将其设置为浏览器会话的一部分。这可以通过add_cookie()方法实现。
  4. 刷新页面:在添加了Cookie之后,您需要刷新页面以使Cookie生效。

一、修改目标网站

我们要进行自动化操作AI,这儿以Kimi.ai - 帮你看更大的世界 (moonshot.cn) icon-default.png?t=N7T8https://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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PyAIGCMaster

1毛钱也是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值