2015年7月20日月曜日

[MovableType] [Data API] [Perl] 画像タイプのカスタムフィールドを持つエントリーをData APIを使って投稿する


MovableTypeで画像タイプのカスタムフィールドを持つエントリー(記事)をData APIを使って投稿する方法について(しかもPerlで)

これを実現するには、
1.画像をData APIを使ってアップロードし、アイテム(Asset)に登録する
2.エントリーをData APIを使って投稿する際に、1で登録したアイテムを紐付けて登録する
という手順が必要です。

サンプルを見るのが一番わかりやすいと思いますので、次にコードを提示します。

(私的)ハマりポイントは次の通り。

1.画像をアップロードする場合にはX-MT-Authorizationでトークンを渡すだけでなく、Content-Type: multiple/form-dataも渡す必要がある。boundaryとか自力でやろうとするとこれは大変なので、HTTP::Request::CommonのPOSTメソッドを使いました。POSTメソッドにて、POST(url, Content_Type => 'form-data', ... );とすることでHTTP::Request::Commonがboundaryも含めたヘッダをよしなに処理してくれます。POSTメソッドへの引数がContent-Typeではなく、Content_Typeになっていることに要注意です。

2. 画像の実体の指定もHTTP::Request::CommonのPOSTメソッドを利用すれば、Contentパラメータ内で['ファイルのパス']とすることで処理してくれます。自力でファイルを開いたり(binmode指定して頑張ったりもして)、IO::Fileオブジェクト作って渡してみたり、色々やってみましたが、これらの方法はうまくいきません。

3.画像タイプのアセットを記事に紐付けて、編集画面にも埋め込んで表示するには、サンプルの通り、
 sprintf(qq{<form mt:asset-id='%d' class='mt-enclosure mt-enclosure-%s' style='display: inline'><a href="%s"><img src="%s"/ width="500"></a></form>}, $json->{id}, $json->{class}, $json->{url}, $json->{url})
というように、formタグの中にimgやaタグを組み込んだ値を指定します。style='display: inline;'というように';'を含んだ値を渡すとJSONモジュールがエラー吐いて死にますので、外します。formの他の属性はおまじないだと思ってください。

参考:
 MovableType Data API v2
 HTTP::Request::Common
 実装メモ:Movable Type 6の便利なData APIを利用して画像を出力する : アークウェブのブログ
 

0 件のコメント:

コメントを投稿