LoginSignup
8
13

More than 5 years have passed since last update.

Google DriveのAPIを利用して画像ファイルをアップロードしてWebブラウザで参照できるよう共有URLを取得する

Last updated at Posted at 2019-04-16

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を取得する

test_upload.py
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にメッセージ投稿するという処理を実行(以下スクリプト例を参考)

hoge.py

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)]


8
13
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
8
13