1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

cronを使ってラズパイのPydriveを使って画像をGoogleドライブにアップロードする際に必要な設定

Last updated at Posted at 2020-08-13

#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()

これで解決。皆様もよいラズパイライフを!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?