こんにちはmk419です。正直、大学の課題がキツイです。
今回はTwitterで話題になってた無料で使える「みんなの自動翻訳」のAPIを触っていきたいと思います。
準備
ここからユーザー登録をして、ログインしてください。
右上のユーザー名を選択して、「設定」を開きます。
設定の中の「API key」と「API secret」を次のスクリプトで使用します。
実装
今回は外部ライブラリを使用しない実装と使用する実装の2つを用意しました。
外部ライブラリを使用しない実装(標準ライブラリのみ)
from json import loads
from urllib.parse import urlencode
from urllib.request import Request, urlopen
TEXT = """
Alter Linuxは日本の学生デベロッパー数十人によって開発されており、
Linuxディストリビューションとしては数少ない完全な日本語化が行われています。
Arch Linux派生のディストリビューションとしてデフォルトで日本語に対応しているものは初となります。
「Linuxは英語が多くて難易度が高いから挑戦しづらい...」と思っていた方、挑戦してみませんか?
Alter Linuxコミュニティは英語と日本語のどちらでも開発者が直接サポートを行っています。安心してご利用ください。
"""
API_KEY = "<API key>"
API_SECRET_KEY = "<API secret>"
USER_NAME = "<user name>"
URL = "https://mt-auto-minhon-mlt.ucri.jgn-x.jp"
ACCESS_TOKEN_URL = f"{URL}/oauth2/token.php"
CLIENT_DATA = {
"grant_type": "client_credentials",
"client_id": API_KEY,
"client_secret": API_SECRET_KEY,
"urlAccessToken": f"{URL}/oauth2/token.php"
}
DEFAULT_DATA = {
"key": API_KEY,
"name": USER_NAME,
"type": "json"
}
def post(url: str, data: dict[str, str]) -> str:
request_object = Request(url, urlencode(data).encode("ascii"), method="POST")
with urlopen(request_object) as response:
result = response.read().decode("utf-8")
return result
def get_access_token():
return loads(post(f"{URL}/oauth2/token.php", data=CLIENT_DATA))["access_token"]
def translate(text: str, url: str) -> str:
data = dict(**DEFAULT_DATA, access_token=get_access_token(), text=text)
return loads(post(url, data=data))["resultset"]["result"]["text"]
def ja_to_en(text: str) -> str:
return translate(text, f"{URL}/api/mt/generalNT_ja_en/")
def en_to_ja(text: str) -> str:
return translate(text, f"{URL}/api/mt/generalNT_en_ja/")
if __name__ == "__main__":
print(ja_to_en(TEXT))
「<API key>」、「<API secret>」、「<user name>」はそれぞれ置き換えてください。
「<user name>」は「みんなの自動翻訳」のユーザーIDを使用してください。
AlterLinux is being developed by dozens of Japanese student developers.
It is one of the few Linux distributions to have complete Japanese translations.
This is the first Arch Linux-derived distribution to support Japanese by default.
If you thought that Linux is difficult to challenge because there is a lot of English and it is difficult, why don't you try it?
The AlterLinux community is supported directly by developers in both English and Japanese, so feel free to use it.
実行結果は上のようになります。
外部ライブラリを使用した実装
from json import loads
import requests
TEXT = """
Alter Linuxは日本の学生デベロッパー数十人によって開発されており、
Linuxディストリビューションとしては数少ない完全な日本語化が行われています。
Arch Linux派生のディストリビューションとしてデフォルトで日本語に対応しているものは初となります。
「Linuxは英語が多くて難易度が高いから挑戦しづらい...」と思っていた方、挑戦してみませんか?
Alter Linuxコミュニティは英語と日本語のどちらでも開発者が直接サポートを行っています。安心してご利用ください。
"""
API_KEY = "<API key>"
API_SECRET_KEY = "<API secret>"
USER_NAME = "<user name>"
URL = "https://mt-auto-minhon-mlt.ucri.jgn-x.jp"
ACCESS_TOKEN_URL = f"{URL}/oauth2/token.php"
CLIENT_DATA = {
"grant_type": "client_credentials",
"client_id": API_KEY,
"client_secret": API_SECRET_KEY,
"urlAccessToken": f"{URL}/oauth2/token.php"
}
DEFAULT_DATA = {
"key": API_KEY,
"name": USER_NAME,
"type": "json"
}
def post(url: str, data: dict[str, str]) -> str:
return requests.post(url, data).text
def get_access_token():
return loads(post(f"{URL}/oauth2/token.php", data=CLIENT_DATA))["access_token"]
def translate(text: str, url: str) -> str:
data = dict(**DEFAULT_DATA, access_token=get_access_token(), text=text)
return loads(post(url, data=data))["resultset"]["result"]["text"]
def ja_to_en(text: str) -> str:
return translate(text, f"{URL}/api/mt/generalNT_ja_en/")
def en_to_ja(text: str) -> str:
return translate(text, f"{URL}/api/mt/generalNT_en_ja/")
if __name__ == "__main__":
print(ja_to_en(TEXT))
8割のコードは1つ目と一緒です。「post」の実装が違っています。
requestsは偉大。
まとめ
周りにほとんど情報が無かったので手探りで実装しました。「みんなの自動翻訳」にはOAuth1の実装しか無かったので、今回は独自でOAuth2での実装を行いました。(あんまり大したことではない)
翻訳精度も良く、無料で使えるので、翻訳アプリの開発とかに便利だと思います。
最近ブログのネタが切れてるので誰か下さい
コメント