#!/usr/bin/env bash # Face++ skinanalyze_pro 三视图调用(正脸 + 左右侧脸 → 下颌线) # 用法: call_skinanalyze_3view.sh <正脸图> <左侧脸图> <右侧脸图> [输出json] set -euo pipefail set -a; source "${CREDENTIALS_ENV:-$HOME/.openclaw/credentials.env}"; set +a FRONT=${1:?用法: call_skinanalyze_3view.sh <正脸图> <左侧脸图> <右侧脸图> [输出json]} LEFT=${2:?缺左侧脸图} RIGHT=${3:?缺右侧脸图} OUT=${4:-/tmp/skinanalyze_3view_result.json} retry() { local n=0 until [ "$n" -ge 3 ]; do RESP=$(curl -s "${FACEPP_SKINANALYZE_URL:-https://api-cn.faceplusplus.com/facepp/v1/skinanalyze_pro}" \ -F api_key=$FACEPP_API_KEY -F api_secret=$FACEPP_API_SECRET \ -F image_file=@"$FRONT" \ -F left_side_image_file=@"$LEFT" \ -F right_side_image_file=@"$RIGHT" \ -F "return_side_results=jawline_info" \ -F "return_maps=water_area,red_area,brown_area,texture_enhanced_pores,texture_enhanced_blackheads,texture_enhanced_oily_area,texture_enhanced_lines,rough_area,roi_outline_map,texture_enhanced_bw" \ -F "return_marks=wrinkle_mark,melanin_mark,dark_circle_outline") if ! echo "$RESP" | grep -q 'error_message'; then echo "$RESP" > "$OUT" return 0 fi n=$((n+1)) echo "第${n}次失败: $(echo "$RESP" | head -c 120),${n}0秒后重试..." >&2 sleep $((n*10)) done echo "$RESP" > "$OUT" return 1 } retry || { echo "三次重试均失败" >&2; exit 1; } python3 - "$OUT" <<'PY' import json, sys d = json.load(open(sys.argv[1])) assert 'error_message' not in d, d.get('error_message') r = d['result']; si = r['score_info'] ls = d.get('left_side_result', {}).get('left_jawline_info', {}) rs = d.get('right_side_result', {}).get('right_jawline_info', {}) print('OK skin_age:', r['skin_age']['value'], '| total:', si['total_score'], '| 左下颌线:', ls.get('left_jawline_angle'), '°(q%s)' % ls.get('left_jawline_quality'), '| 右下颌线:', rs.get('right_jawline_angle'), '°(q%s)' % rs.get('right_jawline_quality'), '| 标准区间 116-120°') print('完整结果已存', sys.argv[1]) PY