53 lines
1.9 KiB
Python
53 lines
1.9 KiB
Python
"""调用示例:上传本地图片,拿回结构化 JSON。
|
||
|
||
三种鉴权方式按需选一种(与服务端 .env 对应):
|
||
1. 静态 token(推荐):TOKEN = "你的 token",走 Authorization: Bearer
|
||
2. 短期 token:填 CLIENT_SECRET,脚本自动换 token(适合前端后端代理场景)
|
||
3. 不配置:TOKEN 和 CLIENT_SECRET 都留空,服务端也必须未配鉴权
|
||
"""
|
||
import json
|
||
import sys
|
||
|
||
import requests
|
||
|
||
BASE = "http://10.1.1.163:8000" # 换成你的服务地址
|
||
TOKEN = "" # 静态 token(API_TOKENS 里那把)
|
||
CLIENT_ID = "default"
|
||
CLIENT_SECRET = "" # 填了就走短期 token 流程
|
||
|
||
|
||
def get_token() -> str:
|
||
"""用 client_secret 换一个短期 token。"""
|
||
r = requests.post(
|
||
f"{BASE}/api/v1/auth/token",
|
||
json={"client_id": CLIENT_ID, "client_secret": CLIENT_SECRET},
|
||
timeout=10,
|
||
)
|
||
r.raise_for_status()
|
||
data = r.json()
|
||
print(f"[token] 有效期 {data['expires_in']}s", file=sys.stderr)
|
||
return data["token"]
|
||
|
||
|
||
def recognize(path: str, side: str = "auto", mask: bool = False) -> dict:
|
||
token = TOKEN or (get_token() if CLIENT_SECRET else "")
|
||
headers = {"Authorization": f"Bearer {token}"} if token else {}
|
||
|
||
with open(path, "rb") as f:
|
||
r = requests.post(
|
||
f"{BASE}/api/v1/idcard/recognize",
|
||
files={"file": (path, f, "image/jpeg")},
|
||
data={"side": side, "mask": str(mask).lower()},
|
||
headers=headers,
|
||
timeout=120, # 低端 NAS 第一次要加载模型,给足时间
|
||
)
|
||
if r.status_code == 401:
|
||
raise SystemExit("鉴权失败:token 无效或已过期(检查 .env 里的 API_TOKENS / CLIENT_SECRET)")
|
||
r.raise_for_status()
|
||
return r.json()
|
||
|
||
|
||
if __name__ == "__main__":
|
||
path = sys.argv[1] if len(sys.argv) > 1 else "idcard.jpg"
|
||
print(json.dumps(recognize(path), ensure_ascii=False, indent=2))
|