""" Tencent Cloud TIIA simplified APIs. Currently provides: - SearchImage (by ImageUrl) with fixed groupId/region from settings. """ from rest_framework import status from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView from django.conf import settings from api_v1.utils.tencentcloud_tiia import SimpleRateLimiter, search_image_url_in_tencent_tiia class TiiaSearchImageView(APIView): """ Tencent Cloud TIIA: SearchImage (simplified) POST /api/v1/tiia/search-image/ Body: { "imageUrl": "https://example.com/xxx.png" } Notes: - groupId/region/endpoint are configured via Django settings (TENCENTCLOUD_TIIA_*). - Enforces QPS using settings.TENCENTCLOUD_TIIA_QPS (default 10). """ permission_classes = [IsAuthenticated] def post(self, request): # Keep API params consistent with existing style for this endpoint: # - imageUrl # - imageBase64 image_url = request.data.get('imageUrl') image_base64 = request.data.get('imageBase64') limit = request.data.get('limit', None) offset = request.data.get('offset', None) match_threshold = request.data.get('matchThreshold', None) try: if limit is not None and str(limit).strip() != '': limit = int(limit) # TencentCloud SearchImage: default 10, max 100 if limit <= 0 or limit > 100: raise ValueError('limit 必须在 1~100 之间') else: limit = None if offset is not None and str(offset).strip() != '': offset = int(offset) if offset < 0: raise ValueError('offset 必须 >= 0') else: offset = None if match_threshold is not None and str(match_threshold).strip() != '': match_threshold = int(match_threshold) if match_threshold < 0 or match_threshold > 100: raise ValueError('matchThreshold 必须在 0~100 之间') else: match_threshold = None limiter = SimpleRateLimiter(qps=float(getattr(settings, 'TENCENTCLOUD_TIIA_QPS', 10))) resp = search_image_url_in_tencent_tiia( image_url=str(image_url or '') if image_url is not None else None, image_base64=str(image_base64 or '') if image_base64 is not None else None, limit=limit, offset=offset, match_threshold=match_threshold, rate_limiter=limiter, ) return Response(resp, status=status.HTTP_200_OK) except ValueError as e: return Response({'error': str(e)}, status=status.HTTP_400_BAD_REQUEST) except Exception as e: return Response( {'error': '腾讯云搜图失败', 'message': str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR, )