Contentfulで記事とコンテンツモデルのスナップショットを取得する
Contentfulでは、記事の各公開バージョンを自動で保存してくれます。
ダッシュボードで各記事の右サイドバーから [VERSIONS] として確認できます。
また各バージョンと現行版との差分比較、変更点の切り戻しが可能です。
これらの過去のバージョンはスナップショットとして自動でContentfulに保存されており、APIを通じて取得することが可能です。
前準備
データの取得にはCMA(Content Management API = 最上位権限での操作が可能なAPI)を使います。
Contentfulのダッシュボードから発行します。
ヘッダー [Settings] > [API Keys] > [Content management tokens] > [Generate personal token]
また、今回はPythonで試してみるため、CMAを利用してデータを取得するのに必要なパッケージをインストールします。
pip install contentful_management
特定の記事の全てのスナップショットを取得
記事を指定し、全てのスナップショットを取得し、それらの中身を出力してみるPythonコードです。
from contentful_management import Client client = Client('<content_management_api_key>') snapshots = client.snapshots('<space_id>', '<environment_id>', '<entry_id>').all() for s in snapshots: print(vars(s))
CMAトークン、スペースID、エントリーIDを適宜差し替えてください。
返り値は下記のようになります(記事の本文まで取得できるため、省略してます)。
{'raw': {'sys': {'type': 'Snapshot', 'snapshotType': 'publish', 'snapshotEntityType': 'Entry', 'id': '7e9aF7Ee9eTdID7uqxYrmk', 'createdAt': '2022-05-22T14:40:18.533Z', 'createdBy': {'sys': {'type': 'Link', 'linkType': 'User', 'id': '2niCfOa1h1r23chkRF944v'}}, 'updatedAt': '2022-05-22T14:40:18.533Z', 'updatedBy': {'sys': {'type': 'Link', 'linkType': 'User', 'id': '2niCfOa1h1r23chkRF944v'}}, 'space': {'sys': {'type': 'Link', 'linkType': 'Space', 'id': '6uruyt1jyovt'}}, 'environment': {'sys': {'id': 'master', 'type': 'Link', 'linkType': 'Environment'}}}, 'snapshot': {'sys': {'id': '3gXJ00Qserp9n0FhVSTin1', 'type': 'Entry', 'createdAt': '2021-02-16T15:56:04.245Z', 'createdBy': {'sys': {'type': 'Link', 'linkType': 'User', 'id': '2niCfOa1h1r23chkRF944v'}}, 'space': ... (略)
特定の記事の全てのスナップショットを取得
スナップショットIDを指定することで単一のスナップショットを取得できます。
from contentful_management import Client client = Client('<content_management_api_key>') snapshot = client.snapshots('<space_id>', '<environment_id>', '<entry_id>').find('<snapshot_id>') print(vars(snapshot))
返り値
{'raw': {'sys': {'type': 'Snapshot', 'snapshotType': 'publish', 'snapshotEntityType': 'Entry', 'id': '7e9aF7Ee9eTdID7uqxYrmk', 'createdAt': '2022-05-22T14:40:18.533Z', 'createdBy': {'sys': {'type': 'Link', 'linkType': 'User', 'id': '2niCfOa1h1r23chkRF944v'}}, 'updatedAt': '2022-05-22T14:40:18.533Z', 'updatedBy': {'sys': {'type': 'Link', 'linkType': 'User', 'id': '2niCfOa1h1r23chkRF944v'}}, 'space': {'sys': {'type': 'Link', 'linkType': 'Space', 'id': '6uruyt1jyovt'}}, 'environment': {'sys': {'id': 'master', 'type': 'Link', 'linkType': 'Environment'}}}, 'snapshot': {'sys': {'id': '3gXJ00Qserp9n0FhVSTin1', 'type': 'Entry', 'createdAt': '2021-02-16T15:56:04.245Z', 'createdBy': {'sys': {'type': 'Link', 'linkType': 'User', 'id': '2niCfOa1h1r23chkRF944v'}}, 'space': ... (略)
コンテンツモデルのスナップショット
また、記事(エントリー)だけではなく、コンテンツモデルのスナップショットも取得可能です。
from contentful_management import Client client = Client('<content_management_api_key>') content_type_snapshots = client.content_type_snapshots('<space_id>', '<environment_id>', '<content_type_id>').all()
from contentful_management import Client client = Client('<content_management_api_key>') content_type_snapshot = client.content_type_snapshots('<space_id>', '<environment_id>', '<content_type_id>').find('<snapshot_id>')