Примеры запросов и ответов
# ── Запрос: изображение + шаблон ──
curl -X POST http://localhost:8888/api/v1/match/template \
-F "image=@screenshot.png" \
-F "template=@icon.png"
# ── Ответ (201): задача создана ──
# {
# "uid": "d83ae21c-94bc-4a11-b3f7-1a2b3c4d5e6f",
# "status": "queued",
# "tool": "template",
# "params": {"method":"TM_CCOEFF_NORMED","threshold":0.8,"max_results":20,"use_grayscale":true},
# "created_at": "2026-03-25T12:00:00",
# "input_files": ["uploads/d83ae.../screenshot.png","uploads/d83ae.../icon.png"],
# "thumbnails": ["thumbnails/d83ae.../screenshot.png","thumbnails/d83ae.../icon.png"],
# "result_files": [],
# "result_data": {}
# }
# ── Запрос: получить результат задачи ──
curl http://localhost:8888/api/v1/tasks/d83ae21c-94bc-4a11-b3f7-1a2b3c4d5e6f
# ── Ответ (200): задача завершена ──
# {
# "uid": "d83ae21c-94bc-4a11-b3f7-1a2b3c4d5e6f",
# "status": "done",
# "tool": "template",
# "result_files": ["results/d83ae.../matches.png","results/d83ae.../heatmap.png"],
# "result_data": {
# "method": "TM_CCOEFF_NORMED",
# "matches_found": 3,
# "best_score": 0.97,
# "matches": [
# {"x": 120, "y": 45, "w": 32, "h": 32, "score": 0.97},
# {"x": 340, "y": 180, "w": 32, "h": 32, "score": 0.92},
# {"x": 560, "y": 310, "w": 32, "h": 32, "score": 0.85}
# ]
# }
# }
# ── Запрос: обновить настройки ──
curl -X PUT http://localhost:8888/api/v1/settings/template \
-H "Content-Type: application/json" \
-d '{"method":"TM_CCOEFF_NORMED","threshold":0.9,"max_results":10,"use_grayscale":true}'
# ── Ответ (200) ──
# {
# "tool": "template",
# "params": {"method":"TM_CCOEFF_NORMED","threshold":0.9,"max_results":10,"use_grayscale":true}
# }
// ── Запрос: отправка изображений ──
const form = new FormData();
form.append("image", imageInput.files[0]);
form.append("template", templateInput.files[0]);
form.append("method", "TM_CCOEFF_NORMED");
form.append("threshold", "0.8");
const res = await fetch("/api/v1/match/template", {
method: "POST",
body: form,
});
const task = await res.json();
// ── Ответ task: ──
// {
// uid: "d83ae21c-...",
// status: "queued",
// tool: "template",
// params: {method:"TM_CCOEFF_NORMED", threshold:0.8, max_results:20, use_grayscale:true},
// input_files: ["uploads/d83ae.../screenshot.png", "uploads/d83ae.../icon.png"],
// result_files: [], result_data: {}
// }
// ── Запрос: получить результат ──
const status = await fetch(`/api/v1/tasks/${task.uid}`);
const result = await status.json();
// ── Ответ result (когда done): ──
// {
// uid: "d83ae21c-...",
// status: "done",
// result_files: ["results/d83ae.../matches.png", "results/d83ae.../heatmap.png"],
// result_data: {
// method: "TM_CCOEFF_NORMED", matches_found: 3, best_score: 0.97,
// matches: [{x:120,y:45,w:32,h:32,score:0.97}, ...]
// }
// }
import requests
# ── Запрос: отправка изображений ──
files = {
"image": open("screenshot.png", "rb"),
"template": open("icon.png", "rb"),
}
data = {
"method": "TM_CCOEFF_NORMED",
"threshold": "0.8",
"max_results": "20",
}
resp = requests.post(
"http://localhost:8888/api/v1/match/template",
files=files, data=data,
)
task = resp.json()
# ── Ответ task: ──
# {
# "uid": "d83ae21c-...",
# "status": "queued",
# "tool": "template",
# "params": {"method":"TM_CCOEFF_NORMED","threshold":0.8,"max_results":20,"use_grayscale":true},
# "input_files": ["uploads/d83ae.../screenshot.png","uploads/d83ae.../icon.png"],
# "result_files": [], "result_data": {}
# }
# ── Запрос: получить результат ──
result = requests.get(
f"http://localhost:8888/api/v1/tasks/{task['uid']}"
).json()
# ── Ответ result (когда done): ──
# {
# "uid": "d83ae21c-...",
# "status": "done",
# "result_files": ["results/d83ae.../matches.png", "results/d83ae.../heatmap.png"],
# "result_data": {
# "method": "TM_CCOEFF_NORMED", "matches_found": 3, "best_score": 0.97,
# "matches": [
# {"x":120,"y":45,"w":32,"h":32,"score":0.97},
# {"x":340,"y":180,"w":32,"h":32,"score":0.92},
# {"x":560,"y":310,"w":32,"h":32,"score":0.85}
# ]
# }
# }