国产AI DeepSeek受到全世界的广泛关注,甚至被认为是大模型行业的最大“黑马”。在这个AI时代,我们能做的就是主动拥抱AI。之前也尝试用其他的AI去写一些程序,哪怕比较简单的程序可能也需要调整很多次才能写出完整可运行的代码,如果涉及客户端GUI的开发,对于AI来说难度会更大。
最近在做验证码相关的项目,验证码是业务风控的关键一环,在注册、登录、下单、领券、兑换积分、营销等业务环节,需要验证码技术防范自动化脚本、爬虫等恶意行为。目前在对企业各产品使用的验证码进行安全强度评估,所以就想着让DeepSeek帮我写一个识别图形验证码的工具,结果真的大开眼界,一句话可输出直接运行的工具,同时也说明传统的图形验证码在AI面前已无安全可言!
我输入的prompt:
你是一名优秀的python程序员。请你用python语言帮我写一个图形验证码的识别工具,工具要求包括: 1、用户输入图形验证码的URL,URL返回的是一个图片; 2、kimi的API接口,把图片传给kimi,让kimi识别图片中的字母和数字;调用kimi api接口的api_key在代码中可以让我手工配置; 3、输出结果要包含两个部分,一是原始的图片,二是以字符串的格式展示识别后的字母和数字; 4、工具要有GUI界面,界面要有科技感; 5、工具适用于windows操作系统。 |
DeepSeek的思考过程:
import tkinter as tk
from tkinter import ttk, messagebox
import requests
import base64
import os
from io import BytesIO
from PIL import Image, ImageTk
classCaptchaRecognizer(tk.Tk):
def __init__(self):
super().__init__()
self.title("图形验证码识别工具-20250205")
self.geometry("800x600")
self.api_key = self.load_api_key()
self.configure_ui()
self.create_widgets()
self.setup_style()
def configure_ui(self):
self.grid_columnconfigure(0, weight=1)
self.grid_rowconfigure(2, weight=1)
def setup_style(self):
self.style = ttk.Style()
self.style.theme_create("cyber", settings={
"TFrame": {"configure": {"background": "#1a1a1a"}},
"TLabel": {"configure": {"foreground": "#00ff99", "background": "#1a1a1a",
"font": ("Consolas", 10)}},
"TButton": {"configure": {"background": "#0066cc", "foreground": "white",
"font": ("Segoe UI", 10), "borderwidth": 1},
"map": {"background": [("active", "#0099ff")]}},
"TEntry": {"configure": {"fieldbackground": "#2d2d2d", "foreground": "white"}}
})
self.style.theme_use("cyber")
def load_api_key(self):
if os.path.exists("ocr_api.key"):
with open("ocr_api.key", "r") as f:
return f.read().strip()
return""
def save_api_key(self, key):
with open("ocr_api.key", "w") as f:
f.write(key)
def create_widgets(self):
# 头部控制栏
control_frame = ttk.Frame(self)
control_frame.grid(row=0, column=0, padx=10, pady=10, sticky="ew")
ttk.Label(control_frame, text="API密钥:").pack(side=tk.LEFT, padx=5)
self.api_entry = ttk.Entry(control_frame, width=40)
self.api_entry.insert(0, self.api_key)
self.api_entry.pack(side=tk.LEFT, padx=5)
ttk.Button(control_frame, text="保存密钥",
command=lambda: self.save_api_key(self.api_entry.get())).pack(side=tk.LEFT, padx=5)
# URL输入区域
url_frame = ttk.Frame(self)
url_frame.grid(row=1, column=0, padx=10, pady=5, sticky="ew")
ttk.Label(url_frame, text="验证码URL:").pack(side=tk.LEFT)
self.url_entry = ttk.Entry(url_frame, width=50)
self.url_entry.pack(side=tk.LEFT, padx=5, fill=tk.X, expand=True)
ttk.Button(url_frame, text="识别验证码", command=self.start_recognition).pack(side=tk.LEFT)
# 图片显示区域
self.img_frame = ttk.Frame(self)
self.img_frame.grid(row=2, column=0, padx=10, pady=10, sticky="nsew")
self.image_label = ttk.Label(self.img_frame)
self.image_label.pack()
# 结果展示区域
result_frame = ttk.Frame(self)
result_frame.grid(row=3, column=0, padx=10, pady=10, sticky="ew")
ttk.Label(result_frame, text="识别结果:").pack(side=tk.LEFT)
self.result_text = tk.Text(result_frame, height=3, bg="#2d2d2d", fg="#00ff99",
font=("Consolas", 12), wrap=tk.WORD)
self.result_text.pack(fill=tk.X, expand=True)
# 状态栏
self.status_bar = ttk.Label(self, text="就绪", relief=tk.SUNKEN)
self.status_bar.grid(row=4, column=0, sticky="ew")
def start_recognition(self):
url = self.url_entry.get().strip()
api_key = self.api_entry.get().strip()
if not url:
messagebox.showwarning("输入错误", "请输入验证码URL地址")
return
if not api_key:
messagebox.showwarning("配置错误", "请先配置API密钥")
return
self.status_bar.config(text="正在下载验证码...")
self.after(100, lambda: self.process_captcha(url, api_key))
def process_captcha(self, url, api_key):
try:
# 下载验证码图片
response = requests.get(url, timeout=10)
response.raise_for_status()
# 转换图片格式
img = Image.open(BytesIO(response.content))
img = img.convert("RGB")
img.thumbnail((300, 300))
# 显示图片
photo = ImageTk.PhotoImage(img)
self.image_label.config(image=photo)
self.image_label.image = photo
# 转换为Base64
buffered = BytesIO()
img.save(buffered, format="JPEG")
img_str = base64.b64encode(buffered.getvalue()).decode()
# 调用OCR API
self.status_bar.config(text="正在调用OCR API...")
result = self.call_ocr_api(api_key, img_str)
# 显示结果
self.result_text.delete(1.0, tk.END)
self.result_text.insert(tk.END, result)
self.status_bar.config(text="识别完成")
except Exception as e:
messagebox.showerror("错误", f"处理过程中发生错误:{str(e)}")
self.status_bar.config(text="就绪")
def call_ocr_api(self, api_key, image_base64):
request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic"
params = {"image": image_base64}
access_token = api_key
request_url = request_url + "?access_token=" + access_token
headers = {'content-type': 'application/x-www-form-urlencoded'}
response = requests.post(request_url, data=params, headers=headers)
return response.json()
if __name__ == "__main__":
app = CaptchaRecognizer()
app.mainloop()
原文始发于微信公众号(安全有术):一句话让DeepSeek帮我写了个识别图形验证码的工具
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论