最近Twitterが話題になりました。

Twitterを巡って色々アプリケーションができましたが、その前、まずBlogをもっと勉強したいと思います。

Twitter のつぶやきを Blog に投稿するツールを PHP で書いた際の、API を利用して FC2 に Blog を作成することができます。
下記ソースはアップロードする部分のクラスです。この時、意外にカテゴリが設定できずに少し悩んだので参考になる人もいるのでは?と思い公開しました。ちなみにクラ スになっているので、当たり前ですが。クライアント部分を書かないとブログには投稿できません。

FC2 のブログは XML-RPC(← よく知らない) のインターフェースが公開されているので、それを利用してアップするという手順になります。私の家では動いているので、多分、PHP がインストールされていれば動くんだと思います。PHP のバージョンは 5.2.13 です。PHP には精通していないので、細かいところに問題はあるかもしれませんが、とりあえず動くと思います。


<?php

require("XML/RPC.php"); //XML-RPC package 読み込み
$GLOBALS['XML_RPC_defencoding'] = "UTF-8";

class XMLRPC_BlogUploader {
    var $m_Host;
    var $m_XML_RPC_path;
    var $m_Username;
    var $m_Password;
    var $m_Title;
    var $m_Contents;
    var $m_Category;
    var $m_Year;
    var $m_Month;
    var $m_Day;
    var $m_Hour;
    var $m_Minutes;
    var $m_Second;

    function SetHost($xml_rpc_path, $host) {
        $this->m_XML_RPC_path = $xml_rpc_path;
        $this->m_Host = $host;
    }

    function SetAccount($username, $password) {
        $this->m_Username = $username;
        $this->m_Password = $password;
    }

    function SetTitle($title) {
        $this->m_Title = $title;
    }

    function SetContents($contents) {
        $this->m_Contents = $contents;
    }

    function SetCategory($cotegory) {
        $this->m_Category = $cotegory;
    }

    function SetDate($year, $month, $day, $hour, $minutes, $second) {
        $this->m_Year = $year;
        $this->m_Month = $month;
        $this->m_Day = $day;
        $this->m_Hour = $hour;
        $this->m_Minutes = $minutes;
        $this->m_Second = $second;
    }

    function UploadBlog() {
        $client = new XML_RPC_client($this->m_XML_RPC_path, $this->m_Host, 80);

        // 記事を下書き状態で投稿
        $blog_id = new XML_RPC_Value(0, 'string');
        $username = new XML_RPC_Value($this->m_Username, 'string');
        $password = new XML_RPC_Value($this->m_Password, 'string');
        $date = sprintf("%04d%02d%02d\t%02d:%02d:%02d",
                $this->m_Year, $this->m_Month, $this->m_Day,
                $this->m_Hour, $this->m_Minutes, $this->m_Second);
        $data = array('title'=> new XML_RPC_Value($this->m_Title, 'string'),
                  'description'=> new XML_RPC_Value($this->m_Contents, 'string'),
                  'dateCreated'=> new XML_RPC_Value($date, 'dateTime.iso8601'));
        $contents = new XML_RPC_Value($data, 'struct');
        $publish = new XML_RPC_Value(1, 'boolean');
        $blog = array($blog_id, $username, $password, $contents, $publish);
        $message = new XML_RPC_Message('metaWeblog.newPost', $blog);
        $post_id = $this->sendMessage($client, $message);
        if (!$post_id || $post_id->faultCode() != 0) {
            return false;
        }
        // ブログのカテゴリ一覧を取得し、指定カテゴリの ID を検索
        $blog = array($blog_id, $username, $password);
        $message = new XML_RPC_Message('mt.getCategoryList', $blog);
        $category_list = $this->sendMessage($client, $message);
        if (!$category_list || $category_list->faultCode() != 0) {
            return false;
        }
        $categories = $category_list->value();
        for ($i = 0; i < $categories->arraysize(); $i++) {
            $category_pair = $categories->arraymem($i);
            $category_id = $category_pair->structmem("categoryId");
            $category_name = $category_pair->structmem("categoryName");
            if (strcmp($category_name->scalarval(), $this->m_Category) == 0) {
                // ブログのカテゴリを設定
                $category_set = array('categoryId'=> $category_id,
                            'isPrimary'=> new XML_RPC_Value(1, 'boolean'));
                $category = new XML_RPC_Value(array(new XML_RPC_Value($category_set, 'struct')), 'array');
                $blog = array($post_id->value(), $username, $password, $category);
                $message = new XML_RPC_Message('mt.setPostCategories', $blog);
                $retval = $this->sendMessage($client, $message);
                if (!$retval || $retval->faultCode() != 0) {
                    return false;
                }
                break;
            }
        }

        // ブログを公開
        $blog = array($post_id->value(), $username, $password);
        $message = new XML_RPC_Message('mt.publishPost', $blog);
        $retval = $this->sendMessage($client, $message);
        if (!$retval || $retval->faultCode() != 0) {
            return false;
        }
        return true;
    }

    function sendMessage($client, $message) {
        return $client->send($message);
    }

}

?>
<!--more-->

サンプルのクライアントプログラムも載せておきます。


&lt;?php
require_once("above_class_source.php");

$uploader = new XMLRPC_BlogUploader;
$uploader-&gt;SetHost("/xmlrpc.php", "<a href="http://blog.fc2.com/" target="_blank">blog.fc2.com</a>");
  $uploader-&gt;SetAccount("account","password");
$uploader-&gt;SetTitle("test");
$uploader-&gt;SetContents("test");
$uploader-&gt;SetDate(2010, 3, 5, 1, 0, 0);
$uploader-&gt;SetCategory("Twitter");
  if (!$uploader-&gt;UploadBlog()) {
    print "error!";
}
unset($uploader);
?&gt;
</blockquote>
このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをFC2ブックマークに追加このエントリをNifty Clipに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをChoixに追加このエントリをnewsingに追加