欢迎光临
我们一直在努力

【工具分享】PTA / 不能粘贴网站救星:模拟人工键盘输入的小工具(Python 版)可以直接在PyCharm使用

相信不少同学都遇到过这种令人崩溃的情况:

某些网站(特别是 PTA、线上考试系统、问卷平台等)不允许 Ctrl+V 粘贴,导致大量文字只能手敲……

作为一个写代码的人,遇到这种事肯定不能忍😅
于是我利用空闲时间写了个简单但非常实用的小工具:

通过读取剪贴板 → 模拟键盘敲字来输入内容,从而绕过网站的“禁止粘贴”限制!

下面正式介绍 👇👇👇


🚀 工具原理(非常简单但有效)

核心思想非常朴素:

  • 使用 pyperclip 读取剪贴板内容

  • 使用 keyboard.write() 模拟一个个字符敲进输入框

  • 避开网站对 Ctrl+V 粘贴的检测

  • 效果就和你自己敲字一样,不会触发“粘贴检测”

甚至我还加了
Mode:模拟人工输入(0.05 秒输入一个字,可调整速度)

Mode 适合 PTA/教务平台/某些判定机器人行为的网站使用。


🛠️ 为什么用 Python?

有人问:

为什么不用 C# / C++ / AutoHotKey?

答:我试了,很多输入法(尤其是百度输入法、搜狗等)在程序模拟输入时会“顶替焦点”,导致输出混乱。

但 Python 的 keyboard 模块几乎不受影响 👌
各种输入法、系统版本都能稳定工作。

GUI 我用的是 Tkinter(因为轻量、内置),界面功能够用。


💻 软件界面预览

软件界面非常简洁操作:

  • 剪贴板读取

  • 文本预览

  • 开始 / 停止

  • 人工输入速度调整

担心误触,看你自己了


📦 安装依赖

在项目虚拟环境或 PowerShell 中运行(推荐在已激活的 .venv):

pip install pyperclip keyboard

如果 keyboard 安装或运行报权限问题,在管理员权限的 PowerShell/命令提示符下运行 Python 脚本 或 使用 pyautogui 替代(我也可以给出 pyautogui 版本)。


🐍 完整源码(可直接运行)

已经完全整理并优化,非常适合作业/学习展示/二次开发:

import threading
import time
import tkinter as tk
from tkinter import messagebox, scrolledtext
import pyperclip

try:
import keyboard
except Exception:
keyboard = None

class ClipboardTyperApp:
def __init__(self, root):
self.root = root
self.root.title("Clipboard → Keyboard 模拟输入")
self.root.geometry("600×420")
self.root.resizable(False, False)

# 状态变量
self._typing_thread = None
self._stop_flag = threading.Event()

# ——————– 上方操作栏 ——————–
frame_top = tk.Frame(root)
frame_top.pack(padx=12, pady=8, fill="x")

tk.Button(frame_top, text="从剪贴板粘贴", command=self.paste_from_clipboard, width=18).grid(row=0, column=0, padx=4, pady=2)
tk.Button(frame_top, text="清空预览", command=self.clear_preview, width=12).grid(row=0, column=1, padx=4, pady=2)
tk.Button(frame_top, text="开始输入", command=self.start_typing, bg="#4caf50", fg="white", width=12).grid(row=0, column=2, padx=4, pady=2)
tk.Button(frame_top, text="停止输入", command=self.stop_typing, bg="#f44336", fg="white", width=12).grid(row=0, column=3, padx=4, pady=2)

tk.Label(frame_top, text="每字符延时(ms):").grid(row=1, column=0, padx=(0,2), pady=2, sticky="e")
self.entry_delay = tk.Entry(frame_top, width=6); self.entry_delay.insert(0,"50"); self.entry_delay.grid(row=1,column=1, padx=2, pady=2, sticky="w")

tk.Label(frame_top, text="开始延时(s):").grid(row=1, column=2, padx=(0,2), pady=2, sticky="e")
self.entry_start_delay = tk.Entry(frame_top, width=6); self.entry_start_delay.insert(0,"3"); self.entry_start_delay.grid(row=1,column=3, padx=2, pady=2, sticky="w")

# ——————– 说明文字 ——————–
help_text = ("说明:\\n1) 点击“从剪贴板粘贴”载入内容。\\n"
"2) 切换到目标窗口并聚焦。\\n"
"3) 点击“开始输入”,可按 Stop 中止。")
tk.Label(root, text=help_text, justify="left", anchor="w").pack(padx=12, pady=(0,4), fill="x")

# ——————– 文本预览区 ——————–
self.text_area = scrolledtext.ScrolledText(root, wrap="word", width=72, height=13, font=("微软雅黑",11))
self.text_area.pack(padx=12, pady=(0,8))

# ——————– 复制预览按钮 ——————–
frame_bottom = tk.Frame(root)
frame_bottom.pack(padx=12, pady=(2,6), fill="x")

self.btn_preview_copy = tk.Button(frame_bottom, text="复制预览到剪贴板",
command=self.copy_preview_to_clipboard, width=44)
self.btn_preview_copy.pack(side="left", padx=6, pady=2)

# ——————– 状态栏 ——————–
self.status_var = tk.StringVar(value="就绪")
tk.Label(root, textvariable=self.status_var, relief="sunken", anchor="w").pack(side="bottom", fill="x")

if keyboard is None:
messagebox.showwarning("依赖缺失", "未检测到 keyboard 模块,请安装:pip install keyboard")

# ——————– 功能 ——————–
def paste_from_clipboard(self):
try: txt = pyperclip.paste()
except Exception as e: messagebox.showerror("剪贴板错误", str(e)); return
self.text_area.delete("1.0", tk.END); self.text_area.insert(tk.END, txt); self.status_var.set("已粘贴内容")

def clear_preview(self): self.text_area.delete("1.0", tk.END); self.status_var.set("已清空预览")

def copy_preview_to_clipboard(self):
pyperclip.copy(self.text_area.get("1.0", tk.END)); self.status_var.set("已复制到剪贴板")

# ——————– 输入逻辑 ——————–
def start_typing(self):
if keyboard is None: messagebox.showerror("缺少依赖","keyboard模块不可用"); return
text = self.text_area.get("1.0", tk.END).rstrip("\\n")
if not text: messagebox.showinfo("无内容","预览区为空"); return
try: delay_ms = float(self.entry_delay.get()); start_delay = float(self.entry_start_delay.get())
except ValueError: messagebox.showerror("输入错误","延时必须为数字"); return
self._stop_flag.clear()
self.status_var.set(f"将在 {start_delay} 秒后开始输入,请切换到目标窗口")
self._typing_thread = threading.Thread(target=self._typing_worker,args=(text, delay_ms/1000.0, start_delay), daemon=True)
self._typing_thread.start()

def stop_typing(self):
if self._typing_thread and self._typing_thread.is_alive(): self._stop_flag.set(); self.status_var.set("停止信号已发送")

def _typing_worker(self, text, per_char_delay, start_delay):
try:
remaining = start_delay
while remaining>0 and not self._stop_flag.is_set():
self._safe_set_status(f"准备输入,{remaining:.1f}s后开始"); time.sleep(0.2); remaining-=0.2
if self._stop_flag.is_set(): self._safe_set_status("已取消输入"); return
self._safe_set_status("正在输入中…(可按 停止输入 停止)")
for ch in text:
if self._stop_flag.is_set(): self._safe_set_status("输入已停止"); break
try: keyboard.write(ch)
except:
try: keyboard.send(ch)
except: pyperclip.copy(ch); keyboard.press_and_release('ctrl+v')
time.sleep(per_char_delay)
else: self._safe_set_status("输入完成")
finally: self._stop_flag.clear()

def _safe_set_status(self, text): self.root.after(0, lambda: self.status_var.set(text))

# ——————– 主程序 ——————–
if __name__ == "__main__":
root = tk.Tk()
app = ClipboardTyperApp(root)
root.mainloop()


🧪 使用方法(3 步完成)

  • 将要输入的长文本复制到剪贴板

  • 打开本工具 → 点击 从剪贴板粘贴

  • 切换到目标网站输入框 → 点击 开始输入

  • 你会看到倒计时提示,结束后自动开始输入。

    输入过程可以随时 停止输入。


    ⚡ 实测效果(包括 PTA)

    • PTA:✔ 可用

    Mode(人工输入)100% 通过。


    🔒 安全性说明

    • 不会获取你浏览器信息

    • 不需要安装驱动

    • 不注入系统

    • 不收集内容

    • 纯本地运行

    代码全部开源,可放心使用。

    赞(0)
    未经允许不得转载:171主机测评 » 【工具分享】PTA / 不能粘贴网站救星:模拟人工键盘输入的小工具(Python 版)可以直接在PyCharm使用
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址