#cronを使ってラズパイからGoogleドライブに画像をアップしたい!
...だめです。
と言われてしまったので、その原因と解決方法について書いていく。
##通常は...?
これとか、あとこれを読み進めていけば普通にGoogleDriveにアップロードできると思う。
以下、クレデンシャル情報の設定とソースコード
#settings.yaml
#https://python.keicode.com/advanced/pydrive-upload-file.phpから引用
client_config_backend: settings
client_config:
client_id: <クライアントID>
client_secret: <クライアントシークレット>
save_credentials: True
save_credentials_backend: file
save_credentials_file: credentials.json
get_refresh_token: True
oauth_scope:
- https://www.googleapis.com/auth/drive.file
- https://www.googleapis.com/auth/drive.install
#ソースコード
#https://gangannikki.hatenadiary.jp/entry/2019/09/14/233000から引用
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
def main():
# Google Drive
gauth = GoogleAuth()
gauth.CommandLineAuth()
drive = GoogleDrive(gauth)
# image upload
f = drive.CreateFile({"title": "test.jpg",
"mimeType": "image/jpeg"})
f.SetContentFile("./test.jpg")
f.Upload()
##cronで実行する場合は?
cronが絶対パスを参照するため、相対パスでsetting.yamlを読み込んでいるPydrive.authがではこういうエラーがでる
Traceback (most recent call last):
File "/*****/image_uploader.py", line 17, in <module>
main()
File "/*****/image_uploader.py", line 7, in main
gauth.CommandLineAuth()
File "/*****/.local/lib/python2.7/site-packages/pydrive/auth.py", line 113, in _decorated
self.GetFlow()
File "/*****/.local/lib/python2.7/site-packages/pydrive/auth.py", line 443, in GetFlow
self.LoadClientConfig()
File "/*****/.local/lib/python2.7/site-packages/pydrive/auth.py", line 366, in LoadClientConfig
self.LoadClientConfigFile()
File "/*****/.local/lib/python2.7/site-packages/pydrive/auth.py", line 388, in LoadClientConfigFile
raise InvalidConfigError('Invalid client secrets file %s' % error)
pydrive.settings.InvalidConfigError: Invalid client secrets file ('Error opening file', 'client_secrets.json', 'No such file or directory', 2)
そこで解決策としてはこちらの記事がある。(英語の記事)
https://thomascrha.github.io/pydirve-automated-authentication.html
日本語訳の記事がないようなので、ついでに解決方法をここに記しておきたい。
##解決方法
settings.yamlのsave_credentials_fileにcredentials.jsonの場所を絶対パスで記入する
#settings.yaml
client_config:
#make sure these match the client_secrets.json
client_id: <クライアントID>
client_secret: <クライアントシークレット>
auth_uri: https://accounts.google.com/o/oauth2/auth
token_uri: https://accounts.google.com/o/oauth2/token
redirect_uri: http://localhost:8080/
save_credentials: True
save_credentials_backend: file
#save_credentials_fileにcredentials.jsonの場所を絶対パスで記入する
save_credentials_file: /abs/path/to/credentials.json
get_refresh_token: True
oauth_scope:
- https://www.googleapis.com/auth/drive
- https://www.googleapis.com/auth/drive.file
- https://www.googleapis.com/auth/drive.install
この後、ソースコードを以下のように変更する
#ソースコード
#https://gangannikki.hatenadiary.jp/entry/2019/09/14/233000から引用
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
def main():
#yamlの絶対パスを書く
SETTINGS = '/abs/path/to/settings.yaml'
# Google Drive
#GoogleAuthの引数にSETTINGSを入れる
gauth = GoogleAuth(SETTINGS)
gauth.LocalWebserverAuth()
drive = GoogleDrive(gauth)
# image upload
f = drive.CreateFile({"title": "test.jpg",
"mimeType": "image/jpeg"})
f.SetContentFile("abs/path//test.jpg")
f.Upload()
これで解決。皆様もよいラズパイライフを!