如何在Tkinter中使用Copyleaks API开发抄袭检测工具?
Tkinter项目接入Copyleaks API实现抄袭检测方案
前置准备
- 注册Copyleaks账号,获取专属的
API_KEY和绑定的注册邮箱作为接口调用凭证,个人开发可使用免费测试额度完成功能验证 - 安装官方SDK:执行命令
pip install copyleaks完成依赖安装,Tkinter默认随Python自带无需额外安装
核心接入注意事项
所有网络请求逻辑必须放在子线程中执行,不能直接在Tkinter主线程调用API,否则会导致界面无响应,最终结果更新需要通过Tkinter的after()方法回调到主线程操作
分步实现流程
1. 身份验证
首次调用API前需要先完成身份校验,获取有效期24小时的访问令牌,无需每次请求重复验证,示例代码如下:
from copyleaks import Copyleaks copyleaks = Copyleaks() # 登录获取访问令牌 login_response = copyleaks.login(COPYLEAKS_EMAIL, COPYLEAKS_API_KEY) access_token = login_response['access_token']
2. 提交检测任务
从Tkinter组件中获取待检测的文本/文件路径后,构造检测任务提交到Copyleaks服务,提交成功后会返回唯一的扫描ID,用于后续查询结果:
def submit_detect_task(content: str, scan_id: str): # 构造待检测文本对象 document = FileSubmission() document.set_base64(content.encode('utf-8').hex()) # 文本转成十六进制格式提交 document.set_filename("detect_content.txt") # 配置检测属性 properties = Properties() properties.set_sandbox(True) # 测试阶段开启沙箱模式,不消耗正式额度 document.set_properties(properties) # 提交检测 copyleaks.submit().using_submit_id(access_token, scan_id, document)
3. 查询并展示检测结果
提交任务后间隔2-3秒轮询检测状态,检测完成后解析结果,更新到Tkinter界面组件中:
def get_detect_result(scan_id: str, result_widget): while True: # 查询检测状态 status = copyleaks.scans().get(access_token, scan_id) if status['status'] == 'completed': # 解析核心结果:总重复率、匹配来源列表 total_plagiarism_rate = status['results']['score']['aggregatedText'] match_list = status['results']['matches'] # 回调到主线程更新UI result_widget.after(0, lambda: result_widget.insert(tk.END, f"总重复率:{total_plagiarism_rate}%\n匹配来源:\n")) for match in match_list: result_widget.after(0, lambda: result_widget.insert(tk.END, f"- {match['url']} 匹配占比:{match['score']}%\n")) break time.sleep(2)
完整最小Demo示例
import tkinter as tk from tkinter import scrolledtext, messagebox import threading import time from copyleaks import Copyleaks from copyleaks.models.submit.document import FileSubmission from copyleaks.models.submit.properties import Properties # 替换为你自己的凭证 COPYLEAKS_EMAIL = "你的注册邮箱" COPYLEAKS_API_KEY = "你的API密钥" copyleaks = Copyleaks() def run_detect(): content = input_text.get("1.0", tk.END).strip() if not content: messagebox.showwarning("提示", "请输入待检测内容") return submit_btn.config(state=tk.DISABLED) result_text.delete("1.0", tk.END) result_text.insert(tk.END, "检测中,请稍候...\n") def detect_thread(): try: # 1. 登录 login_res = copyleaks.login(COPYLEAKS_EMAIL, COPYLEAKS_API_KEY) access_token = login_res['access_token'] scan_id = str(int(time.time())) # 用时间戳生成唯一扫描ID # 2. 提交任务 document = FileSubmission() document.set_base64(content.encode('utf-8').hex()) document.set_filename("detect.txt") prop = Properties() prop.set_sandbox(True) document.set_properties(prop) copyleaks.submit().using_submit_id(access_token, scan_id, document) # 3. 轮询结果 while True: status = copyleaks.scans().get(access_token, scan_id) if status['status'] == 'completed': rate = status['results']['score']['aggregatedText'] matches = status['results']['matches'] result_text.after(0, lambda: result_text.delete("1.0", tk.END)) result_text.after(0, lambda: result_text.insert(tk.END, f"检测完成!总重复率:{rate}%\n\n匹配来源:\n")) for idx, m in enumerate(matches, 1): result_text.after(0, lambda i=idx, sc=m['score'], url=m['url']: result_text.insert(tk.END, f"{i}. 匹配占比{sc}%,来源:{url}\n")) break time.sleep(3) except Exception as e: result_text.after(0, lambda: messagebox.showerror("错误", f"检测失败:{str(e)}")) finally: submit_btn.after(0, lambda: submit_btn.config(state=tk.NORMAL)) threading.Thread(target=detect_thread, daemon=True).start() # 构建Tkinter界面 root = tk.Tk() root.title("抄袭检测工具") root.geometry("700x500") tk.Label(root, text="请输入待检测文本:").pack(anchor='w', padx=10, pady=5) input_text = scrolledtext.ScrolledText(root, height=15) input_text.pack(fill=tk.X, padx=10, pady=5) submit_btn = tk.Button(root, text="开始检测", command=run_detect) submit_btn.pack(pady=5) tk.Label(root, text="检测结果:").pack(anchor='w', padx=10, pady=5) result_text = scrolledtext.ScrolledText(root, height=12) result_text.pack(fill=tk.BOTH, expand=True, padx=10, pady=5) root.mainloop()
常见优化点
- 可以增加文件选择功能,支持Word、PDF等常见文档格式上传检测,读取文件内容后调用相同的提交逻辑即可
- 结果展示可以增加高亮功能,将重复的内容在输入框中标注出来,提升使用体验
- 可以缓存24小时内的访问令牌,避免每次检测都重新调用登录接口
内容的提问来源于stack exchange,提问作者Lokesh Raj
相关产品推荐
相关产品推荐

