Data APIを使ってみる(その3)

Data APIでは、記事の投稿など、Movable Typeにデータを追加したりすることもできます。
ただ、公式ドキュメントではこのあたりの解説が薄いです。
正しい方法ではないかもしれませんが、こちらで動作した方法を紹介します。

1.Movable Typeへのログイン

データの追加など、データの変更を伴う処理を行うには、まずMovable Typeにログインする必要があります。
Webブラウザでログインする方法と、Webブラウザを使わずにログインする方法の2つがあります。

ここでは、Webブラウザを使わない方法を紹介します。
この場合のエンドポイントは、「http://your_host/path_to_mt/mt-data-api.cgi/v1/authentication」です(「your_host」と「path_to_mt」は、ご自分の環境に合わせて書き換えます)。
POSTプロトコルで通信し、リクエストボディに以下のデータを渡します。

名前
usernameログインするユーザー名
passwordログインするユーザーのパスワード
clientId任意の文字列

ログインに成功すると、レスポンスとしてJSONのデータが返されます。
そのJSONに「accessToken」というプロパティがあり、そこからアクセストークンを得ることができます。

2.データの操作

ログインした後は、各種のエンドポイントにアクセスすることで、Movable Typeのデータを操作することができます。
その際に、以下のようなリクエストヘッダーを付加する必要があります。

X-MT-Authorization: MTAuth accessToken=アクセストークンの値

3.事例

簡単な事例として、Movable Typeにログインして、IDが1番のブログに記事を投稿するプログラムを作ってみました。
言語は何でも良いですが、今回はPHPにしてみました。

2行目の「your_host」と「path_to_mt」は、Movable Type 6のインストール先に応じて書き換えます。
また、3行目の「foo」と4行目の「bar」は、ログインする際のユーザー名/パスワードに応じて書き換えます。

なお、このプログラムを実行するには、PHPのallow_url_fopenがオンになっている必要があります。

<?php
$cgi_url = 'http://your_host/path_to_mt/mt-data-api.cgi';
$username = 'foo';
$password = 'bar';

// authentication
$url = $cgi_url . '/v1/authentication';
$postdata = array(
  'username' => $username,
  'password' => $password,
  'clientId' => 'test',
);
$options = array('http' => 
  array(
    'method' => 'POST',
    'content' => http_build_query($postdata),
  )
);
@$contents = file_get_contents($url, false, stream_context_create($options));
if (!$contents) {
  // login error
  echo "Login error.\n";
  var_dump($http_response_header);
  exit();  
}
else {
  echo "Login OK.\n";
}

// get access token
$json = json_decode($contents);
$token = $json->accessToken;

// create entry
$url = $cgi_url . '/v1/sites/1/entries';
$postdata = array(
  'entry' => json_encode(array(
    'title' => 'test',
    'body' => 'test entry',
    'status' => 'Draft',
  )),
);
$options = array('http' =>
  array(
    'method' => 'POST',
    'header' => "X-MT-Authorization: MTAuth accessToken=" . $token . "\r\n",
    'content' => http_build_query($postdata),
  )
);
@$contents = file_get_contents($url, false, stream_context_create($options));
if (!$contents) {
  // create error
  echo "Create error.\n";
  var_dump($http_response_header);
}
else {
  echo "Created entry.\n";
}
?>

プログラムの大まかな内容は以下の通りです。

7~19行目

Movable Typeにログインします。
ユーザー名/パスワード/clientIdの情報をPOSTプトロコルで送信し、その結果を変数$contentsに得ます。

20~28行目

ログインに成功したかどうかを確認します。
失敗の場合は、HTTPのレスポンスヘッダーを出力して終了します。

31~32行目

ログイン成功時のレスポンスから、アクセストークンを取り出し、変数$tokenに代入します。

35~50行目

記事を投稿します。
タイトルが「test」、本文が「test entry」で、ステータスを下書きにしています(38~40行目)。
また、Movable Typeと通信する際には、「X-MT-Authorization: MTAuth accessToken=アクセストークンの値」のリクエストヘッダも付加しています。

51~58行目

記事の投稿に成功したかどうかを確認します。
失敗の場合は、レスポンスヘッダーを出力します。