【API-VBA】Web APIを使って翻訳をする(DeepL API)

VBAスクレイピング

こんにちは、blueです。

今回はDeepL APIを用いた文書の翻訳について説明します。

この記事を読めば

  • DeepL APIで認証キーが取得できる
  • DeepL APIを使った翻訳処理ができる

ようになりますので、ぜひ読んでいってください。

ちなみにDeepL APIの使用については50万文字までは無料です(2022/7/16現在)。

それ以上は料金がかかりますが課金設定をしない限りは自動徴収されることもないので安心下さい。

(以下は筆者がWebAPIに関して最初に書いた記事です。まだWebAPIを使われたことがない方はこちらから読んでいただけると理解しやすくなると思います)

Web APIやJSONの記事は以下の書籍を参考にしています。

pythonですが会話形式で非常にわかりやすく書かれている書籍です。webAPIやスクレイピングを一から理解できる内容になっています。筆者はこれでWeb APIを勉強しました。

スポンサーリンク

今回の流れ

DeepL APIを使って翻訳された文書を取得する流れは以下になります。

  1. DeepL APIにアカウント登録する
  2. 認証キーを取得する
  3. DeepL APIの内容を理解する
  4. コードを記載する

APIを使用するには認証キーの取得とAPIドキュメントの理解が必要になります。

その為少し難しく感じるかもしれません。

しかし以降でできるかぎりわかりやすく説明しますので安心して読んでいってください。

アカウント登録

DeepL APIにアクセスするにはアカウント登録をする必要があります。

1 DeepLAPI翻訳 | 機械翻訳のテクノロジーにアクセスします。

2 「無料で登録する」をクリックする。

クリックすると拡大します

3 「無料で登録する」をクリックする。

クリックすると拡大します

4 DeepLアカウントの新規作成画面にて必要事項を入力する。「続行」をクリックする。

クリックすると拡大します

5 詳細画面にて各項目を入力する。「続行」をクリックする。

 なおクレジットカードについてはJCBはダメなようです(2022/7/13現在)。

クリックすると拡大します
クリックすると拡大します

6 (画面とれていませんが)内容に同意する。メール通知を受け取るかどうかの設定がある。

7 登録完了の画面になる。

これでアカウント登録は完了です。

認証キーの取得

DeepL APIにアクセスするには認証キーを取得する必要があります。

1 登録完了画面にて「認証キーを取得する アカウントを管理する」をクリックする。

クリックすると拡大する

2 ご利用中のDeepLアカウント画面にて「アカウント」をクリックする。

クリックすると拡大します

3 ページ下部の「DeepL APIで使用する認証キー」の情報を取得する。

クリックすると拡大します

これで認証キーの取得ができました。

DeepL APIの内容

DeepL APIの基本情報はDeepLAPI翻訳 | 機械翻訳のテクノロジーの「技術資料を読む」をクリックすると見れるようになります。

クリックすると拡大します

なお、基本情報には以下のように書かれています(Accessing APIより)

~RESTインターフェースを使用する場合、POST要求が推奨されますが、すべての関数はGETメソッドとPOSTメソッドをサポートします。リクエストパラメータはAPIに情報を渡すために使用され、結果はJSONで返されます。リクエストパラメータはUTF-8でエンコードされている必要があります。結果もUTF-8でエンコードされます。HTTPエラーコードは、エラーを通知するために使用されます。認証は固定キーに基づいており、データ転送はSSLによって保護されています~


少し難しく書かれていますがようは

・HTTPリクエストは、POSTでもGETでも可。リクエストパラメーターが存在

・翻訳元の文書が日本語の場合はUTF-8に変換しないといけない

・結果はJSONで返ってくる

ということになります。

それぞれの単語の意味についてはこちら

HTTPリクエスト、POST、GET・・・【VBA】Web APIを使ってLINE通知を行う(LINE Notify)2 HTTPリクエスト

UTF-8・・・「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

JSON・・・【VBA】Web APIを使ってデータを取得する(OpenWeatherMap)2 JSON

RequestとResponse

リクエストとレスポンスの情報は以下に記載されています。

Translating text – DeepL API

関係する部分だけまとめると以下のようになります。

Request

リクエストメソッド/URL
MethodGET/POST
URLhttps://api-free.deepl.com/v2/translate

パラメーター

ParameterOptionalDescription
text必須翻訳するテキスト。UTF8でエンコードされたプレーンテキストのみがサポートされています。パラメータは複数回指定でき、変換は要求されたのと同じ順序で返されます。各パラメーター値には、複数の文が含まれる場合があります。1回のリクエストで最大50のテキストを翻訳用に送信できます。
source_langオプション翻訳するテキストの言語。現在利用可能なオプション: 「EN」-英語 「JA」-日本語
target_lang必須テキストを翻訳する言語。現在利用可能なオプション: 「EN」-英語 「JA」-日本語

Response

Return valueDescription
detected_source_languageソーステキストで検出された言語。指定した場合、 source_langパラメーターの値を反映します。
text
翻訳されたテキスト。

Status

200は正常です。それ以外は何らかの問題が発生していることになります。

コード説明
400要求の形式が正しくありません。エラーメッセージとパラメータを確認してください。
403承認に失敗しました。有効なauth_keyパラメータを指定してください。
404要求されたリソースが見つかりませんでした。
413リクエストサイズが制限を超えています。
414リクエストURLが長すぎます。このエラーを回避するには、GETリクエストの代わりにPOSTリクエストを使用し、HTTP本文でパラメーターを送信します。
429リクエストが多すぎます。しばらくお待ちください。リクエストを再送信してください。
456割り当て超過。文字数制限に達しました。
503現在利用できないリソース。あとでもう一度試してみてください。
529リクエストが多すぎます。しばらくお待ちください。リクエストを再送信してください。
5**内部エラー

これらの情報をもとにAPI用のコードを作成します。

英語から日本語に翻訳する際のサンプルコードサンプルコード

DeepL APIで「Today is holiday.Why do you work today?」を翻訳するコードは以下になります。

変数APIkeyには取得したAPIキーを入れるようにしてください。

Sub DeepLTranslation()
   
    'DeepLで取得したkey
    Const APIkey As String = "(取得したAPIキー)"
    
     '翻訳元文章
    Dim SourceSentense As String
    SourceSentense = "Today is holiday.Why do you work today?"
    
    '日本語の場合を考慮してUTF-8にエンコードする
    'SourceSentense =  WorksheetFunction.EncodeURL(SourceSentense)
   
    Dim http As MSXML2.XMLHTTP60
    Set http = New MSXML2.XMLHTTP60
   
   
    With http
    
        'HTTPリクエスト(GETメソッド)
        Call .Open("GET", "https://api-free.deepl.com/v2/translate?auth_key=" & APIkey & "&text=" & SourceSentense & "&source_lang=EN&target_lang=JA")
        Call .send
        
        Do
            If .readyState = 4 Then Exit Do
            DoEvents
        Loop
        
        'HTTPレスポンスの内容確認
        '*成功時:{Res="status":200, "message":"ok"}
        Debug.Print .responseText
        Debug.Print .Status
        
        'ダブルクォーテーションで区切って配列として取得
        Dim buf As Variant
        Dim TranslatedSentense As String
        
        buf = Split(http.responseText, """")
        TranslatedSentense = buf(9)
        Debug.Print TranslatedSentense
               
    End With
    
End Sub

各コードの説明

今回は以下の3つに分けて説明します

  • メッセージ
  • HTTPリクエスト
  • HTTPレスポンス

以下で説明していきます。

メッセージ

    'DeepLで取得したkey
    Const APIkey As String = "(取得した認証キー)"
    
     '翻訳元文章
    Dim SourceSentense As String
    SourceSentense = "Today is holiday.Why do you work today?"
    
    '日本語の場合を考慮してUTF-8にエンコードする
    'SourceSentense =  WorksheetFunction.EncodeURL(SourceSentense)

APIKeyには先ほど取得した認証キーをいれます。

また今回翻訳元文書をSourceSentenseとします。この内容をDeepLのAPIに送信することとします。

ただ、元文書が日本語の場合はUTF-8にエンコードする必要があります。

その場合はWorksheetFunctionのEncodeURL関数を使ってUTF-8に変換しておいてください。

詳しい記事はこちら

HTTPリクエスト

      Dim http As MSXML2.XMLHTTP60
    Set http = New MSXML2.XMLHTTP60
   
   
    With http
    
        'HTTPリクエスト(GETメソッド)
        Call .Open("GET", "https://api-free.deepl.com/v2/translate?auth_key=" & APIkey & "&text=" & SourceSentense & "&source_lang=EN&target_lang=JA")
        Call .send
        
        Do
            If .readyState = 4 Then Exit Do
            DoEvents
        Loop

HTTPリクエストに関する記事はこちらを参考ください。

今回はGET方式でのリクエストを行っています(POST方式での記事はこちら

またリクエストのURLにパラメーターとして「auth_key」「text」「source_lag」「target_lang」を追加しています。複数のパラメーターがある場合は&で区切るのが作法です。

HTTPレスポンス

        'HTTPレスポンスの内容確認
        '*成功時:{Res="status":200, "message":"ok"}
        Debug.Print .responseText
        Debug.Print .Status
        
        'ダブルクォーテーションで区切って配列として取得
        Dim buf As Variant
        Dim TranslatedSentense As String
        
        buf = Split(http.responseText, """")
        TranslatedSentense = buf(9)
        Debug.Print TranslatedSentense

返って来る値をresponseTextプロパティで取得します。

またStatusプロパティでHTTPリクエストが正常だったかを確認します。

200以外の場合は間違っている部分がある為修正する必要があります。


なお返って来る値はJSON形式であり、以下のように表示されます。

{“translations”:[{“detected_source_language”:”EN”,”text”:”今日は休日ですが、なぜ働いているのですか?”}]}

この中の翻訳文のみを取得するのですが、JSONパース(詳しくはこちら)するのも面倒なので、今回はSplit関数を使って配列として取得したうえで必要な部分だけ切り出すようにしています。

ちなみにSplit関数で配列を生成した際のローカルウィンドウは以下のようになっています。

クリックすると拡大します

Split関数についてはこちら

結果としてイミディエイトウィンドウに以下の表示をさせることができます。

クリックすると拡大します

今回のまとめ

今回はDeepL APIを用いた文書の翻訳について説明しました。

APIを使用する際は、認証キーを取得したり、パラメーターを理解する必要があり少し面倒です。

ただ1つAPIを取得できるようになれば他のAPIの取得も同じようにできるので、2回目以降は楽になります。

この記事を通して少しでも内容を理解していただければ嬉しく思います。

補足で以下の記事も上げていますのでまたみていってください。

pythonですが会話形式で非常にわかりやすく書かれている書籍です。webAPIやスクレイピングを一から理解できる内容になっています。筆者はこれでWeb APIを勉強しました。

Selenium-VBAでのWebスクレイピングに関する記事はこちらをどうぞ

【ExcelVBA‐Selenium】【永久保存版】スクレイピングに必要なSeleniumのインストール方法教えます
【Selenium-VBA】Yahooメールへのログイン方法をわかりやすく説明する
ChromeでのWebスレイピングをできる限りわかりやすく説明する(Excel VBA)
【ExcelVBA‐Selenium】Chrome driverのバージョンエラーが出た時の対処法(2021/10/7更新)
【Selenium-VBA】Seleniumを用いたスクレイピングでテーブル情報を取得する1
【Selenium-VBA】スクレイピングをするのに必要なHTMLについて説明します1
【Selenim-VBA】起動済みのChromeを用いてSeleniumによるスクレイピングを行う
【Selenium-VBA】JavaScriptを使ってスクレイピングをしてみる1
【VBA】SeleniumBasicにおけるクラス、メソッド、プロパティ一覧(日本語版)

Web-APIを用いたデータ取得に関する記事はこちらをどうぞ

【VBA】Web APIを使ってデータを取得する(OpenWeatherMap)1
【VBA】Web APIを使って時間別天気予報を取得する(気象庁API)
【VBA】Web APIを使ってLINE通知を行う(LINE Notify)1

コメント

タイトルとURLをコピーしました