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

#cronを使ってラズパイからGoogleドライブに画像をアップしたい！
...だめです。

と言われてしまったので、その原因と解決方法について書いていく。

##通常は...?
[これとか](https://gangannikki.hatenadiary.jp/entry/2019/09/14/233000)、あと[これ](https://python.keicode.com/advanced/pydrive-upload-file.php)を読み進めていけば普通にGoogleDriveにアップロードできると思う。
以下、クレデンシャル情報の設定とソースコード


```python
#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
```



```python
#ソースコード
#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がではこういうエラーがでる

```python
  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の場所を絶対パスで記入する

```python
#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 
```
この後、ソースコードを以下のように変更する

```python
#ソースコード
#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()
```

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