Contentful APIとPythonを使って記事を一括登録する

2023.12.20

どうも、ベルリンオフィスの小西です。

ヘッドレスCMSのContentfulでは、大量の記事を投稿したい場合でも、APIを介して一括登録することが可能です。

本記事では、Pythonを利用して記事の一括登録を行う方法を紹介します。既にContentfulの基本的な使い方やAPIに慣れている方、Pythonの知識がある方を対象としています。

ContentfulからCMAトークンの取得

Contentful Management API(CMA)を使用するには、まずCMAトークンの取得が必要です。

Contentfulダッシュボードにログインし、画面右上 [Settings] から [CMA tokens] を選択します。

[Create personal access token] ボタンから新しいAPIキーを作成し、CMAトークンを入手します。最近のアップデートでCMAトークンの有効期限を設定できるようになったため、一度限りの利用もしくはテスト用途の場合は設定しておきましょう。

なお、発行したCMAトークンはSpaceではなくユーザー自身に紐づきます。他のユーザーが使うこともできますが、トークンの権限は発行したユーザーの持つ権限に準じたものになります。

発行したユーザーが記事の新規作成権限を持たない場合、この記事で紹介するコードはエラーを吐きますのでご注意ください。

Pythonコード

CMAトークンを手に入れたら、Pythonを用いてContentfulに記事を一括登録するためのコードを記述します。まず、contentful_managementライブラリをインストールします。

pip install contentful_management

次に、以下Pythonコードの例です。

import json
import time
from contentful_management import Client
from contentful_management.errors import NotFoundError, BadRequestError  # エラーハンドリングのために必要なエラータイプをインポート

# CMAトークンとSpace IDの設定
cma_token = 'YOUR_CMA_TOKEN'
space_id = 'YOUR_SPACE_ID'
space_env = 'YOUR_SPACE_ENVIRONMENT'
content_model = 'YOUR_CONTENT_MODEL'

def create_article_entry(client, title, content):
    try:
        entry_attributes = {
            'content_type_id': content_model,
            'fields': {
                'title': {
                    'en-US': title,
                },
                'content': {
                    'en-US': content,
                },
            },
        }
        entry = client.entries(space_id, space_env).create("", entry_attributes)
        print(f'Article "{title}" has been created with ID: {entry.id}')
    except BadRequestError as e:
        print(f'Error creating article "{title}": {e.message}')
    except NotFoundError as e:
        print(f'Error: {e.message}')

def bulk_create_articles(client, space_id, articles):
    for article_data in articles:
        title = article_data['title']
        content = article_data['content']
        create_article_entry(client, title, content)
        time.sleep(1)  # API負荷軽減を目的とした1秒のインターバル

def main():
    # Contentfulへの接続
    client = Client(cma_token)

    # 記事データが格納されたjsonファイルを読み込む
    with open('articles.json', 'r', encoding='utf-8') as file:
        articles = json.load(file)

    # 記事を一括で登録
    bulk_create_articles(client, space_id, articles)

if __name__ == "__main__":
    main()

上記はContentful Management APIを使って、指定したJSONファイル内の記事データをContentful上に一括登録するものです。

create_article_entry() では、指定された記事データをContentfulに登録し、エラーハンドリングとともにログを出力しています。

記事作成メソッド create() の第一引数はエントリーID(nullの場合Contentfulで自動採番)、第二引数はエントリーの詳細情報です。

entry = client.entries(space_id, space_env).create("", entry_attributes)

entry_attributes 内の fields の中身のフィールド、また en-US (= Locale)は各自のContentfulの定義や設定に合わせてください。

また bulk_create_articles() ではJSONファイル内の複数の記事を順次登録し、API側の負荷低減を目的に各登録処理後に1秒のインターバルが挿入されます。(PythonではAPIに1secのタイムアウトがあるため)

記事ソースとなるJSONファイルの準備

記事データはあらかじめJSONファイルに用意しておきましょう。

以下がその例です。先ほどのPythonコードと同じディレクトリの階層に置いておきます。

articles.json

[
    {
        "title": "タイトル1",
        "content": "本文1"
    },
    {
        "title": "タイトル2",
        "content": "本文2"
    },
    ...
]

上記例では各記事がタイトルと本文のフィールドを持つような想定ですが、各自の設定に合わせてください。

上記をJSONファイルとして保存します。

一括登録処理を実行してみる

準備が整ったら、先ほどのPythonスクリプトを実行してみます。

❯ python contentful-bulk-create.py
Article "タイトル1" has been created with ID: 5tCGjLqNdYgWwxOWXvYTL4
Article "タイトル2" has been created with ID: 3sKtmYUpQV4tnYUKX8B9AL

成功しました。コード内で指定されたContentfulのSpaceに記事が一括登録され、その結果が出力されていますね。

まとめ

以上、ContentfulへのAPIによる記事一括登録の方法でした。

WordPressなど他のCMSからContentfulへ記事移行が必要なケースでも、手作業の記事登録の手間を省きつつ、簡単かつ迅速に大量の記事を登録できるようになります。

クラスメソッドではContentfulの契約のご相談、構築支援をしています。ご興味のある方はぜひ弊社までお問い合わせください。

参考情報