吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 394|回复: 5
收起左侧

[求助] python写的密码箱请教大神完善一下

  [复制链接]
360514875 发表于 2024-12-29 12:19
import sys
import sqlite3
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QLineEdit, QPushButton, QMessageBox, QTableWidget, QTableWidgetItem, QHBoxLayout, QInputDialog, QMenu, QAction
from PyQt5.QtGui import QClipboard
from PyQt5.QtCore import Qt
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 NoSuchWindowException


class EdgePasswordBox(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.driver = None
        self.accounts = []  # 存储账号信息的列表
        self.db_connection = sqlite3.connect('edge_passwords.db')  # 连接 SQLite 数据库
        self.create_table()  # 创建表
        self.load_accounts()  # 加载已存储的账号信息
        self.login_in_progress = False  # 新增登录状态标志
        self.max_login_attempts = 3  # 最大登录重试次数

    def initUI(self):
        self.setWindowTitle('密码箱')  # 修改窗口标题
        self.setGeometry(100, 100, 500, 400)
        self.setWindowFlags(Qt.WindowStaysOnTopHint)  # 设置窗口总在最前
        # 创建布局
        main_layout = QVBoxLayout()

        # 表格部件用于显示账号信息
        self.account_table = QTableWidget()
        self.account_table.setColumnCount(3)  # 设置列数为 3,去掉 ID 列
        self.account_table.setHorizontalHeaderLabels(['用户名', '密码', '网址'])  # 设置表头
        self.account_table.setShowGrid(True)  # 显示网格
        self.account_table.setGridStyle(Qt.SolidLine)  # 设置网格样式为实线
        self.account_table.setStyleSheet("gridline-color: black;")  # 设置网格线颜色为黑色
        self.account_table.setContextMenuPolicy(3)  # 启用自定义上下文菜单
        self.account_table.customContextMenuRequested.connect(self.show_context_menu)
        self.account_table.cellDoubleClicked.connect(self.double_click_login)  # 连接双击事件到登录函数
        self.account_table.setEditTriggers(QTableWidget.NoEditTriggers)  # 设置表格为不可编辑状态
        main_layout.addWidget(self.account_table)

        # 水平布局用于添加新账号信息
        add_account_layout = QHBoxLayout()
        self.username_label = QLabel('用户名:')
        add_account_layout.addWidget(self.username_label)
        self.username_input = QLineEdit()
        add_account_layout.addWidget(self.username_input)
        self.password_label = QLabel('密码:')
        add_account_layout.addWidget(self.password_label)
        self.password_input = QLineEdit()
        self.password_input.setEchoMode(QLineEdit.Password)
        add_account_layout.addWidget(self.password_input)
        self.url_label = QLabel('网页 URL:')
        add_account_layout.addWidget(self.url_label)
        self.url_input = QLineEdit()
        add_account_layout.addWidget(self.url_input)
        self.add_button = QPushButton('添加账号')
        self.add_button.clicked.connect(self.add_account)
        add_account_layout.addWidget(self.add_button)
        main_layout.addLayout(add_account_layout)

        # 创建并添加登录按钮
        # self.login_button = QPushButton('登录')
        # self.login_button.clicked.connect(self.fill_login_form)
        # main_layout.addWidget(self.login_button)

        # 设置布局
        self.setLayout(main_layout)

    def create_table(self):
        cursor = self.db_connection.cursor()
        cursor.execute('''
            CREATE TABLE IF NOT EXISTS accounts (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                username TEXT NOT NULL,
                password TEXT NOT NULL,
                url TEXT NOT NULL
            )
        ''')
        self.db_connection.commit()

    def load_accounts(self):
        cursor = self.db_connection.cursor()
        cursor.execute('SELECT username, password, url FROM accounts')  # 仅查询用户名、密码和网址
        rows = cursor.fetchall()
        self.account_table.setRowCount(len(rows))  # 设置行数
        for row_index, row in enumerate(rows):
            for column_index, value in enumerate(row):
                item = QTableWidgetItem(str(value))
                self.account_table.setItem(row_index, column_index, item)
            self.accounts.append(row)

    def add_account(self):
        username = self.username_input.text()
        password = self.password_input.text()
        url = self.url_input.text()
        if not username or not password or not url:
            QMessageBox.warning(self, "输入错误", "请填写完整的用户名、密码和 URL。")
            return
        cursor = self.db_connection.cursor()
        cursor.execute('INSERT INTO accounts (username, password, url) VALUES (?,?,?)', (username, password, url))
        self.db_connection.commit()
        self.load_accounts()  # 重新加载账号信息
        self.username_input.clear()
        self.password_input.clear()
        self.url_input.clear()

    def show_context_menu(self, pos):
        context_menu = QMenu(self)
        edit_action = QAction("编辑", self)
        edit_action.triggered.connect(lambda: self.edit_account(self.account_table.currentRow()))
        delete_action = QAction("删除", self)
        delete_action.triggered.connect(lambda: self.delete_account(self.account_table.currentRow()))
        login_action = QAction("登录", self)  # 新增登录操作的菜单项
        login_action.triggered.connect(lambda: self.login_from_context_menu(self.account_table.currentRow()))
        copy_username_action = QAction("复制用户名", self)
        copy_username_action.triggered.connect(lambda: self.copy_username(self.account_table.currentRow()))
        copy_password_action = QAction("复制密码", self)
        copy_password_action.triggered.connect(lambda: self.copy_password(self.account_table.currentRow()))
        copy_url_action = QAction("复制网址", self)
        copy_url_action.triggered.connect(lambda: self.copy_url(self.account_table.currentRow()))
        context_menu.addAction(edit_action)
        context_menu.addAction(delete_action)
        context_menu.addAction(login_action)
        context_menu.addAction(copy_username_action)
        context_menu.addAction(copy_password_action)
        context_menu.addAction(copy_url_action)
        context_menu.exec_(self.account_table.mapToGlobal(pos))

    def edit_account(self, row_index):
        if row_index >= 0:
            username = self.account_table.item(row_index, 0).text()  # 列索引从 0 开始
            password = self.account_table.item(row_index, 1).text()
            url = self.account_table.item(row_index, 2).text()
            new_username, ok = QInputDialog.getText(self, "编辑账号", "请输入新的用户名:", text=username)
            if ok:
                new_password, ok = QInputDialog.getText(self, "编辑账号", "请输入新的密码:", text=password, echo=QLineEdit.Password)
                if ok:
                    new_url, ok = QInputDialog.getText(self, "编辑账号", "请输入新的网址:", text=url)
                    if ok:
                        cursor = self.db_connection.cursor()
                        # 根据用户名更新账号信息,因为 ID 不再显示
                        cursor.execute('UPDATE accounts SET username =?, password =?, url =? WHERE username =?', (new_username, new_password, new_url, username))
                        self.db_connection.commit()
                        self.load_accounts()  # 重新加载账号信息

    def delete_account(self, row_index):
        if row_index >= 0:
            username = self.account_table.item(row_index, 0).text()  # 列索引从 0 开始
            cursor = self.db_connection.cursor()
            # 根据用户名删除账号信息,因为 ID 不再显示
            cursor.execute('DELETE FROM accounts WHERE username =?', (username,))
            self.db_connection.commit()
        self.load_accounts()  # 重新加载账号信息

    def fill_login_form(self):
        if not self.accounts:
            QMessageBox.warning(self, "错误", "请先添加账号信息。")
            return
        selected_index = self.account_table.currentRow()
        if selected_index >= 0:
            self.login(selected_index)

    def double_click_login(self, row_index, column_index):
        if row_index >= 0:
            self.login(row_index)

    def login_from_context_menu(self, row_index):  # 从右键菜单登录的方法
        if row_index >= 0:
            self.login(row_index)

    def login(self, index):
        if self.login_in_progress:  # 检查登录是否正在进行
            return
        self.login_in_progress = True  # 标记登录开始
        username = self.accounts[index][0]  # 列索引从 0 开始
        password = self.accounts[index][1]
        url = self.accounts[index][2]
        login_attempts = 0
        while login_attempts < self.max_login_attempts:
            try:
                if self.driver is None:
                    self.driver = webdriver.Edge()
                # 打开新的标签页
                self.driver.execute_script("window.open('about:blank', '_blank');")
                self.driver.switch_to.window(self.driver.window_handles[-1])
                # 打开指定的网页
                self.driver.get(url)
                # 输入用户名
                username_input = self.driver.find_element(By.XPATH, "//input[@name='username']")
                username_input.send_keys(username)
                # 输入密码
                password_input = self.driver.find_element(By.XPATH, "//input[@name='password']")
                password_input.send_keys(password)
                # 点击登录按钮
                login_button = self.driver.find_element(By.XPATH, "//button[contains(@class, \"login-button\")]")
                login_button.click()
                break
            except NoSuchWindowException:
                if self.driver:
                    self.driver.quit()
                    self.driver = None
                login_attempts += 1
                if login_attempts == self.max_login_attempts:
                    QMessageBox.warning(self, "登录错误", "登录失败,窗口已关闭,请检查网络或网页。")
            except Exception as e:
                print(f"登录时发生异常: {type(e).__name__} - {str(e)}")  # 打印更详细的异常信息
                break
        self.login_in_progress = False  # 标记登录结束


    def copy_username(self, row_index):
        if row_index >= 0:
            username = self.account_table.item(row_index, 0).text()
            clipboard = QApplication.clipboard()
            clipboard.setText(username)

    def copy_password(self, row_index):
        if row_index >= 0:
            password = self.account_table.item(row_index, 1).text()
            clipboard = QApplication.clipboard()
            clipboard.setText(password)

    def copy_url(self, row_index):
        if row_index >= 0:
            url = self.account_table.item(row_index, 2).text()
            clipboard = QApplication.clipboard()
            clipboard.setText(url)


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = EdgePasswordBox()
    window.show()
    app.exec_()
二次登录加载慢,还有就是有的页面无法自动输入密码

软件运行示意图

软件运行示意图

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Dontp 发表于 2024-12-29 13:30
可以加一个打开密码的功能
 楼主| 360514875 发表于 2024-12-29 13:51
Dontp 发表于 2024-12-29 13:30
可以加一个打开密码的功能

先完善功能在加密密码。现在功能有点缺陷
L57860598 发表于 2024-12-29 13:54
import sys
import sqlite3
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QLineEdit, QPushButton, QMessageBox, QTableWidget, QTableWidgetItem, QHBoxLayout, QInputDialog, QMenu, QAction
from PyQt5.QtGui import QClipboard
from PyQt5.QtCore import Qt
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 NoSuchWindowException


class EdgePasswordBox(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()  
        self.driver  = None
        self.accounts  = []
        self.db_connection  = sqlite3.connect('edge_passwords.db')  
        self.create_table()  
        self.load_accounts()  
        self.login_in_progress  = False
        self.max_login_attempts  = 3


    def initUI(self):
        self.setWindowTitle(' 密码箱')
        self.setGeometry(100,  100, 500, 400)
        self.setWindowFlags(Qt.WindowStaysOnTopHint)  
        main_layout = QVBoxLayout()

        self.account_table  = QTableWidget()
        self.account_table.setColumnCount(3)  
        self.account_table.setHorizontalHeaderLabels([' 用户名', '密码', '网址'])
        self.account_table.setShowGrid(True)  
        self.account_table.setGridStyle(Qt.SolidLine)  
        self.account_table.setStyleSheet("gridline  - color: black;")
        self.account_table.setContextMenuPolicy(3)  
        self.account_table.customContextMenuRequested.connect(self.show_context_menu)  
        self.account_table.cellDoubleClicked.connect(self.double_click_login)  
        self.account_table.setEditTriggers(QTableWidget.NoEditTriggers)  
        main_layout.addWidget(self.account_table)  

        add_account_layout = self.create_add_account_layout()  
        main_layout.addLayout(add_account_layout)  

        self.setLayout(main_layout)  


    def create_add_account_layout(self):
        add_account_layout = QHBoxLayout()
        self.username_label  = QLabel('用户名:')
        add_account_layout.addWidget(self.username_label)  
        self.username_input  = QLineEdit()
        add_account_layout.addWidget(self.username_input)  
        self.password_label  = QLabel('密码:')
        add_account_layout.addWidget(self.password_label)  
        self.password_input  = QLineEdit()
        self.password_input.setEchoMode(QLineEdit.Password)  
        add_account_layout.addWidget(self.password_input)  
        self.url_label  = QLabel('网页 URL:')
        add_account_layout.addWidget(self.url_label)  
        self.url_input  = QLineEdit()
        add_account_layout.addWidget(self.url_input)  
        self.add_button  = QPushButton('添加账号')
        self.add_button.clicked.connect(self.add_account)  
        add_account_layout.addWidget(self.add_button)  
        return add_account_layout


    def create_table(self):
        cursor = self.db_connection.cursor()  
        cursor.execute('''  
            CREATE TABLE IF NOT EXISTS accounts (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                username TEXT NOT NULL,
                password TEXT NOT NULL,
                url TEXT NOT NULL
            )
        ''')
        self.db_connection.commit()  


    def load_accounts(self):
        cursor = self.db_connection.cursor()  
        cursor.execute('SELECT  username, password, url FROM accounts')
        rows = cursor.fetchall()  
        self.account_table.setRowCount(len(rows))  
        for row_index, row in enumerate(rows):
            for column_index, value in enumerate(row):
                item = QTableWidgetItem(str(value))
                self.account_table.setItem(row_index,  column_index, item)
            self.accounts.append(row)  


    def add_account(self):
        username = self.username_input.text()  
        password = self.password_input.text()  
        url = self.url_input.text()  
        if not username or not password or not url:
            QMessageBox.warning(self,  "输入错误", "请填写完整的用户名、密码和 URL。")
            return
        cursor = self.db_connection.cursor()  
        cursor.execute('INSERT  INTO accounts (username, password, url) VALUES (?,?,?)', (username, password, url))
        self.db_connection.commit()  
        self.load_accounts()  
        self.username_input.clear()  
        self.password_input.clear()  
        self.url_input.clear()  


    def show_context_menu(self, pos):
        context_menu = QMenu(self)
        edit_action = QAction("编辑", self)
        edit_action.triggered.connect(lambda:  self.edit_account(self.account_table.currentRow()))  
        delete_action = QAction("删除", self)
        delete_action.triggered.connect(lambda:  self.delete_account(self.account_table.currentRow()))  
        login_action = QAction("登录", self)
        login_action.triggered.connect(lambda:  self.login_from_context_menu(self.account_table.currentRow()))  
        copy_username_action = QAction("复制用户名", self)
        copy_username_action.triggered.connect(lambda:  self.copy_username(self.account_table.currentRow()))  
        copy_password_action = QAction("复制密码", self)
        copy_password_action.triggered.connect(lambda:  self.copy_password(self.account_table.currentRow()))  
        copy_url_action = QAction("复制网址", self)
        copy_url_action.triggered.connect(lambda:  self.copy_url(self.account_table.currentRow()))  
        context_menu.addAction(edit_action)  
        context_menu.addAction(delete_action)  
        context_menu.addAction(login_action)  
        context_menu.addAction(copy_username_action)  
        context_menu.addAction(copy_password_action)  
        context_menu.addAction(copy_url_action)  
        context_menu.exec_(self.account_table.mapToGlobal(pos))  


    def edit_account(self, row_index):
        if row_index >= 0:
            # 假设这里可以获取到账号的ID,需要在数据库查询和表格显示中进行相应调整
            account_id = self.accounts[row_index][3]  
            username = self.account_table.item(row_index,  0).text()
            password = self.account_table.item(row_index,  1).text()
            url = self.account_table.item(row_index,  2).text()
            new_username, ok = QInputDialog.getText(self,  "编辑账号", "请输入新的用户名:", text = username)
            if ok:
                new_password, ok = QInputDialog.getText(self,  "编辑账号", "请输入新的密码:", text = password, echo = QLineEdit.Password)
                if ok:
                    new_url, ok = QInputDialog.getText(self,  "编辑账号", "请输入新的网址:", text = url)
                    if ok:
                        cursor = self.db_connection.cursor()  
                        cursor.execute('UPDATE  accounts SET username =?, password =?, url =? WHERE id =?', (new_username, new_password, new_url, account_id))
                        self.db_connection.commit()  
                        self.load_accounts()  


    def delete_account(self, row_index):
        if row_index >= 0:
            # 假设这里可以获取到账号的ID,需要在数据库查询和表格显示中进行相应调整
            account_id = self.accounts[row_index][3]  
            cursor = self.db_connection.cursor()  
            cursor.execute('DELETE  FROM accounts WHERE id =?', (account_id,))
            self.db_connection.commit()  
        self.load_accounts()  


    def fill_login_form(self):
        if not self.accounts:  
            QMessageBox.warning(self,  "错误", "请先添加账号信息。")
            return
        selected_index = self.account_table.currentRow()  
        if selected_index >= 0:
            self.login(selected_index)  


    def double_click_login(self, row_index, column_index):
        if row_index >= 0:
            self.login(row_index)  


    def login_from_context_menu(self, row_index):
        if row_index >= 0:
            self.login(row_index)  


    def login(self, index):
        if self.login_in_progress:  
            return
        self.login_in_progress  = True
        username = self.accounts[index][0]  
        password = self.accounts[index][1]  
        url = self.accounts[index][2]  
        login_attempts = 0
        success = False
        while login_attempts < self.max_login_attempts  and not success:
            try:
                if self.driver  is None:
                    self.driver  = webdriver.Edge()
                self.driver.execute_script("window.open('about:blank',  '_blank');")
                self.driver.switch_to.window(self.driver.window_handles[-1])  
                self.driver.get(url)  
                username_input = self.driver.find_element(By.XPATH,  "//input[@name='username']")
                username_input.send_keys(username)  
                password_input = self.driver.find_element(By.XPATH,  "//input[@name='password']")
                password_input.send_keys(password)  
                login_button = self.driver.find_element(By.XPATH,  "//button[contains(@class, \"login - button\")]")
                login_button.click()  
                success = True
            except Exception as e:
                print(f"登录时发生异常: {type(e).__name__} - {str(e)}")
                if isinstance(e, NoSuchWindowException):
                    if self.driver:  
                        self.driver.quit()  
                        self.driver  = None
                login_attempts += 1
                if login_attempts == self.max_login_attempts:  
                    QMessageBox.warning(self,  "登录错误", "登录失败,请检查网络或网页。")
        self.login_in_progress  = False


    def copy_username(self, row_index):
        if row_index >= 0:
            username = self.account_table.item(row_index,  0).text()
            clipboard = QApplication.clipboard()  
            clipboard.setText(username)  


    def copy_password(self, row_index):
        if row_index >= 0:
            password = self.account_table.item(row_index,  1).text()
            clipboard = QApplication.clipboard()  
            clipboard.setText(password)  


    def copy_url(self, row_index):
        if row_index >= 0:
            url = self.account_table.item(row_index,  2).text()
            clipboard = QApplication.clipboard()  
            clipboard.setText(url)  


if __name__ == "__main__":
    app = QApplication(sys.argv)  
    window = EdgePasswordBox()
    window.show()  
    app.exec_()  

L57860598 发表于 2024-12-29 14:06
import sys
import sqlite3
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QLineEdit, QPushButton, QMessageBox, \
    QTableWidget, QTableWidgetItem, QHBoxLayout, QInputDialog, QMenu, QAction
from PyQt5.QtGui import QClipboard
from PyQt5.QtCore import Qt
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 NoSuchWindowException


class EdgePasswordBox(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.driver = None
        self.accounts = []
        self.db_connection = sqlite3.connect('edge_passwords.db')

        self.create_table()
        self.load_accounts()
        self.login_in_progress = False
        self.max_login_attempts = 3

    def initUI(self):
        self.setWindowTitle(' 密码箱')
        self.setGeometry(100, 100, 500, 400)
        self.setWindowFlags(Qt.WindowStaysOnTopHint)

        main_layout = QVBoxLayout()

        self.account_table = QTableWidget()
        self.account_table.setColumnCount(3)
        self.account_table.setHorizontalHeaderLabels([' 用户名', '密码', '网址'])
        self.account_table.setShowGrid(True)
        self.account_table.setGridStyle(Qt.SolidLine)
        self.account_table.setStyleSheet("gridline  - color: black;")
        self.account_table.setContextMenuPolicy(3)
        self.account_table.customContextMenuRequested.connect(self.show_context_menu)
        self.account_table.cellDoubleClicked.connect(self.double_click_login)
        self.account_table.setEditTriggers(QTableWidget.NoEditTriggers)

        main_layout.addWidget(self.account_table)

        add_account_layout = self.create_add_account_layout()
        main_layout.addLayout(add_account_layout)

        self.setLayout(main_layout)

    def create_add_account_layout(self):
        add_account_layout = QHBoxLayout()
        self.username_label = QLabel('用户名:')
        add_account_layout.addWidget(self.username_label)
        self.username_input = QLineEdit()
        add_account_layout.addWidget(self.username_input)
        self.password_label = QLabel('密码:')
        add_account_layout.addWidget(self.password_label)
        self.password_input = QLineEdit()
        self.password_input.setEchoMode(QLineEdit.Password)
        add_account_layout.addWidget(self.password_input)
        self.url_label = QLabel('网页URL:')
        add_account_layout.addWidget(self.url_label)
        self.url_input = QLineEdit()
        add_account_layout.addWidget(self.url_input)
        self.add_button = QPushButton('添加账号')
        self.add_button.clicked.connect(self.add_account)
        add_account_layout.addWidget(self.add_button)
        return add_account_layout

    def create_table(self):
        cursor = self.db_connection.cursor()
        cursor.execute('''  
            CREATE TABLE IF NOT EXISTS accounts (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                username TEXT NOT NULL,
                password TEXT NOT NULL,
                url TEXT NOT NULL
            )
        ''')
        self.db_connection.commit()

    def load_accounts(self):
        cursor = self.db_connection.cursor()
        cursor.execute('SELECT  username, password, url FROM accounts')
        rows = cursor.fetchall()
        self.account_table.setRowCount(len(rows))
        for row_index, row in enumerate(rows):
            for column_index, value in enumerate(row):
                item = QTableWidgetItem(str(value))
                self.account_table.setItem(row_index, column_index, item)
            self.accounts.append(row)

    def add_account(self):
        username = self.username_input.text()
        password = self.password_input.text()
        url = self.url_input.text()
        if not username or not password or not url:
            QMessageBox.warning(self, "输入错误", "请填写完整的用户名、密码和URL。")
            return
        cursor = self.db_connection.cursor()
        cursor.execute('INSERT  INTO accounts (username, password, url) VALUES (?,?,?)', (username, password, url))
        self.db_connection.commit()
        self.load_accounts()
        self.username_input.clear()
        self.password_input.clear()
        self.url_input.clear()

    def show_context_menu(self, pos):
        context_menu = QMenu(self)
        edit_action = QAction("编辑", self)
        edit_action.triggered.connect(lambda: self.edit_account(self.account_table.currentRow()))
        delete_action = QAction("删除", self)
        delete_action.triggered.connect(lambda: self.delete_account(self.account_table.currentRow()))
        login_action = QAction("登录", self)
        login_action.triggered.connect(lambda: self.login_from_context_menu(self.account_table.currentRow()))
        copy_username_action = QAction("复制用户名", self)
        copy_username_action.triggered.connect(lambda: self.copy_username(self.account_table.currentRow()))
        copy_password_action = QAction("复制密码", self)
        copy_password_action.triggered.connect(lambda: self.copy_password(self.account_table.currentRow()))
        copy_url_action = QAction("复制网址", self)
        copy_url_action.triggered.connect(lambda: self.copy_url(self.account_table.currentRow()))
        show_password_action = QAction("显示密码", self)
        show_password_action.triggered.connect(lambda: self.show_password(self.account_table.currentRow()))
        context_menu.addAction(edit_action)
        context_menu.addAction(delete_action)
        context_menu.addAction(login_action)
        context_menu.addAction(copy_username_action)
        context_menu.addAction(copy_password_action)
        context_menu.addAction(copy_url_action)
        context_menu.addAction(show_password_action)
        context_menu.exec_(self.account_table.mapToGlobal(pos))

    def edit_account(self, row_index):
        if row_index >= 0:
            # 假设这里可以获取到账号的ID,需要在数据库查询和表格显示中进行相应调整
            account_id = self.accounts[row_index][3]
            username = self.account_table.item(row_index, 0).text()
            password = self.account_table.item(row_index, 1).text()
            url = self.account_table.item(row_index, 2).text()
            new_username, ok = QInputDialog.getText(self, "编辑账号", "请输入新的用户名:", text=username)
            if ok:
                new_password, ok = QInputDialog.getText(self, "编辑账号", "请输入新的密码:", text=password,
                                                        echo=QLineEdit.Password)
                if ok:
                    new_url, ok = QInputDialog.getText(self, "编辑账号", "请输入新的网址:", text=url)
                    if ok:
                        cursor = self.db_connection.cursor()
                        cursor.execute('UPDATE  accounts SET username =?, password =?, url =? WHERE id =?',
                                       (new_username, new_password, new_url, account_id))
                        self.db_connection.commit()
                        self.load_accounts()

    def delete_account(self, row_index):
        if row_index >= 0:
            # 假设这里可以获取到账号的ID,需要在数据库查询和表格显示中进行相应调整
            account_id = self.accounts[row_index][3]
            cursor = self.db_connection.cursor()
            cursor.execute('DELETE  FROM accounts WHERE id =?', (account_id,))
            self.db_connection.commit()
            self.load_accounts()

    def fill_login_form(self):
        if not self.accounts:
            QMessageBox.warning(self, "错误", "请先添加账号信息。")
            return
        selected_index = self.account_table.currentRow()
        if selected_index >= 0:
            self.login(selected_index)

    def double_click_login(self, row_index, column_index):
        if row_index >= 0:
            self.login(row_index)

    def login_from_context_menu(self, row_index):
        if row_index >= 0:
            self.login(row_index)

    def login(self, index):
        if self.login_in_progress:
            return
        self.login_in_progress = True
        username = self.accounts[index][0]
        password = self.accounts[index][1]
        url = self.accounts[index][2]
        login_attempts = 0
        success = False
        while login_attempts < self.max_login_attempts and not success:
            try:
                if self.driver is None:
                    self.driver = webdriver.Edge()
                self.driver.execute_script("window.open('about:blank',  '_blank');")
                self.driver.switch_to.window(self.driver.window_handles[-1])
                self.driver.get(url)
                username_input = self.driver.find_element(By.XPATH, "//input[@name='username']")
                username_input.send_keys(username)
                password_input = self.driver.find_element(By.XPATH, "//input[@name='password']")
                password_input.send_keys(password)
                login_button = self.driver.find_element(By.XPATH, "//button[contains(@class, \"login - button\")]")
                login_button.click()
                success = True
            except Exception as e:
                print(f"登录时发生异常: {type(e).__name__} - {str(e)}")
                if isinstance(e, NoSuchWindowException):
                    if self.driver:
                        self.driver.quit()
                        self.driver = None
                login_attempts += 1
                if login_attempts == self.max_login_attempts:
                    QMessageBox.warning(self, "登录错误", "登录失败,请检查网络或网页。")
        self.login_in_progress = False

    def copy_username(self, row_index):
        if row_index >= 0:
            username = self.account_table.item(row_index, 0).text()
            clipboard = QApplication.clipboard()
            clipboard.setText(username)

    def copy_password(self, row_index):
        if row_index >= 0:
            password = self.account_table.item(row_index, 1).text()
            clipboard = QApplication.clipboard()
            clipboard.setText(password)

    def copy_url(self, row_index):
        if row_index >= 0:
            url = self.account_table.item(row_index, 2).text()
            clipboard = QApplication.clipboard()
            clipboard.setText(url)

    def show_password(self, row_index):
        if row_index >= 0:
            password = self.account_table.item(row_index, 1).text()
            QMessageBox.information(self, "密码显示", f"密码为: {password}")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = EdgePasswordBox()
    window.show()
    app.exec_()

 楼主| 360514875 发表于 2024-12-30 08:15
L57860598 发表于 2024-12-29 14:06
import sys
import sqlite3
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel,  ...

登录校验时,比较卡,能不能把校验去掉,只进行正常填码,同时密码箱不受网页登录影响,只负责传递。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-2 19:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表