質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

2574閲覧

Herokuで環境変数を使ってGoogle Drive APIの認証をしたい

mmm_03

総合スコア0

Google API

Googleは多種多様なAPIを提供していて、その多くはウェブ開発者向けのAPIです。それらのAPIは消費者に人気なGoogleのサービス(Google Maps, Google Earth, AdSense, Adwords, Google Apps,YouTube等)に基づいています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2020/08/29 18:08

前提・実現したいこと

Heroku + Python でGoogle Drive にファイルをアップロードしたいです。

Google Drive API の認証情報が書いてある下記の2つのファイルはHerokuにはアップロードせず、
環境変数を設定するのが安全と知りました。
・credentials.json
・client_secrets.json 

色々調べたのですが、Heroku 環境変数 + Google Drive の場合の認証のやり方がなかなか見つからず、
下記のGoogle Spread Sheetの場合を参考にしながら、
Heroku上で各環境変数を設定し、
credentials.json、client_secrets.json を作成するコードを書いてみました。

▼引用テキストPythonのHerokuアプリケーションからGoogle Spread Sheetの読み書き

https://www.virtual-surfer.com/entry/2018/06/20/190000

しかしjsonファイルの書き込みがうまくいっていないのか、エラーが返されます。
エラー部分の解決法も調べてはみたのですが、今回の場合はどうしたらよいのかがわかりませんでした。

コードの書き方に問題があるなど、解決方法がありましたらご教授いただけますと幸いです。
よろしくお願いいたします。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "test.py", line 69, in <module> gauth.CommandLineAuth() File "/app/.heroku/python/lib/python3.8/site-packages/pydrive/auth.py", line 113, in _decorated self.GetFlow() File "/app/.heroku/python/lib/python3.8/site-packages/pydrive/auth.py", line 443, in GetFlow self.LoadClientConfig() File "/app/.heroku/python/lib/python3.8/site-packages/pydrive/auth.py", line 366, in LoadClientConfig self.LoadClientConfigFile() File "/app/.heroku/python/lib/python3.8/site-packages/pydrive/auth.py", line 386, in LoadClientConfigFile client_type, client_info = clientsecrets.loadfile(client_config_file) File "/app/.heroku/python/lib/python3.8/site-packages/oauth2client/clientsecrets.py", line 165, in loadfile return _loadfile(filename) File "/app/.heroku/python/lib/python3.8/site-packages/oauth2client/clientsecrets.py", line 122, in _loadfile obj = json.load(fp) File "/app/.heroku/python/lib/python3.8/json/__init__.py", line 293, in load return loads(fp.read(), File "/app/.heroku/python/lib/python3.8/json/__init__.py", line 357, in loads return _default_decoder.decode(s) File "/app/.heroku/python/lib/python3.8/json/decoder.py", line 337, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "/app/.heroku/python/lib/python3.8/json/decoder.py", line 355, in raw_decode raise JSONDecodeError("Expecting value", s, err.value) from None json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

該当のソースコード

test.py

Python

1# coding=utf-8 2from pydrive.auth import GoogleAuth 3from pydrive.drive import GoogleDrive 4 5import os 6import json 7 8access_token_ = os.environ['access_token'] 9client_id_ = os.environ['client_id'] 10project_id_ = os.environ['project_id'] 11client_secret_ = os.environ['client_secret'] 12refresh_token_ = os.environ['refresh_token'] 13 14 15# 書き込み用のcredential.jsonファイル作成 16credential_file_name = 'credential.json' 17credential_file = open(credential_file_name, 'w') 18 19 20# template.txtと環境変数から取得した各種データを統合してcredentials.jsonに書き込む 21template_file_name = 'template.txt' 22template_file = open(template_file_name) 23template_file_lines = template_file.readlines() 24line_num = 0 25 26for line in template_file_lines: 27 line_num += 1 28 if line_num == 2: 29 line = line.format(access_token_) 30 if line_num == 3: 31 line = line.format(client_id_) 32 if line_num == 4: 33 line = line.format(client_secret_) 34 if line_num == 5: 35 line = line.format(refresh_token_) 36 if line_num == 13: 37 line = line.format(access_token_) 38 if line_num == 15: 39 line = line.format(refresh_token_) 40 credential_file.writelines(line) 41 42 43# 書き込み用のcredential.jsonファイル作成 44client_file_name = 'client_secrets.json' 45client_file = open(client_file_name, 'w') 46 47 48 49# template_cs.txtと環境変数から取得した各種データを統合してclient_secrets.jsonに書き込む 50template_cs_file_name = 'template_cs.txt' 51template_cs_file = open(template_cs_file_name) 52template_cs_file_lines = template_cs_file.readlines() 53line_num = 0 54 55for line in template_cs_file_lines: 56 line_num += 1 57 if line_num == 2: 58 line = line.format(client_id_) 59 if line_num == 3: 60 line = line.format(project_id_) 61 if line_num == 7: 62 line = line.format(client_secret_) 63 client_file.writelines(line) 64 65 66 67# GoogleDriveの認証を行う 68gauth = GoogleAuth() 69gauth.CommandLineAuth() 70 71 # Google Driveのオブジェクトを得る 72drive = GoogleDrive(gauth) 73 74 75 76# GoogleDriveに新規のテキストファイルをアップロード 77f_txt = drive.CreateFile({'title': 'new_file.txt'}) 78f_txt.SetContentString('new text') 79print(f_txt) 80# GoogleDriveFile({'title': 'new_file.txt', 'mimeType': 'text/plain'}) 81 82f_txt.Upload() 83 84print("アップ成功") 85

template.txt

txt

1{ "aaa"":"aaa" 2 "access_token":"{}", 3 "client_id":"{}", 4 "client_secret":"{}", 5 "refresh_token":"{}", 6 "token_expiry":"2020-08-28T16:01:05Z", 7 "token_uri":"https://accounts.google.com/o/oauth2/token", 8 "user_agent": null, 9 "revoke_uri":"https://oauth2.googleapis.com/revoke", 10 "id_token": null, 11 "id_token_jwt": null, 12 "token_response": { 13 "access_token":"{}", 14 "expires_in": 3599, 15 "refresh_token":"{}", 16 "scope": "https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/drive.install", 17 "token_type": "Bearer" 18 }, 19 "scopes": ["https://www.googleapis.com/auth/drive.file", 20 "https://www.googleapis.com/auth/drive.install"], 21 "token_info_uri": "https://oauth2.googleapis.com/tokeninfo", 22 "invalid": false, "_class": "OAuth2Credentials", 23 "_module": "oauth2client.client" 24}

template_cs.txt

txt

1{"installed":{ 2 "client_id":"{}", 3 "project_id":"{}", 4 "auth_uri":"https://accounts.google.com/o/oauth2/auth", 5 "token_uri":"https://oauth2.googleapis.com/token", 6 "auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs", 7 "client_secret":"{}", 8 "redirect_uris":["urn:ietf:wg:oauth:2.0:oob","http://localhost"] 9 } 10}

補足情報(FW/ツールのバージョンなど)

Python 3.8.5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dameo

2020/09/01 22:00 編集

まず、ライブラリやサービスの使い方以前に、自分が何を使って何をしようとしているのか理解していますか? OAuthの場合、そこを理解していないと使う事ができません。 OAuthは大雑把に言うと、ユーザーの権利を借り受けて、本来アプリケーションがアクセス権を持たないサービスを、そのユーザーの権利で利用する方式です。 何かこういうことをしたい、似たようなコードをかき集めてこんな感じに。。。では動きません。あまりにも見当違いのことをしていると、手間がかかりすぎて回答もつかないでしょう。 今回はまず、あなたがやりたいこと(仕様)を明確にしてないのがダメです。 勝手な推測をすると、恐らくあなたは、 OAuthを使って、自分のGoogleアカウントの権利を、自分が自分のGogoleアカウントでGoogleに登録したアプリに貸し与え、Google Driveにアクセスしようとしている のですよね? 今自分、と書いているところは、OAuthでは自明ではありませんし、そうである場合とない場合で、組み方が結構違います。普通は、「自分のGoogleアカウントの権利」ではなく、herokuで動かすなら「herokuにアクセスしたユーザーのGoogleアカウントの権利」になるのです。あなたとは限らないので、そのユーザーがGoogleアカウントでログインし、あなたが登録したアプリに対して明示的にその権利を貸し与えることを承諾しないといけません。あなたがツイッターのアプリを利用したときと同じです。 また、あなたが利用しようとしているPyDriveはGoogle Drive API V3に対応していません。 こんな解説が必要な時点で、あなたには今の作業をやり始める最低限の準備が整っておらず、今のあなたの現在地からは見えないくらい先にのその地点があります。私はあなたにこんな長文の説明をする義務はありません。そこをよくお考えください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問