GoogleColab
を使ってGoogleDriveに保存されているデータをSPIRALのDBへアップロードするプログラムを作成してみました。
GoogleColabとはGoogleの環境上でPythonコードを実行出来るサービスなのですが、
GoogleColab上では他のGoogleサービスとの連携が簡単に出来ます。
今回はGoogleDriveのデータをSPIRALにアップロードするプログラムを作成してみました。
全体像
GoogleDriveをマウントし操作可能にした上で、
ナレッジサイト上に記載されているSPIRALのAPIを扱う共通モジュールを
Pythonで動く様にしたコードを使いファイルアップロードをします。
基本的にデータの流れはSPIRALのAPIに準じております。
1.ファイルアップロードトークンを生成
2.ファイルをアップロードしてファイルキーを取得
3.ファイルキーをレコード登録APIにパラメータとして渡しレコード登録
といった流れになっています。
DB設定
任意のDBを作成し、フィールドタイプでファイルを選択したフィールドを用意してください。
この際ファイルフィールドのIDとフィールド識別名を控えておいてください。
サンプルプログラム
import requests import os import time from google.colab import drive # Google Driveをマウント drive.mount('/content/drive') # 設定値 API_URL = "https://api.spiral-platform.com/v1" API_KEY = "" APP_ROLE = "" APP_ID = "" DB_ID = "" DATA_PATH = "/content/drive/My Drive/Images" # アップロードしたいファイルが格納されているGoogleDriveのパス FILE_TYPES = ['png'] # 対象のファイルタイプ REQUESTS_PER_MINUTE_LIMIT = 600 # リクエスト上限数 file_field_id = 1 # アップロードするファイルフィールドのID file_field_Name = "file" # アップロードするファイルフィールドの識別名 class CommonBase: _instance = None def __new__(cls): if cls._instance is None: cls._instance = super(CommonBase, cls).__new__(cls) return cls._instance def api_curl_action(self, method, add_url_pass, data=None, multi_part=None, json_decode=None): headers = { "Authorization": f"Bearer {API_KEY}", "X-Spiral-Api-Version": "1.1", } if multi_part: headers.update({multi_part: None}) else: headers["Content-Type"] = "application/json" if APP_ROLE: headers["X-Spiral-App-Role"] = APP_ROLE url = API_URL + add_url_pass if method in ["POST", "PATCH", "DELETE"]: if multi_part: response = requests.request(method, url, headers=headers, files=data) else: response = requests.request(method, url, headers=headers, json=data) else: response = requests.request(method, url, headers=headers) if json_decode: return response.text else: return response.json() common_base = CommonBase() # シングルトンインスタンス取得 processed_files = 0 start_time = time.time() for root, dirs, files in os.walk(DATA_PATH): for file_name in files: if file_name.lower().endswith('png'): file_path = os.path.join(root, file_name) file_data = open(file_path, "rb").read() # ファイルアップロード api_url_pass = f"/apps/{APP_ID}/dbs/{DB_ID}/{file_field_id}/files/uploadToken" api_response = common_base.api_curl_action("POST", api_url_pass) file_upload_token = api_response["fileUploadToken"] api_url_pass = f"/apps/{APP_ID}/dbs/{DB_ID}/{file_field_id}/files" files = { 'file': (file_name, file_data, 'application/octet-stream'), 'fileUploadToken': (None, file_upload_token) } api_response = common_base.api_curl_action("POST", api_url_pass, data=files, multi_part='multipart/form-data') file_key = api_response["fileKey"] # データ挿入 insert_data = { file_field_Name: [file_key] } api_response = common_base.api_curl_action("POST", f"/apps/{APP_ID}/dbs/{DB_ID}/records", data=insert_data) processed_files += 1 # リクエスト上限を超えないようにディレイ if processed_files % REQUESTS_PER_MINUTE_LIMIT == 0: time.sleep(60 - (time.time() - start_time)) start_time = time.time() print(f"Processed files: {processed_files}")
GoogleDriveのパスの確認方法
データをアップロードする時にアップロードしたいファイルのパスを確認する必要があります。
from google.colab import drive # Google Driveをマウント drive.mount('/content/drive')
サイドバーのファイル欄からディレクトリを確認することができます。
設定方法
GoogleColabへアクセスして新規ノートブックを作成してください。
作成したら上記サンプルプログラムをそのまま貼り付けてください。
後に、
'# 設定値 API_URL = "https://api.spiral-platform.com/v1" API_KEY = "" APP_ROLE = "" APP_ID = "" DB_ID = "" DATA_PATH = "/content/drive/My Drive/Images" # アップロードしたいファイルが格納されているGoogleDriveのパス FILE_TYPES = ['png'] # 対象のファイルタイプ REQUESTS_PER_MINUTE_LIMIT = 600 # リクエスト上限数 file_field_id = 1 # アップロードするファイルフィールドのID file_field_Name = "file" # アップロードするファイルフィールドの識別名'
こちらをお使いの環境に合わせて修正してください。
その他は変更せずに稼働いたします。
修正が終わったら、
左上にあります再生ボタンの様なボタンを押すとプログラムが実行され、
GoogleDrive上の指定したパスかつ指定したファイルタイプ(拡張子)のファイルがアップロードされます。
その他
GoogleColab上では他のGoogleサービスとの連携がかなり容易でAPI認証等必要ないので、
例えば他には容易にGmailのデータをSPIRALに格納することが出来ます。
GoogleサービスとSPIRALの連携には非常に良い環境なので、
GoogleサービスとSPIRALのデータ連携をする場合は是非GoogleColabの利用をご検討頂けると幸いです。
また、外部環境との連携ですのでデータの取扱には十分にご注意ください。