Movable Type 6のData APIでターミナルからブログを更新する
先日ブログディナーでSix Apartのブログ神@hirataさんにお会いした時に、僕がTypePadからMovable Typeに移行して、唯一不満なのが投稿画面が使いづらくなったという話をして、たくさん要望をインプットさせていただいたのですが、その時にMT6ならData API使えば簡単に俺投稿画面作れるよって話をされていたので、ちょっと実験した結果を自分のためにメモしておきます。
Data APIとは
Data APIとはMT6から搭載された新機能で、ざっくり言えばRESTとJSONで簡単に使えるAPI群です。詳しくは本家参照
JavaScirptとかで簡単にMT機能を拡張したり、独自に書き換えたりすることを想定されてると思うのですが、とりあえずお試しってことで今回はcurlを使ってブログの投稿をしてみました。
投稿の流れ
エントリー一覧を取得するようなGETでRESTなAPIの利用はほんとうに簡単で、OS Xならターミナルを開いて
$ curl http://<MTのURL>/cgi-bin/mt-data-api.cgi/v1/sites/2/entries
と叩くだけでエントリー一覧が取得できます。
ただ、投稿となるとさすがに認証が必要なので、ターミナルからエントリー投稿するには二段階のステップが必要です。
- authentication APIでaccessTokenを取得
- insert APIでエントリーを投稿
ポイントは1で取得したaccessTokenを2に受け渡すところくらいです。
認証
認証はauthentication APIにusername, password, remember, clientIdの4つのパラメータを渡してPOSTすると取得できます。curlからアクセスする場合はclientIdも必須なので気をつけてください。
$ curl -d username=<MTのuser名> -d password=<MTのパスワード> -d remember= -d clientId=curl http://<MTのURL>/cgi-bin/mt-data-api.cgi/v1/authentication
みたいな感じでcurlコマンドを実行すると
{"accessToken":"<自分のaccessToken>","sessionId":"<自分のsessionId>","expiresIn":3600,"remember":false}
みたいな感じで<自分のaccessToken>の部分に40文字の文字列が表示されるので、この文字列を保存しておきます。
投稿
accessTokenさえ取れれば投稿も超簡単。今回は最低限title, body, moreだけをインプットして投稿してみました。
$ curl -H "X-MT-Authorization: MTAuth accessToken=<自分のaccessToken>" -d entry="{\"title\":\"<タイトル>\", \"body\":\"<本文>\", \"more\":\"<追記>\"}" http://<MTのURL>/cgi-bin/mt-data-api.cgi/v1/sites/2/entries
ポイントは-HにX-MT-Authorizationとして先に取得したaccessToken情報を貼り付けることと、実際のentry内容のJSONはダブルクオーテーション使ってきっちりエスケープすることくらいです。(シングルクォーテーションとミックスしてエスケープ端折ろうとしたら上手く行かなかった)
上手く行けば
{"excerpt":"test...","status":"Publish","date":"2013-12-15T11:25:30\u002b09:00","updatable":true,"author":{"userpicUrl":null,"id":"1","displayName":"drikin"},"allowComments":false,"comments":[],"permalink":"http://<MTのURL>/2013/12/hoge.html","keywords":"","body":"test","allowTrackbacks":false,"id":1631,"trackbacks":[],"modifiedDate":"2013-12-15T11:25:30\u002b09:00","trackbackCount":0,"categories":[],"blog":{"id":"2"},"commentCount":0,"tags":[],"basename":"hoge","assets":[],"pingsSentUrl":[],"title":"hoge","class":"entry","createdDate":"2013-12-15T11:25:30\u002b09:00","more":"moremore","customFields":[]}
みたいな結果がかえってきます。この例だとstatusを指定してないので、ほんとに↑の実行一発で新規エントリーが追加されて公開されます。
まとめ
ってことで、結果的にコマンド2発でエントリー投稿が完了してしまいました。
いやぁ楽だ。実際にはJavaScriptのライブラリとかも提供されてるみたいで、直接URLを叩くよりライブラリー経由で使うのが正しいんでしょうけど、こんだけ簡単ならTweet並に気軽にブログ投稿するクライアントとか作りたくなりますねw
とりあえずMTの投稿画面でタイトルと本文と追記を別々のフォームに入力して更新するってのが手間で手間で仕方ないので、\Drift Writer\から勝手に一行目をタイトル、特定の位置からを追記と認識して投稿機能とか付けたら画期的にブログ更新が楽になりそうと妄想中。