Contentfulで記事とコンテンツモデルのスナップショットを取得する

2022.05.23

Contentfulでは、記事の各公開バージョンを自動で保存してくれます。

ダッシュボードで各記事の右サイドバーから [VERSIONS] として確認できます。

contentful snapshot

また各バージョンと現行版との差分比較、変更点の切り戻しが可能です。

contentful snapshot

これらの過去のバージョンはスナップショットとして自動で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>')

参考記事