##1.概要
時間が空いたが続編。
自分がやりたいのは、G SuiteのGoogle hangout chatを用いて、画像とテキストが入ったcard形式のメッセージを定期投稿する事であり、その際Google hangout chatのcard形式に含まれた画像を、(1)Google Driveに保存して、(2)そのファイルを共有設定かけて、(3)Webで参照閲覧できるようにURLを取得するという一連の作業をGoogle DriveのAPIを使って実装できるかどうかを今回調べてみた。
※前回DropBoxに画像を投稿して共有設定してWebで参照閲覧できるようにしたが、今回はGoogle Driveで同じ処理が実装できるか確認。
##2.Google Drive上のファイルを閲覧参照する共有URLについて
こちらのページを参照。Google Drive上のファイルには、おのおのファイルIDが付与されており、直接URLを参照してブラウザで閲覧する場合、https://drive.google.com/uc?id=<ファイルID>
というURLで閲覧可能。
つまりGoogle Driveに画像ファイルをアップロードしてそのファイルのファイルIDを取得できれば、ブラウザ上で閲覧可能なURLを生成することが可能。
##3.Google Driveへの画像ファイルをアップロードして、アップしたファイルのファイルIDを取得する
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
def fn_upload(path ):
# 画像の挿入
image_mimetype = 'image/jpeg'
folder_id = '1234567890abcdefghijklmn' #root/hogehoge/image
f = drive.CreateFile({'title': path
, 'mimeType': image_mimetype
, 'parents': [{'kind': 'drive#fileLink', 'id':folder_id}]})
f.SetContentFile(path)
f.Upload()
image_url = 'https://drive.google.com/uc?id=' + str( f['id'] )
return image_url
・Google Driveへのファイルアップロード等は、ライブラリ「pydrive」を利用。
・設定等で留意するべきは、settings.yamlにclient_idとclient_secretを指定する必要がある点。GoogleのDevelopers ConsoleにてGoogle DriveのAPIを利用可能にして、認証の設定等をして付与されたclient_idとclient_secretをsettings.yamlに設定してあげれば、利用可能。
※詳細はこちらのページを参照
・上記スクリプトでは、ローカルの画像ファイルのpathを引数にしてGoogle Driveの任意のフォルダ(上記では「root/hogehoge/imageフォルダ」のfolder_id)を指定してファイルアップロードを実行している。
・ファイルアップロード先をroot以外のGoogle Driveの任意のフォルダを指定することも可能。
・folder_idはブラウザでGoogle Driveを開いて該当フォルダを開くと、URL文字列にフォルダIDが含まれているのでそこからIDが判明。
・アップロード後に戻り値としてアップロードした画像ファイルのGoogle Drive上のファイルIDを取得して、そのファイルIDをもとに閲覧用のURL文字列を生成。
##4.その他
・自分はローカルPCでanacondaを入れているので、pyDriveのインストールはpipコマンドではなくcondaコマンドでインストールした。 ※参考:https://anaconda.org/conda-forge/pydrive
・画像ファイルは、RDBのテーブルのデータをpandasのread_query()で取得してdataflameオブジェクトを生成、matpltlibでグラフを描画してファイル保存。複数のファイルを生成した上で、ファイル名を逐次指定して上記3.のfanctionを実行してGoogle Driveへの画像ファイルアップロードと閲覧用URLを取得。そのURLを引数を指定してGoogle Hangout chatにメッセージ投稿するという処理を実行(以下スクリプト例を参考)
from datetime import datetime, timedelta
#昨日の日付を取得
tdy =datetime.datetime.today()
ysdy = tdy - timedelta(days=1)
ysdy = ysdy.strftime("%Y-%m-%d")
#画像アップロードとメッセージ投稿
fn = 'test' + str(ysdy)
image_file_path = [fn + '_' + str(i)+ '.png' for i in range(1,7)]
url = [fn_upload(path)for path in image_file_path]
x = [fn_send_msg( i, j ,lst) for i, j in enumerate(url)]