You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 03:36:04