# DeepL の API を使った話 この記事は刺身たんぽぽ同好会アドベントカレンダー4日目の記事です. 1週間の遅刻ですごめんなさいごめんなさい.  deepl で pdf が翻訳出来るようになったらしいので使っていました.印刷物をスキャンしたようなドキュメントでもそれなりに認識してくれてとても便利ですね.ただ,ファイル翻訳だと有料版でも制限が有るらしいので従量課金制の API プランを使うことにしました.APIの無料版もあり月50万文字まで使えるそうです.API でのファイル翻訳での利用料は1ファイル最低5万文字としてカウントされるそうです. ## Deepl API  ファイルをアップロードするとファイルに対応する id と key が返って来てこれを使って翻訳の進捗確認やダウンロードが出来ます.1度ダウンロードすると削除されてしまうらしく,誤ってダウンロードしたファイルを失うと悲しい気持ちになります.(なりました) ## ファイルを翻訳する というわけで事故を減らすためにスクリプトを書きました. 使い方は下のスクリプトをパスの通ってる適当な場所(ここでは `/usr/bin/deepl`)に保存して環境変数`DEEPL_AUTH_KEY` に適当な API key をセットします. json のパースに jq を使ってるので別途インストールしてください. `deepl ファイル名` とコマンドを叩いたらアップロードして翻訳,ダウンロードまでやってくれます. ```sh= #!/bin/sh AUTH_KEY=${DEEPL_AUTH_KEY:="SET_YOUR_DEEPL_AUTH_KEY"} TARGET_LANG=${TARGET_LANG:-"JA"} IS_FREE=${IS_FREE:-"false"} # Usage [-o|--output output_file_name] [-l|--target_lang target_lang] [-k|--auth_key auth_key] [-f|--free] [--help] input_file while [ $# -gt 0 ]; do case "$1" in -o|--output) OUTPUT_FILE=$2 shift 2 ;; -l|--target_lang) TARGET_LANG=$2 shift 2 ;; -k|--auth_key) AUTH_KEY=$2 shift 2 ;; -f|--free) IS_FREE="true" shift ;; --help) echo "Usage: $0 [-o|--output output_file_name] [-l|--target_lang target_lang] [-k|--auth_key auth_key] [-f|--free] [--help] input_file" exit 0 ;; *) INPUT_FILE=$1 shift ;; esac done if [ -z "$INPUT_FILE" ]; then echo "Usage [-o|--output output_file_name] [-l|--target_lang target_lang] [-k|--auth_key auth_key] [-f|--free] [--help] input_file" exit 1 fi INPUT_FILE_WITHOUT_EXT=${INPUT_FILE%.*} FILE_EXT=${INPUT_FILE##*.} OUTPUT_FILE=${OUTPUT_FILE:-${INPUT_FILE_WITHOUT_EXT}_${TARGET_LANG}.${FILE_EXT}} if [ "$IS_FREE" = "true" ]; then URL="https://api-free.deepl.com/v2" else URL="https://api.deepl.com/v2" fi echo "INPUT_FILE: ${INPUT_FILE}" echo "OUTPUT_FILE: ${OUTPUT_FILE}" echo curl ${URL}/document -F "file=@${INPUT_FILE}" -F "auth_key=${AUTH_KEY}" -F "target_lang=${TARGET_LANG}" INFO=`curl ${URL}/document -F "file=@${INPUT_FILE}" -F "auth_key=${AUTH_KEY}" -F "target_lang=${TARGET_LANG}"` DOCUMENT_ID=`echo $INFO | jq -r '.document_id'` DOCUMENT_KEY=`echo $INFO | jq -r '.document_key'` echo "INFO: ${INFO}" echo "DOCUMENT_ID: ${DOCUMENT_ID}" echo "DOCUMENT_KEY: ${DOCUMENT_KEY}" STATUS="" while [ "$STATUS" != "done" ]; do sleep 5 TRANSLATION_STATUS=`curl ${URL}/document/${DOCUMENT_ID} -d auth_key=${AUTH_KEY} -d document_key=${DOCUMENT_KEY}` 2>/dev/null STATUS=`echo $TRANSLATION_STATUS | jq -r '.status'` echo "STATUS: ${STATUS}" done BILLED_CHARACTERS=`echo $TRANSLATION_STATUS | jq -r '.billed_characters'` echo "BILLED_CHARACTERS: ${BILLED_CHARACTERS}" curl ${URL}/document/${DOCUMENT_ID}/result -d auth_key=${AUTH_KEY} -d document_key=${DOCUMENT_KEY} -o ${OUTPUT_FILE} ``` いかがでしたか? これで論文読むのがはかどりますね! ## ここから本題 はい,ここからが本題?でこのスクリプト実は殆ど copilot 君が書きました. API のレスポンスの json パースどうしようかな,と悩みつつ変数名を定義したら勝手に補完してくれてチビりました. jq コマンドは初めて知りました.僕よりも copilot 君の方が優秀だと思います. ![](https://i.imgur.com/SRW7bcw.png) 引数のパースやファイルの存在チェックも勝手に書いてくれました. コメントで Usage をヒントに与えると良きに計らってくれるようです.これには驚きました. ![](https://i.imgur.com/XAQ1KSt.png) とはいえ,この出力を得るためにコメントを十何回か調整しているので copilot 君にやりたいことを上手く伝える力も必要そうです. いかがでしたか? これからのプログラマは copilot 語も使える必要が有りそうですね!