Home > Movable Type > | Programming > XML RPCを使ってMovable Typeのエントリをポスト

XML RPCを使ってMovable Typeのエントリをポスト

Quixotic PixelsのPhotoBlogテンプレがいまいち投稿が面倒というのは一つ前のエントリで述べました

というわけで,今回は以下の作業をおこなうスクリプトをXML RPCを利用したPHPで書く事にしました.


  • GDを利用してイメージを縮小し,サムネイルも作る.ファイル名は日付ベースにしてユニークなものにする
  • タイトルと本文はフォームから入力してもらい,Extendedで入力すべきファイルURIのプリフィクスは自動入力にする
  • 当然,カテゴリなども選べるようにする

一つ目のGDに関してはこれまでもソースを書いた事があったので,見当はついてました.問題はXML RPCを使ってポストする部分ですが,これも至って簡単でした.なお,今回はsunouchiさんのサイトであるdrifting blog by snotchの記事を参考にさせていただきました.ありがとうございます.

XML RPCをPHPで扱うためのライブラリはいくらかあるようですが,今回はPEARが用意しているものを使う事にしました.

さて,Movable Typeが用意するXML RPCインターフェースを眺めると,今回関係ありそうなのは


あたりでしょう.どうやら記事を投稿する際に一緒にカテゴリを送信する,という事はできないようなので,カテゴリ付きで記事を投稿する場合には

  • まずはBlogからカテゴリをとってくる
  • 次に,投稿状態を「下書き」としてmetaWeblog.newPostを叩く
  • metaWeblog.newPostの返り値である記事IDを使ってmt.setPostCategoriesを叩く
  • んで,同じく記事IDを使ってmt.publishPostを叩く

という手順を踏む事になりそうです.

ま,そんなことを勘案して,ちょろっと書いてみたコードの断片がこちらです.エラー処理はほとんどやってませんが,雰囲気は掴めるかも.PHP初心者なので,コードがダメダメかもしれません.そんときは突っ込んでくださいませ.
あ,そうそう.とりあえずこれはPrimary Categoryしか設定できませんのであしからず^^;
こんなんでも参考になれば幸いです.


<?php
include_once('config.php');
require_once(
"XML/RPC.php");
$GLOBALS['XML_RPC_defencoding'] = "UTF-8";


class
XMLComm{
    var
$client;
    var
$appkey;
    var
$username;
    var
$passwd;
    var
$blogid;
    var
$publish;
    
    var
$content;
    
    function
XMLComm(){
        
$this->client = new XML_RPC_client(MT_XMLRPC_PATH, MT_HOST, 80);
        
        
$this->appkey = new XML_RPC_Value('', 'string');
        
$this->username = new XML_RPC_Value(MT_USER, 'string');
        
$this->passwd = new XML_RPC_Value(PASSWD, 'string');
        
        
$this->blogid = new XML_RPC_Value(BLOGID, 'string');
        
$this->publish = new XML_RPC_Value(0, 'boolean');
        
    }
    
    function
getCategories(){
        
$message = new XML_RPC_Message(
            
'mt.getCategoryList',
            array(
$this->blogid, $this->username, $this->passwd));
            
        
$result = $this->client->send($message);
        
        return
XML_RPC_decode( $result->value() );
    }
    
    function
postEntry($title, $description, $extend, $category){
        
        
$tmptitle = new XML_RPC_Value($title, 'string');
        
$tmpdesc = new XML_RPC_Value($description, 'string');
        
$tmpextend = new XML_RPC_Value($extend, 'string');
        
        
$this->content = new XML_RPC_Value(array(
            
"title"=>$tmptitle,
            
"description"=>$tmpdesc,
            
"mt_text_more"=>$tmpextend), 'struct');
        
        
$message = new XML_RPC_Message(
            
'metaWeblog.newPost',
            array(
$this->blogid, $this->username, $this->passwd, $this->content, $this->publish));
        
        
$postid = $this->client->send($message);
        
        
$categstruct = new XML_RPC_Value(array("categoryId" => new XML_RPC_Value($category, 'string'), "isPrimary" => new XML_RPC_Value(1, 'boolean')), 'struct');
        
$categ = new XML_RPC_Value(array($categstruct), 'array');
        if(
$postid ){
            

            if (
$category != ""){
                
$message = new XML_RPC_Message(
                    
'mt.setPostCategories',
                    array(
$postid->value(), $this->username, $this->passwd, $categ));
            
                
$result = $this->client->send($message);
            }
            

            
$message = new XML_RPC_Message(
                
'mt.publishPost',
                array(
$postid->value(), $this->username, $this->passwd)
            );
            
            
$result = $this->client->send($message);
            
            
            return
$result;
        }
        
        return
false;
    }
    
}

?>

Comments:0

Comment Form

Trackbacks:1

TrackBack URL for this entry
http://blog.hiroaki.jp/mt/mt-tb.cgi/241
Listed below are links to weblogs that reference
XML RPCを使ってMovable Typeのエントリをポスト from Hirolog
Movable Type 3.3でXML-RPC APIの仕様が変わってた… from Hirolog 2006-08-19 (土) 04:19
以前XML RPCを使ってMovable Typeのエントリをポストという題で記...

Home > Movable Type > | Programming > XML RPCを使ってMovable Typeのエントリをポスト

Search
Feeds

Return to page top