图

代码:
import pyautogui
import time
import pyperclip
import logging
import webbrowser
import tkinter as tk
from typing import Optional
import 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:
keyboard.add_hotkey('ctrl+1', lambda: paste_username())
logging.info("已注册热键 Ctrl+1 粘贴账号")
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)
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键退出程序...")