본문 바로가기
개발 일지/PDF 파일 번역 프로그램

PDF 파일 번역 프로그램 - Cloud Translation API

by tls1107 2024. 4. 18.
728x90
반응형

Cloud Translation API 개발 시작!

기존에 테스트 했을 때는 터미널에서 cURL 이나 Powershell 을 통해서 요청을 보냈는데

자바스크립트에서 같은 내용으로 요청을 보내면 Oath2 인증오류가 발생했다.

api keyoath2 사용자 계정을 만들어서 같이 요청을 보내도

자바스크립트 딴에서 요청을 처리하는게 보안상 문제가 있는지 계속 거절당했다.

 

그래서 하루종일 고민했다 어떻게 이 인증 문제를 해결할 수 있을까..?

 

고민 끝에 방법을 바꿔서 요청 보내는 작업을 처리하는 서버를 만들자! 라는 결정을 내렸다.

예전에 Flask 를 써본 경험이 있어, Flask 로 만들기로 했고

요청을 보내는 것은 Powershell 로 보내는 것을 응용하기로 했다.

바로 파워쉘 스크립트를 활용하는 것이다. 로컬에 저장된 인증키를 사용할 수 있으니 Oath2 인증 문제는 해결된다.

 

아래의 파워쉘 스크립트가 바로 결과물이다.

param(
    [string]$newInputUri  # 사용자로부터 받은 입력 URI
)

# JSON 데이터 정의
$jsonData = '{
    "source_language_code": "출발 언어 코드",
    "target_language_code": "도착 언어 코드",
    "document_input_config": {
        "gcsSource": {
            "inputUri": ""
        }
    },
    "document_output_config": {
        "gcsDestination": {
            "outputUriPrefix": "gs://버킷명/"
        }
    },
    "isTranslateNativePdfOnly": false
}'

# JSON 데이터를 파싱하여 객체로 변환
$jsonObject = ConvertFrom-Json $jsonData

# 입력 URI를 JSON 데이터에 적용
$jsonObject.document_input_config.gcsSource.inputUri = $newInputUri

# gcloud 명령을 사용하여 액세스 토큰 가져오기
$cred = gcloud auth print-access-token

# 요청 헤더 설정
$headers = @{
    "Authorization" = "Bearer $cred"
    "x-goog-user-project" = "프로젝트 ID"
}

# 요청 보내기
try {
    $response = Invoke-WebRequest `
        -Method POST `
        -Headers $headers `
        -ContentType "application/json; charset=utf-8" `
        -Body ($jsonObject | ConvertTo-Json -Depth 10) `
        -Uri "https://translation.googleapis.com/v3/projects/프로젝트 ID/locations/us-central1:translateDocument"

    # 성공적인 응답인 경우
    if ($response.StatusCode -eq 200) {
        Write-Output "success\n"
    } else {
        Write-Output "오류 발생: $response.StatusCode\n"
    }
} catch {
    # 오류 발생 시 오류 메시지 출력
    Write-Output "error : $_"
}

 

그리고 위와 같은 파워쉘 스크립트를 호출하는 코드를 Flask 상에서 구현해야 한다.

아래의 코드가 Flask 코드이다.

from flask import Flask, request, jsonify
import subprocess
from flask_cors import CORS

app = Flask(__name__)
CORS(app)

@app.route('/update_input_uri', methods=['POST'])
def update_input_uri():
    try:
        # 요청에서 수정될 값을 받기
        new_input_uri = request.json.get('new_input_uri')

        # 수정될 값이 없는 경우 에러 반환
        if not new_input_uri:
            return jsonify({'error': '수정될 값이 요청에 없습니다.'}), 400


        # 파워쉘 스크립트 실행
        subprocess.run(['powershell', './파워쉘스크립트명.ps1', new_input_uri], check=True)
        
        return jsonify({'message': new_input_uri + '번역이 성공적으로 완료되었습니다.'})

    except subprocess.CalledProcessError as e:
        return jsonify({'error': f'파워쉘 스크립트 실행 중 오류가 발생했습니다: {e.stderr}'}), 500

if __name__ == '__main__':
    app.run(debug=True)

 

번역 요청을 처리하는 서버를 만들어 연결하니 확실히 Oath2 문제가 해결되었다.

나중을 생각하면 PDF 파일 분할이나 합치는 작업도 서버에서 처리하는 것이 낫지 않을까 고민중이다.

728x90
반응형

댓글