概要
Pythonista3とDeepLの無料APIを使い、
iOS上で選択した文字列を翻訳するアプリを作ってみました。
文字列を選択し、「共有…」からアプリを起動することで翻訳することができます。
実行環境
- iOS 12.5.4 (iPad mini3)
- Pythonista 3.3
- Python 3.6
事前準備
- App StoreからPythonista3をダウンロードしてください。(有料)
- DeepL APIのページで会員登録を行い、DeepL API Freeの認証キーを取得してください。(無料でもクレジットカードの登録が必要です。)
使い方
pythonista3の中で適当なフォルダを作り、中に以下の2つのファイルを作成してください。
# coding: utf-8
import json
import requests
import urllib
import appex
from html2text import html2text
import console
def get_text_input_with_appex():
text = appex.get_text()
if not text:
print('No text input found.')
return
text = html2text(text)
text = text.replace("\n", " ") # 改行があると訳がおかしくなるため、空白に置換
return text
def post_to_deepl_api(text, target_lang="JA", auth_key_path="auth_key.json"):
"""
DeepLのAPIにテキストを送信して翻訳を実行する関数。
text : str
翻訳したいテキスト。
target_lang : str
どの言語に翻訳するか。デフォルトはJA(日本語)。
選べる言語は以下のドキュメントの target_lang を参照してください。
https://www.deepl.com/docs-api/translating-text/request/
auth_key_path : str
認証キーが書かれたJSONのパス。
"""
# 認証キーの読み込み
with open(auth_key_path) as f:
auth_dict = json.load(f)
auth_key = auth_dict["auth_key"]
# リクエストヘッダーの指定
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
"Authorization": "DeepL-Auth-Key {}".format(auth_key)
}
# 送信するパラメータを指定し、コンテンツタイプに合うようにエンコードする
params = {"text": text, "target_lang": target_lang}
params = urllib.parse.urlencode(params)
# DeepLのAPIにリクエストを送信する
response = requests.post(
url="https://api-free.deepl.com/v2/translate",
headers=headers,
data=params)
return response
def main():
if not appex.is_running_extension():
print('This script is intended to be run from the sharing extension.')
return
text = get_text_input_with_appex()
# DeepLのAPIにリクエストを送信する
target_lang = "JA"
response = post_to_deepl_api(text, target_lang=target_lang)
# 翻訳結果を表示
try:
response.raise_for_status() # ステータスコードが200以外の場合はエラー
r_content = response.json()["translations"][0]
translation = r_content["text"]
detected_lang = r_content["detected_source_language"]
console.alert(
title="翻訳結果",
message=f"入力した言語: {detected_lang}\n"
f"翻訳した言語: {target_lang}\n"
"\n入力した文章:\n" + text + "\n\n"
"訳:\n" + translation,
button1="OK",
hide_cancel_button=True)
except requests.exceptions.RequestException as e:
# ステータスコードが200以外の場合はエラーを表示する
console.alert(
title="サーバーへリクエストを送信した際にエラーが発生しました。\n",
message=f"ステータスコード: {response.status_code}\n"
"エラー内容: \n" + str(e),
button1="OK",
hide_cancel_button=True)
if __name__ == '__main__':
main()
{
"auth_key": "取得した認証キー"
}
auth_key.json
には先ほど取得したDeepL Free APIの認証キーを記述してください。(間違ってgithubに公開するなどして認証キーが流出しないよう、別ファイルに分けてあります。)
ファイルを作成したらtranslate_with_deepl.py
を開いてください。右上のレンチマークを押して Shortcuts… を選び、Share Extentionを選びます。
Edit ShortcutのCustom Titleは呼び出し時のメニューにアプリ名として表示されるので、分かりやすい名前を付けてください。
また、メニューの右下の歯車マークからSettingsを開き、Default Interpreterがpython3.6になっていることを確認します。
これで準備完了です。
翻訳したいテキストを選択して
共有… → Run Pythonista Script → Custom Titleで設定した名前のアプリ
の順に選ぶことで翻訳を実行できます。
Github
今回作ったアプリをGithubにも公開しました。
https://github.com/tnd5176/deepl_on_ios
pythonista3でGitを使う方法に関しては、以下を参考にしてください。
Pythonista3でGithubにPushする方法 │ yhayashi30.org
iOSのGitクライアント Working Copy と Pythonista3 の組合わせが素晴らしい - a_sue’s diary
まとめ
pythonista3とDeepL API Freeを使ってiOS用の翻訳アプリを作りました。
pythonista3のメニュー呼び出しとAPI通信に数秒かかるのがネックであるものの、わざわざDeepLのwebサイトを開かなくても翻訳できるようになりました。
このようにpythonista3ではiPhoneの機能を使ったアプリが作れるので、上手く使いこなせば色々効率化できそうです。
参考サイト
Pythonista3
まだPythonista3使ってないの?ー基本操作・StaShインストール編ー - Qiita
DeepL APIの公式サイト
DeepL API
API通信関連
Python3でBasic認証のあるAPIにx-www-form-urlencodedでPOSTし、Requestsとurllibを理解する - Qiita
Python, RequestsでWeb APIを呼び出し(データ取得・操作) | note.nkmk.me
HTTPとPOSTとGET - Qiita
エラー処理(ステータスコードが200以外の時用)
Python API通信時の例外処理 - Qiita
Pythonの例外処理(try, except, else, finally) | note.nkmk.me