開発情報・ナレッジ

投稿者: ShiningStar株式会社 2024年6月7日 (金)

GoogleColab上でGoogleドライブのファイルをSPIRALのDBにアップロードしてみた

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

こちらのGoogleDriveをマウントする記述のみをコードブロックに貼り付けて実行する事で、
サイドバーのファイル欄からディレクトリを確認することができます。

設定方法

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の利用をご検討頂けると幸いです。
また、外部環境との連携ですのでデータの取扱には十分にご注意ください。

解決しない場合はこちら コンテンツに関しての
要望はこちら