Excel - VBA

Naver 파파고 API를 이용한 번역함수 만들기

EGTools 2023. 7. 11. 19:30

이 함수는 EGTools에 추가었습니다.

 

네이버의 파파고 API를 이용하여도 번역을 할 수 있는데, Google API와는 다르게 API를 사용할 수 있는 권한을 등록해야 합니다.

여기서는 API 권한신청과 관련한 내용은 다루지 않으므로 네이버 API 관련 도움말을 참고하세요.

신청이 완료되면 아래와 같이 Client ID와 Client Secret을 확인할 수 있습니다.

그리고, 무료 사용의 경우 일일 5,000자로 제한이 있으므로 할당량을 다 사용한 경우 사용이 제한됩니다.

 

파파고 API는 "POST" 방식으로 진행되고, request Header에 다음이 설정되어야 합니다.

  • Content-Type: application/x-www-form-urlencoded; charset=UTF-8
  • X-Naver-Client-Id: {애플리케이션 등록 시 발급받은 클라이언트 아이디 값}
  • X-Naver-Client-Secret: {애플리케이션 등록 시 발급받은 클라이언트 시크릿 값}

EGTools에서는 Client ID와 Client Secret을 Code에 등록해서 사용할 수 없으므로 InputBox로 입력을 받고,

매번 입력을 받을 수 없으므로 PC에 저장한 다음 사용할 때마다 꺼내 쓰는 방식으로 적용하였습니다.

 

getURL 함수에서 Header Key+Value쌍을 Chr(7)로 연결하여 처리하므로 여기서 연결해 줍니다.

    Header = Header & IIf(Header = "", "", Chr(7)) & "Content-Type" & Chr(7) & "application/x-www-form-urlencoded; charset=UTF-8"
    Header = Header & IIf(Header = "", "", Chr(7)) & "X-Naver-Client-Id" & Chr(7) & Client
    Header = Header & IIf(Header = "", "", Chr(7)) & "X-Naver-Client-Secret" & Chr(7) & Secret

 

"POST"로 오픈한 이후에 아래의 파라미터를 Body로 전달합니다.

  • soruce = "xx" : 원본 언어(source language)의 언어 코드
  • target = "xx" : 목적 언어(target language)의 언어 코드
  • text = "xxxx" : 번역할 텍스트. 1회 호출 시 최대 5,000자까지 번역할 수 있습니다.
    sText = EncodeURL(sText)
    sText = "source=" & sl & "&target=" & tl & "&text=" & sText

 

request에 따라서 API의 결과 오류인 경우는 아래와 같습니다.

  • {"errorMessage":"NID AUTH Result Invalid (1000) : Authentication failed. (인증에 실패했습니다.)","errorCode":"024"}
  • {"errorMessage":"NID AUTH Result Invalid (28) : Authentication failed. (인증에 실패했습니다.)","errorCode":"024"}
  • {"errorMessage":"{count/quota=10213/10000} : Query limit exceeded. (쿼리 한도를 초과했습니다.)","errorCode":"010"}

 

나머지는 GTranslate 함수에서 사용한는 것과 동일합니다.

 

최종적으로 구성한 함수는 아래와 같습니다.

Public Function NTranslate(Text As Variant, Optional sl As String = "en", Optional tl As String = "ko")
    Dim svcURL As String: svcURL = "https://openapi.naver.com/v1/papago/n2mt"
    Dim Cell As Variant, sText As String, rText As String, ll As String, iPos As Long
    Dim sXML As String
    Dim Client As String, Secret As String, Header As String
    
    ll = ll & ",ko,en,ja,zh-CN,zh-TW,vi,id,th,de,ru,es,it,fr,"
    If InStr(1, ll, "," & sl & ",", vbTextCompare) = 0 Then NTranslate = "ERROR:Source language Code invalid": Exit Function
    If InStr(1, ll, "," & tl & ",", vbTextCompare) = 0 Then NTranslate = "ERROR:Target language Code invalid": Exit Function
    
    If Not IsInternetConnected Then NTranslate = "ERROR:No Internet connection": Exit Function
    
    '// 언어코드 교정  '
    sl = LCase(sl): tl = LCase(tl)
    '// 한국어를 kr로 입력하는 오류 수정  '
    If sl = "kr" Then sl = "ko"
    If tl = "kr" Then tl = "ko"
    '// 중국어는 zh-CN과 zn-TW 처럼 대문자가 있음에 주의  '
    If sl = "zh" Then sl = "zh-CN"
    If tl = "zh" Then tl = "zh-CN"
    If sl = "zh-cn" Then sl = "zh-CN"
    If tl = "zh-cn" Then tl = "zh-CN"
    If sl = "zh-tw" Then sl = "zh-TW"
    If tl = "zh-tw" Then tl = "zh-TW"
    
    '// 상호 번역되는 쌍인지 확인  '
    ll = ",ko_en,ko_ja,ko_zh-CN,ko_zh-TW,ko_vi,ko_id,ko_th,ko_de,ko_ru,ko_es,ko_it,ko_fr,en_ja,en_fr,en_zh-CN,en_zh-TW,ja_zh-CN,ja_zh-TW,zh-CN_zh-TW"
    ll = ll & ",en_ko,ja_ko,zh-CN_ko,zh-TW_ko,vi_ko,id_ko,th_ko,de_ko,ru_ko,es_ko,it_ko,fr_ko,ja_en,fr_en,zh-CN_en,zh-TW_en,zh-CN_ja,zh-TW_ja,zh-TW_zh-CN,"
    If InStr(1, ll, "," & sl & "_" & tl & ",", vbTextCompare) = 0 Then NTranslate = "ERROR:Language match invalid": Exit Function
    
    Client = "esNE1q9ytPHsEIFIioPh"	'// 등록된 Client ID를 입력  '
    If Client = "" Then
        Client = Application.InputBox("Papago를 사용할 수 있는 Naver API Client를 복사해 붙여 넣으세요.", "Client")
        If Client = "" Or Client = "False" Then
            NTranslate = "ERROR:No Client or Invalid": Exit Function
        End If
    End If
    Secret = "tCGGW000mh"		'// 발급된 Client Secret를 입력  '
    If Secret = "" Then
        Secret = Application.InputBox("Papago를 사용할 수 있는 Naver API Secret를 복사해 붙여 넣으세요.", "Secret")
        If Secret = "" Or Secret = "False" Then
            NTranslate = "ERROR:No Secret or Invalid": Exit Function
        End If
    End If
    
    If TypeName(Text) = "Range" Or isArray(Text) Then
        For Each Cell In Text
            sText = sText & IIf(sText = "", "", vbNewLine) & Cell
        Next
    Else
        sText = CStr(Text)
    End If
    sText = Application.Trim(sText)
    If sText = "" Then NTranslate = "": Exit Function
    
    sText = EncodeURL(sText)
    sText = "source=" & sl & "&target=" & tl & "&text=" & sText
    Header = Header & IIf(Header = "", "", Chr(7)) & "Content-Type" & Chr(7) & "application/x-www-form-urlencoded; charset=UTF-8"
    Header = Header & IIf(Header = "", "", Chr(7)) & "X-Naver-Client-Id" & Chr(7) & Client
    Header = Header & IIf(Header = "", "", Chr(7)) & "X-Naver-Client-Secret" & Chr(7) & Secret
    
    sXML = getURL(svcURL, "POST", False, Header, sText)
    
    '// Error Code처리  '
    If InStr(1, sXML, "errorMessage", vbTextCompare) Then
        If InStr(1, sXML, "(1000)") Then
            NTranslate = "ERROR:Invalid Client ID"
        ElseIf InStr(1, sXML, "(28)") Then
            NTranslate = "ERROR:Invalid Client Secret"
        ElseIf InStr(1, sXML, "count/quota", vbTextCompare) Then
            NTranslate = "ERROR:Query limit exceeded"
        Else
            NTranslate = "ERROR:" & sXML
        End If
        Exit Function
    End If
    
    '//결과값 확인  '
    iPos = InStr(1, sXML, """translatedText"":", vbTextCompare)
    If iPos = 0 Then NTranslate = "ERROR:No result": Exit Function
    rText = Mid(sXML, iPos + 18)
    iPos = InStr(1, rText, ",""engineType""", vbTextCompare)
    If iPos = 0 Then NTranslate = "ERROR:html error": Exit Function
    rText = Left(rText, iPos - 2)
    
    NTranslate = DecodeHTML(rText)
    
End Function

 

네이버의 Papago 번역의 경우 일별 사용량 제한이 있고, 경우에 따라 사용된 셀의 수식이 재계산되어 불필요한 번역량을 사용하게 되므로 사용후에는 가급적 값으로 변경하여 이를 예방하는 것이 좋습니다.

 

Google 번역 앱을 이용한 번역은 사용량 제한이 없으므로 이것을 사용하는 것도 검토해 보세요.

https://egtools.tistory.com/entry/Google-Translation-Service

 

Google 번역 앱을 이용한 번역 함수 만들기

이 함수는 EGTools에 추가될 예정입니다. Google의 번역 서비스를 이용한 번역은 URL에 번역 옵션을 넣어서 요청합니다. 로그인이 필요하지 않은 서비스라서 사용이 간편합니다. 서비스 주소는 https:/

egtools.tistory.com