S3에 영수증 사진을 저장하고 사진 링크로 OCR API를 호출하려고 했는데 에러가 떴다.
공식 문서를 찾아봤지만 정보가 없었고, 다시 NAVER CLOUD PLATFORM 고객센터에 전화해 답변을 받았다.
“OCR API는 보안 문제로 외부 URL 링크로 OCR API를 호출하는 것이 불가능하고, 컴퓨터에 저장된 사진만 가능합니다.”
즉, 내 컴퓨터에 저장된 영수증 사진의 경로만 가능하다.
해결을 위해 아래의 과정으로 API 호출 함수를 수정했다.
@api_view(['POST'])
def ocr_receipt(request):
api_url = OCR_API_URL
secret_key = OCR_SECRET_KEY
file_name = save_image(request.FILES['files'])
image_file = fs.url(file_name)
request_json = {
'images': [
{
'format': 'jpg',
'name': 'demo'
}
],
'requestId': str(uuid.uuid4()),
'version': 'V2',
'timestamp': int(round(time.time() * 1000))
}
payload = {'message': json.dumps(request_json).encode('UTF-8')}
files = [
('file', open(image_file, 'rb'))
]
fs.delete(file_name) //API를 호출하고 나면 사진을 삭제
headers = {
'X-OCR-SECRET': secret_key
}
response = requests.request("POST", api_url, headers=headers, data=payload, files=files)
response_body = json.loads(response.text)
images = response_body['images']
images_receipt = images[0].get("receipt")
receipt_memo = images_receipt['result']['storeInfo']['name']['text']
receipt_date = images_receipt['result']['paymentInfo']['date']['text']
receipt_price = int(
float(re.sub(r"[^\uAC00-\uD7A30-9a-zA-Z\s]", "", images_receipt['result']['totalPrice']['price']['text'])))
return JsonResponse({"memo": receipt_memo
, "date": receipt_date
, "cost": receipt_price},
safe=False, status=status.HTTP_200_OK)
def save_image(files): //사진 저장 함수
img_file = files
filename = fs.save(img_file.name, img_file)
return filename