pydriveの検証作業の自動化
質問
を自動化しようとしています。
GoogleAuth
を使用する際の処理を自動化しようとしています。
pydrive
ライブラリ(
https://pypi.python.org/pypi/PyDrive
).
pydriveとgoogle APIをセットアップして、私の
secret_client.json
は動作しますが、スクリプトを実行するたびに gdrive にアクセスするための Web 認証が必要です。
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
gauth = GoogleAuth()
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)
textfile = drive.CreateFile()
textfile.SetContentFile('eng.txt')
textfile.Upload()
print textfile
drive.CreateFile({'id':textfile['id']}).GetContentFile('eng-dl.txt')
eng.txt
は、ただのテキストファイルです。さらに、別のアカウントにログインしているときに上記のスクリプトを使おうとすると
をアップロードしてくれないのです。
eng.txt
を生成した私の gdrive にアップロードしません。
secret_client.json
を生成しましたが、認証時にログインしていたアカウントは
前の投稿から、認証の自動化のために以下を試したのですが、エラーメッセージが出ます。
import base64, httplib2
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from apiclient.discovery import build
from oauth2client.client import SignedJwtAssertionCredentials
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
#gauth = GoogleAuth()
#gauth.LocalWebserverAuth()
# from google API console - convert private key to base64 or load from file
id = "464269119984-j3oh4aj7pd80mjae2sghnua3thaigugu.apps.googleusercontent.com"
key = base64.b64decode('COaV9QUlO1OdqtjMiUS6xEI8')
credentials = SignedJwtAssertionCredentials(id, key, scope='https://www.googleapis.com/auth/drive')
credentials.authorize(httplib2.Http())
gauth = GoogleAuth()
gauth.credentials = credentials
drive = GoogleDrive(gauth)
drive = GoogleDrive(gauth)
textfile = drive.CreateFile()
textfile.SetContentFile('eng.txt')
textfile.Upload()
print textfile
drive.CreateFile({'id':textfile['id']}).GetContentFile('eng-dl.txt')
エラーです。
Traceback (most recent call last):
File "/home/alvas/git/SeedLing/cloudwiki.py", line 29, in <module>
textfile.Upload()
File "/usr/local/lib/python2.7/dist-packages/pydrive/files.py", line 216, in Upload
self._FilesInsert(param=param)
File "/usr/local/lib/python2.7/dist-packages/pydrive/auth.py", line 53, in _decorated
self.auth.Authorize()
File "/usr/local/lib/python2.7/dist-packages/pydrive/auth.py", line 422, in Authorize
self.service = build('drive', 'v2', http=self.http)
File "/usr/local/lib/python2.7/dist-packages/oauth2client/util.py", line 132, in positional_wrapper
return wrapped(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/apiclient/discovery.py", line 192, in build
resp, content = http.request(requested_url)
File "/usr/local/lib/python2.7/dist-packages/oauth2client/util.py", line 132, in positional_wrapper
return wrapped(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/oauth2client/client.py", line 475, in new_request
self._refresh(request_orig)
File "/usr/local/lib/python2.7/dist-packages/oauth2client/client.py", line 653, in _refresh
self._do_refresh_request(http_request)
File "/usr/local/lib/python2.7/dist-packages/oauth2client/client.py", line 677, in _do_refresh_request
body = self._generate_refresh_request_body()
File "/usr/local/lib/python2.7/dist-packages/oauth2client/client.py", line 861, in _generate_refresh_request_body
assertion = self._generate_assertion()
File "/usr/local/lib/python2.7/dist-packages/oauth2client/client.py", line 977, in _generate_assertion
private_key, self.private_key_password), payload)
File "/usr/local/lib/python2.7/dist-packages/oauth2client/crypt.py", line 131, in from_string
pkey = crypto.load_pkcs12(key, password).get_privatekey()
OpenSSL.crypto.Error: [('asn1 encoding routines', 'ASN1_get_object', 'header too long')]
gdriveのapiでの認証はこんな感じです。
pydriveを使うたびに認証する必要がないようにするにはどうしたらよいでしょうか?
pydriveスクリプトを使用するpythonスクリプトが、pydriveスクリプトを生成したアカウントにのみアップロードするような自動認証を許可するにはどうしたらよいでしょうか。
secret_client.json
を生成したアカウントにのみアップロードするようにするにはどうしたらよいでしょうか?
どのように解決するのですか?
まず、あなたはこの仕組みの非常に重要な部分を誤解しています。
別のアカウントにログインしているときに上記のスクリプトを使用しようとすると アカウントにログインしているときに を生成したeng.txtを私のgdriveにアップロードしてくれません。 secret_client.jsonを生成したgdriveにはeng.txtはアップロードされず、認証時にログインしていたアカウントにアップロードされます。 認証時にログインしていたアカウントにアップロードされます。
これはまさに想定内のことです。開発者であるあなたは
client_secret.json
をアプリケーションと一緒に配布し、そのファイルをPyDriveが使用して
アプリケーション
をGoogleで認証するために使用されます。Googleは、あらゆる種類の理由(測定基準、アカウントへの請求、アクセスの取り消しなど)のために、世の中の各アプリケーションによって行われたAPIリクエストの数を知りたいので、アプリケーションに自分自身を認証するよう要求しています。
さて、あなたのアプリケーションが
LocalWebserverAuth
を実行すると
クライアント
を Google で認証しています。クライアントとは、もちろん、あなたのアプリケーションを実際に使っている人のことです。この場合、開発者とクライアントは同じ人(あなた)ですが、あなたのアプリケーションを100万人の異なる人々に配布したいと想像してください。彼らは自分自身を認証し、自分の Drive アカウントにファイルをアップロードできるようにする必要があります。
client_secret.json
.
とはいえ、アプリを実行するたびにクライアントに認証を依頼する必要がないようにするための、本当にごくわずかな変更に過ぎません。単に
LoadCredentialsFile
と
SaveCredentialsFile
.
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
gauth = GoogleAuth()
# Try to load saved client credentials
gauth.LoadCredentialsFile("mycreds.txt")
if gauth.credentials is None:
# Authenticate if they're not there
gauth.LocalWebserverAuth()
elif gauth.access_token_expired:
# Refresh them if expired
gauth.Refresh()
else:
# Initialize the saved creds
gauth.Authorize()
# Save the current credentials to a file
gauth.SaveCredentialsFile("mycreds.txt")
drive = GoogleDrive(gauth)
textfile = drive.CreateFile()
textfile.SetContentFile('eng.txt')
textfile.Upload()
print textfile
drive.CreateFile({'id':textfile['id']}).GetContentFile('eng-dl.txt')
関連
-
[解決済み】PyCharmでインストールされたパッケージを使用するにはどうすればよいですか?
-
[解決済み] Pythonのマルチプロセッシングプールimap_unorderedの呼び出しの進捗を表示しますか?
-
[解決済み] タプルのリストを複数のリストに変換するには?
-
[解決済み] Pythonのargparseを使った隠し引数の作成
-
[解決済み] 古いバージョンのPythonにおける辞書のキーの並び順
-
[解決済み] Cythonのコードを含むPythonパッケージはどのように構成すればよいのでしょうか?
-
[解決済み] Flask でグローバル変数はスレッドセーフか?リクエスト間でデータを共有するには?
-
[解決済み] PySparkでデータフレームのカラムをString型からDouble型に変更する方法は?
-
[解決済み] Python の sorted() はどのようなアルゴリズムを使っているのですか?重複
-
[解決済み] Seleniumです。FirefoxProfile 例外 プロファイルを読み込むことができない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pythonのマルチプロセッシングプールimap_unorderedの呼び出しの進捗を表示しますか?
-
[解決済み] Pandasの'Freq'タグにはどのような値が有効ですか?
-
[解決済み] データフレームをソートした後にインデックスを更新する
-
[解決済み] Django Rest Framework ファイルアップロード
-
[解決済み] Pythonでマルチプロセッシングキューを使うには?
-
[解決済み] Celeryタスクのユニットテストはどのように行うのですか?
-
[解決済み] Pandasを使って、既存のExcelファイルに新しいシートを保存する方法は?
-
[解決済み] Pythonの検索パスを他のソースに展開する
-
[解決済み] あるメソッドが複数の引数のうち1つの引数で呼び出されたことを保証する
-
[解決済み] djangoのQueryDictをPythonのDictに変更するには?