SBI証券の保有資産データを毎日自動で取得してみる【その4】

前回は全く進まなかったので、引き続き今回も認証を進めていきます。

OAuth 2.0 クライアント IDもローカルPCで認証をやっていきたいと思います。こちらのサイトを参考にさせてもらいました。ありがとうございます。

ローカルPCで認証をすると出来るファイルcredentials.jsonとtoken.pickleをCloud Shellのmain.pyと同じフォルダにコピーします。どうやってコピーしようかと思いましたが、ドラッグ&ドロップであっさりコピーできました・・・。

これで、認証がうまくいきました。Google Driveに空のCSVファイルを作成するテストを行ってみたところ、これもうまくいきました。

しかし、DataFrameから出力したデータをCSVファイルとしてGoogle Driveにアップロードするという至極簡単にできそうな作業がうまくいきません。

Google Drive APIではfiles.createでGoogle Driveにファイルを作成するらしいのですがその際に、MediaFileUploadでアップロードするファイルのパスを指定します。

しかし、Cloud Functionsではファイルを保存することができないので、pandas.to_csvでCSVファイルを作成してそのパスを指定することはできません。

ということでpadas.to_csvメソッドでファイルではなく一旦文字列として出力して、ファイルの代わりにPythonの標準ライブラリio.BytesIOでMediaFileUploadに渡せば良いかと思ったのですがうまくいきません。

Google Driveを簡単に使うためのライブラリPyDriveを使った方法も試しましたがエラーが出てうまくいきません。PyDriveはGoogle Drive API V2にしか対応していないようですし、PyDriveが使っているライブラリoauth2clientも非推奨になっていたのでどっちにしろそのうち使えなくなりそうです。

MediaFileUploadがその名前の通り存在するファイルのパスを指定する方法にしか対応していないんでしょうか?Google Drive APIのリファレンスをみてもMediaFileUploadの詳細説明が見つからないので手詰まりになりました・・・。と思ったらこれでしょうか。

HTMLを手打ちしたようなデザインですが公式情報なんでしょうか。MediaInMemoryUploadというクラスもあるようです。名前からしてファイルじゃなくメモリ上のデータでもアップロードできそうです。この情報を参考にしてコードを書き換えてみます。

csv_data = df_marge.to_csv(index = False)
media = MediaInMemoryUpload(csv_data.encode(), mimetype='text/csv')

実行してみます。お!ようやくうまくいきました!

スクリーンショット 2020-12-19 4.03.23

かなり苦労しましたがようやく進みました。

今回はこの辺にしておきます。次回は、毎日に自動実行するように設定したいと思います。そのあとはLINEに通知も送るようにしてみたいと思います。






この記事が気に入ったらサポートをしてみませんか?