ContentfulのManagement APIのPython SDKを使って画像を登録する方法

今回はContentful Management APIのPython SDKを使ってアセット(画像など)を追加する方法を整理していきます。
2024.01.31

Contentful Management APIについて

Contentfulでは管理画面で行うような操作もAPI経由で行うことが可能です。

例えば、記事の投稿や画像コンテンツの追加など様々ことがAPIで操作できて便利です。

今回は画像コンテンツなどを扱うAssetの追加をPythonのContentful Management APIのSDKで行う方法を整理していきます。

インストール

Contentful Management APIのPython SDKはpipでインストールすることが可能です。

pip install contentful_management

スクリプトを書く前に

ContentfulのManagement APIを利用するにはAPIキーをクライアントに渡してあげる必要があります。

APIキーの設定

API_TOKEN = os.environ['CONTENTFUL_API_TOKEN']
SPACE_ID = os.environ['CONTENTFUL_SPACE_ID']
ENVIRONMENT_ID = os.environ['CONTENTFUL_ENVIRONMENT_ID']

client = CMClient(API_TOKEN)
env =  client.environments(SPACE_ID).find(ENVIRONMENT_ID)

ここではAPIキーを環境変数から取得し、Contentfulのスペースと環境を指定しています。

Assetの追加

Assetの追加は以下のように行います。 asset_idは文字列です。 file_attributesは辞書型です。(詳しくは後述)

Assetの追加

asset = env.assets().create(
    asset_id,
    file_attributes
)
asset.process()

ポイントはasset.process()の部分です。 Assetを追加しただけではContentfulでファイルが使えるようになるわけではありません。 processを行うことでContentful側で処理が走り、使用可能になります。

例えば、ファイルとして画像のURLを指定した場合、processを実行するまでは画像の取得が行われないといった感じです。

file_attributesについて

file_attributesの中身は以下のような構造になっています。 これはURLから画像を取得しContentfulに追加する場合です。

file_attributesの例

file_attributes = {
    "fields": {
        "title": {
            "en-US": "cat" # タイトル
    },
        "description": {
            "en-US": "cute cat" # 説明
        },
        "file": {
            "en-US": {
                "contentType": "image/jpeg", # MIMEタイプ
                "fileName": "cat.jpeg", # ファイル名
                "upload": "https://xxxxx.yyy/cat.jpg" # ファイルソース
            }
        },
    },
}

もちろんローカルファイルからアップロードすることも可能です。

ここではアップロードオブジェクトを作成し、それをfile_attributesに指定しています。

file_attributesの例(ローカルファイルをアップロードする場合)

with open('cat.jpg') as buffer:
    upload = env.uploads().create(buffer) # アップロードオブジェクトを作成
    file_attributes = {
        "fields": {
            "title": {
                "en-US": "cat" # タイトル
        },
            "description": {
                "en-US": "cute cat" # 説明
            },
            "file": {
                "en-US": {
                    "contentType": "image/jpeg", # MIMEタイプ
                    "fileName": "cat.jpeg", # ファイル名
                    "uploadFrom": upload.to_link().to_json() # ファイルソース
                }
            },
        },
    }

タグの指定

Assetにはタグを指定することも可能です。

Assetのタグは以下の以下の2通りの方法で設定可能です。

作成時に指定する方法

file_attributes_metadataを追加しそこでタグを指定することが可能です。

Asset作成時に指定する方法

file_attributes = {
    "fields": {
        # 中略
    },
    "_metadata": {
        "tags":  [{
            "sys": {
                "type": "Link",
                "linkType": "Tag",
                "id": "animal"
            }
        }]
    }
}

後から追加する方法

後から追加する場合はAssetオブジェクトのupdateメソッドを使用します。 ここでは更新したいプロパティのみの指定で大丈夫です。

Asset作成後に指定する方法

new_file_attributes = {
    "_metadata": {
        "tags":  [{
            "sys": {
                "type": "Link",
                "linkType": "Tag",
                "id": "animal"
            }
        }]
    }
}
asset.update(new_file_attributes)

終わりに

今回はContentfulのManagement APIのPython SDKを使ってアセットを追加する方法を整理しました。 タグの指定が個人的に少しハマりました。(アンダースコアからキーを始める必要がある点) ただ、簡単にファイルのアップロードができるので便利だと思います。