一个自动打开网站自动录入信息,并把它保存在粘贴板案例

45 阅读3分钟

image.png

代码:

# -*- coding: utf-8 -*-
import pyautogui
import time
import pyperclip
import logging
import webbrowser
import tkinter as tk
from typing import Optional
import keyboard  # 需要安装:pip install keyboard

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)

# 配置参数
CONFIG = {
    'tax_id': '账号',
    'password': '密码',
    'wait_time': 1,
    'initial_delay': 3,
    'url': 'https://baidu.com'
}

# 全局存储账号密码
CREDENTIALS = {
    'username': None,
    'password': None
}

class StatusWindow:
    def __init__(self):
        self.root = tk.Tk()
        self.root.title("自动操作状态")
        
        # 设置窗口大小和位置
        self.root.geometry("300x120+100+100")
        
        # 设置窗口透明度
        self.root.attributes('-alpha', 0.8)
        
        # 设置窗口置顶
        self.root.attributes('-topmost', True)
        
        # 创建标签
        self.label = tk.Label(
            self.root,
            text="准备开始...\nCtrl+1: 粘贴账号\nCtrl+2: 粘贴密码",
            font=('微软雅黑', 12),
            wraplength=280,
            justify='left'
        )
        self.label.pack(pady=20)

    def update_status(self, message: str):
        """更新状态信息"""
        self.label.config(text=message)
        self.root.update()

    def close(self):
        """关闭窗口"""
        self.root.destroy()

def setup_hotkeys():
    """设置热键"""
    try:
        # 注册 Ctrl+1 粘贴账号
        keyboard.add_hotkey('ctrl+1', lambda: paste_username())
        logging.info("已注册热键 Ctrl+1 粘贴账号")
        
        # 注册 Ctrl+2 粘贴密码
        keyboard.add_hotkey('ctrl+2', lambda: paste_password())
        logging.info("已注册热键 Ctrl+2 粘贴密码")
        
    except Exception as e:
        logging.error(f"设置热键时发生错误: {str(e)}")

def paste_username():
    """粘贴账号"""
    if CREDENTIALS['username']:
        try:
            original_clipboard = pyperclip.paste()
            pyperclip.copy(CREDENTIALS['username'])
            pyautogui.hotkey('ctrl', 'v')
            time.sleep(0.1)
            pyperclip.copy(original_clipboard)  # 恢复原剪贴板内容
            logging.info("已粘贴账号")
        except Exception as e:
            logging.error(f"粘贴账号时发生错误: {str(e)}")
    else:
        logging.warning("账号未设置")

def paste_password():
    """粘贴密码"""
    if CREDENTIALS['password']:
        try:
            original_clipboard = pyperclip.paste()
            pyperclip.copy(CREDENTIALS['password'])
            pyautogui.hotkey('ctrl', 'v')
            time.sleep(0.1)
            pyperclip.copy(original_clipboard)  # 恢复原剪贴板内容
            logging.info("已粘贴密码")
        except Exception as e:
            logging.error(f"粘贴密码时发生错误: {str(e)}")
    else:
        logging.warning("密码未设置")

def open_tax_website() -> None:
    """打开培训管理系统"""
    try:
        logging.info("正在打开管理系统...")
        webbrowser.open(CONFIG['url'])
        # 等待浏览器加载
        time.sleep(CONFIG['initial_delay'])
        
        # 移动到第一个位置并点击
        logging.info("移动到第一个位置...")
        pyautogui.moveTo(1560, 393)
        pyautogui.click()
        
    except Exception as e:
        logging.error(f"打开网站或移动鼠标时发生错误: {str(e)}")
        raise

def safe_paste(text: str, wait_time: Optional[float] = None) -> None:
    """安全地执行复制粘贴操作"""
    wait_time = wait_time or CONFIG['wait_time']
    try:
        pyperclip.copy(text)
        time.sleep(wait_time)
        pyautogui.hotkey('ctrl', 'v')
        time.sleep(wait_time)
    except Exception as e:
        logging.error(f"粘贴文本 '{text}' 时发生错误: {str(e)}")
        raise

def safe_key_press(key: str, wait_time: Optional[float] = None) -> None:
    """安全地执行按键操作"""
    wait_time = wait_time or CONFIG['wait_time']
    try:
        pyautogui.press(key)
        time.sleep(wait_time)
    except Exception as e:
        logging.error(f"按键 '{key}' 操作发生错误: {str(e)}")
        raise

def save_credentials() -> None:
    """保存账号密码到全局变量"""
    try:
        CREDENTIALS['username'] = CONFIG['tax_id']
        CREDENTIALS['password'] = CONFIG['password']
        logging.info(f"已保存账号密码到内存:\n账号: {CREDENTIALS['username']}\n密码: {CREDENTIALS['password']}")
    except Exception as e:
        logging.error(f"保存账号密码时发生错误: {str(e)}")
        raise

def fill_tax_form() -> None:
    """填写税务表单的主要函数"""
    status_window = StatusWindow()
    
    try:
        status_window.update_status("开始填写表单...\nCtrl+1: 粘贴账号\nCtrl+2: 粘贴密码")
        logging.info("开始填写表单...")
        
        # 首先设置热键
        setup_hotkeys()
        
        # 保存账号密码到内存
        status_window.update_status("正在保存账号密码...")
        save_credentials()
        
        # 然后打开网站
        status_window.update_status("正在打开培训管理系统...")
        open_tax_website()
        
        status_window.update_status("正在进行页面操作...")
        # 等待页面加载完成
        status_window.update_status("等待页面加载...")
        time.sleep(CONFIG['initial_delay'])
        
        # 输入税号
        status_window.update_status("正在输入税号...")
        logging.info("正在输入税号...")
        safe_paste(CONFIG['tax_id'])
        safe_key_press('tab')
        
        # 输入密码
        status_window.update_status("正在输入密码...")
        logging.info("正在输入密码...")
        safe_paste(CONFIG['password'])
        
        status_window.update_status("表单填写完成!\nCtrl+1: 粘贴账号\nCtrl+2: 粘贴密码")
        logging.info("表单填写完成")
        
        # 保持程序运行,等待热键
        status_window.root.mainloop()
        
    except Exception as e:
        error_msg = f"发生错误: {str(e)}"
        status_window.update_status(error_msg)
        logging.error(f"填写表单时发生错误: {str(e)}")
        time.sleep(3)  # 显示错误信息3秒
        raise
    finally:
        try:
            status_window.close()
        except:
            pass

if __name__ == "__main__":
    try:
        fill_tax_form()
        
    except Exception as e:
        print('='*50)
        print(f'程序执行出错: {str(e)}')
        print('-'*50)
        print('手动记录:')
        print(f'账号: {CONFIG["tax_id"]}')
        print(f'密码: {CONFIG["password"]}')
        print('='*50)
        
        # 可选:在控制台输出后等待一下
        input("按Enter键退出程序...")