【エラー表示問題未解決】Python初心者がGoogle translate(グーグル翻訳)APIを使ってみる

Python初心者がGoogle translate(グーグル翻訳)APIを使ってみます。

※エラーが表示され、問題が未解決されていません。(2020年5月5日)

Google Maps Platform(グーグルマッププラットホーム)を使用する際に、Google Cloud Platformの新規会員により、12ヶ月の無料トライアル($300 相当のクレジット)がついてきました。

せっかく12ヶ月の無料トライアルができるので、Google Cloud Platformを活用していきたいと思いますので、今回は、PythonでGoogle翻訳APIである「Cloud Translation API」を使っていきます。

なお、「Cloud Translation API」は本来は有料です。一部無料使用もあります。詳細については、「Cloud Translation | Google Cloud」の料金ページをご確認ください。

■Python

Pythonバージョン

今回のPythonのバージョンは、「3.8.2」を使用しています。

■Cloud Translation APIの有効化

まず、持っているGoogleアカウントでGoogle Cloud Platform(https://console.cloud.google.com/home/dashboard)にログインします。

Google Cloud Platformのダッシュボード上部に、「リソースとサービスを検索します」という検索バーがありますので、こちらで「Cloud Translation API」と検索します。

検索すると候補に「Cloud Translation API」が表示されますので、こちらをクリックします。

クリックすると、「APIライブラリ」の「Cloud Translation API」が表示されますのでこちらで「有効にする」ボタンをクリックします。

クリックすると、「Cloud Translation API」が有効になり、左側のメニューから「認証情報」から「AIPキー」の「キー」の情報を取得しておきます。

■サービスアカウントを作成する

Cloud Translation APIのAIPキーを取得した後は、Cloud Translate APIを実行するサーバのためにサービスアカウントのキーが必要になりますので、アカウントの作成を行います。

Google Cloud Platformのダッシュボード(https://console.cloud.google.com/home/dashboard)から、左側のメニューから「APIとサービス」という文字をクリックします。

クリックしてさらに「認証情報」をクリックします。

クリックすると、認証情報のページが表示され、項目に「サービスアカウント」とありますので、その右側の「サービス アカウントを管理」をクリックします。

クリックすると、サービスアカウントのページになりますので、こちらから「サービスアカウントを作成」をクリックします。

クリックすると、サービスアカウントを作成ページになりますので、サービスアカウント名、サービスアカウントID、サービスアカウントの説明(任意)を入力します。入力後、「作成」ボタンをクリックします。

クリックすると、「サービス アカウントの権限(オプション)」になりますので、ロールを選択で、「Project」から「オーナー」を選択します。「オーナー」を選択し、「条件」はなしで、「続行」ボタンをクリックします。なお、今回は「オーナー」での作成となります。

クリックすると、「ユーザーにこのサービス アカウントへのアクセス権を付与(オプション)」になります。こちらで、サービスアカウントユーザーロールの入力はなし、サービスアカウント管理者ロールの入力はなしで、「キーの作成(オプション)」から「キーを作成」ボタンをクリックします。

クリックすると、右側に「キーの作成(オプション)」が表示されますので、キータイプは「JSON」で「作成」ボタンをクリックします。

クリックすると、「秘密鍵がパソコンに保存されました。jsonによってクラウドリソースへのアクセスが許可されるため、安全に保存してください。」といったポップアップが表示されますので、「閉じる」ボタンをクリックします。この時jsonファイルがローカル上に保存されます。

クリックすると、「キーID」が表示されますので、この情報を保存します。あとは「完了」ボタンをクリックします。

■サービスアカウントキーの適用をする

サービス アカウントを作成した際にローカル上に保存されたjsonファイルを適用します。

setx GOOGLE_APPLICATION_CREDENTIALS "jsonファイルの保存場所、jsonファイルを指定してください"

コマンドプロンプトから上記をコマンドしENTERキーを押す。

ENTERキーを押すと、「成功: 指定した値は保存されました。」と表示されます。

■コード

# coding: UTF-8
from google.cloud import translate


# インスタンス生成
client = translate.Client()


# I am a Architect を日本語に翻訳
result = client.translate( 'I am a Architect', target_language='ja')


print(result['translatedText'])

サービスアカウントキーが適用されたと仮定し、こちらの記事を参考にコードを記述する。

このコードを「cloudtranslation-api-test.py」というファイルで保存し、テストを試みる。

■実行

コマンドプロンプトから、「cloudtranslation-api-test.py」というファイルを実行してみる。

ImportError: cannot import name 'translate' from 'google.cloud' (unknown location)

実行したが、ImportErrorというエラーが表示される。翻訳すると、「「google.cloud」から不明な場所に名前「translate」をインポートできません」となる。

エラーについて調べてみると、こちらのページが参考になる。google-cloud-translateがインストールされていないようだ。

pip install google-cloud-translate

コマンドプロンプトから、pipを経由してgoogle-cloud-translateをインストールしてみる。

インストールが完了後、再びコマンドプロンプトから「cloudtranslation-api-test.py」を実行してみる。

実行すると、ImportErrorというエラーは表示されなくなったが、別のエラーが表示される。

AttributeError: module 'google.cloud.translate' has no attribute 'Client'

このエラーはAttributeErrorで、翻訳してみると、「google.cloud.translate’に属性 ‘Client’がありません」とのこと。

エラーについて調べてみると、こちらの記事が参考になった。コードの”translate”を”translate_v2”に書き換えれば実行できるということなので、書き換えてみる。

■書き換えたコード

# coding: UTF-8
from google.cloud import translate_v2


# インスタンス生成
client = translate_v2.Client()


# I am a Architect を日本語に翻訳
result = client.translate( 'I am a Architect', target_language='ja')


print(result['translatedText'])

”translate”を”translate_v2”にコードを書き換えしてみました。

■実行

コードを書き換えて保存した「cloudtranslation-api-test.py」をコマンドプロンプトから実行してみる。

実行してみるが、下記のエラーが表示された。

Traceback (most recent call last):
File "C:\Users\user\cloudtranslation-api-test.py", line 10, in <module>
result = client.translate( 'I am a Architect', target_language='ja')
File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\google\cloud\translate_v2\client.py", line 268, in translate
response = self._connection.api_request(method="POST", path="", data=data)
File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\google\cloud\_http.py", line 412, in api_request
response = self._make_request(
File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\google\cloud\_http.py", line 276, in _make_request
return self._do_request(
File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\google\cloud\_http.py", line 314, in _do_request
return self.http.request(
File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\google\auth\transport\requests.py", line 442, in request
self.credentials.before_request(auth_request, method, url, request_headers)
File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\google\auth\credentials.py", line 124, in before_request
self.refresh(request)
File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\google\oauth2\service_account.py", line 334, in refresh
access_token, expiry, _ = _client.jwt_grant(request, self._token_uri, assertion)
File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\google\oauth2\_client.py", line 153, in jwt_grant
response_data = _token_endpoint_request(request, token_uri, body)
File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\google\oauth2\_client.py", line 124, in _token_endpoint_request
_handle_error_response(response_body)
File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\google\oauth2\_client.py", line 60, in _handle_error_response
raise exceptions.RefreshError(error_details, response_body)
google.auth.exceptions.RefreshError: ('invalid_grant: Invalid JWT Signature.', '{"error":"invalid_grant","error_description":"Invalid JWT Signature."}')

表示されたエラーについていろいろ調べてみたが、

・OAuth2

・アクセストークンの有効期限

・認証トークン

参考になったURL:

GoogleのService Account認証に潜む invalid_grant 問題 | infoScoop開発者ブログ
google.auth.exceptions.RefreshError using delegated credentials · Issue #611 · googleapis/google-api-python-client
Hi, I'm trying to use the Google API client to retrieve email for a user using a service account. I've created the service account credentials with a ro...

ここら辺が関係しているようだが、初心者がレベルが高すぎた。

解決できなかったので、レベルアップしたら、解決していきたい。

■疑問点

サービス アカウントを作成した際にローカル上に保存されたjsonファイルを適用する場合は、

setx GOOGLE_APPLICATION_CREDENTIALS "jsonファイルの保存場所、jsonファイルを指定してください"

では、

set GOOGLE_APPLICATION_CREDENTIALS=[PATH]

とコマンドプロンプトから入力しないといけないのか?実行してみるが何も起きなかった。

参考URL:https://cloud.google.com/translate/docs/basic/setup-basic

コメント

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