pie001's room

I'm a dragons fan,
and write about a program, movies, etc.

XML-RPC 使ってみた

2005-11-29 03:01:54 | パソコン
XML-RPC が公開されたとのことで、ちょっと使ってみました。


まず、XML-RPC が使える環境を整えることにしました。

言語は Java を使うことにしました。

ここから Apache XML-RPC をダウンロードして、xmlrpc-2.0.jar をクラスパスに追加。

で、ここを参考に簡単なテストプログラムを書いて実行してみると、、エラー。
メッセージは以下のとおり。
 Exception in thread "main" java.lang.NoClassDefFoundError:
 org/apache/commons/codec/DecoderException

デコーダーが無いのね。。ということで、ここから commons-codec-1.3.jar
ダウンロードしてクラスパスに追加。

でテストプログラムを実行してみると、、、成功!


環境が整ったところで、勢いに乗って goo ブログから記事を取得するプログラム
を書いてみました。

参考にしたのはこちら

実行すると、、日本語が文字化け。( ̄□ ̄;)!!
なんで、、テストプログラムでは日本語通ったのに。。。

レスポンスを調べたところ、テストプログラムでは日本語が
XML のエンティティで表現されているのに対し、
goo ブログは UTF-8 で返ってくるからだと判明。

XML を読み込むときに UTF-8 と指定できればよいのね。
けど、そんなパラメータないぞ。。
ぐぐってみたけど、解決には至らず。。

仕方ない、、ソースコードを改ざんするか、、と思い、ソースをのぞいた
ところ、ちゃんと文字コードを指定できる部分があることが判明。
static メンバを参照してるので、
 XmlRpc.setDefaultInputEncoding("UTF-8");
を早めに呼び出すことで、UTF-8 の XML を読み込めるように
なります。 (日本語表示できるようになります。)

実行結果がこちら↓。

 % java XMLRPCTest "pie001" "password"
 goo RSSリーダーで「ココだけの話」の更新に気づく方法
 DVD スターウォーズ・エピソード3
 Firefox インストール
 マイルール
 普天王関 復帰!

タイトルしか表示してませんが、記事の内容とかもちゃんと取得できて
ます。

サンプルソースコード XMLRPCTest.java はこちら↓。
// --- ここから ---
import java.util.Iterator;
import java.util.Vector;
import java.util.Hashtable;
import org.apache.xmlrpc.XmlRpc;
import org.apache.xmlrpc.XmlRpcClient;

public class XMLRPCTest {
    private static String getBlogid(XmlRpcClient client, String username, String password)
    throws Exception {
        Vector<String>  params = new Vector<String>();
        params.add("appkey");   // appkey は何でもよいらしい
        params.add(username);
        params.add(password);
        
        // ブログリストを取得
        Object  result = client.execute("blogger.getUsersBlogs", params);
        
        if (result instanceof Boolean) {    // ブログリストが取得できなかった場合、false が返る
            throw new Exception("can't get UsersBlogs");
        }
        
        // 1 件目のブログの blogid を返す
        return (String) ((Hashtable) ((Vector) result).get(0)).get("blogid");
    }
    
    public static void main(String[] args) throws Exception {
        String  username = null;    // gooID
        String  password = null;    // 投稿専用パスワード
        if (args.length > 1) {
            username = args[0];
            password = args[1];
        } else {
            System.err.println("usage: java XMLRPCTest username password");
            System.exit(-1);
        }
        
        XmlRpc.setDefaultInputEncoding("UTF-8");
        XmlRpcClient client = new XmlRpcClient("http://blog.goo.ne.jp/xmlrpc.php");
        
        // blogid を取得する。
        String  blogid = getBlogid(client, username, password);
        
        Vector<Object>  params = new Vector<Object>();
        params.add(blogid);
        params.add(username);
        params.add(password);
        params.add(new Integer(5)); // 5 件取得
        
        // 記事を取得する。
        Vector  result = (Vector) client.execute("metaWeblog.getRecentPosts", params);
        
        if (result.size() == 0) {   // 記事が取得できなかった場合
            throw new Exception("can't get RecentPosts");
        }
        
        Iterator    i = result.iterator();
        while (i.hasNext()) {   // 記事の数だけループ
            Hashtable   hash = (Hashtable) i.next();
            System.out.println((String) hash.get("title")); // タイトルを表示
        }
    }
}
// --- ここまで ---
コメント (0) | トラックバック (0) | この記事についてブログを書く |   | goo

コメント

コメントはありません。

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。
 ※ 
コメント利用規約に同意の上コメント投稿を行ってください。
※文字化け等の原因になりますので、顔文字の利用はお控えください。
下記数字4桁を入力し、投稿ボタンを押してください。この数字を読み取っていただくことで自動化されたプログラムによる投稿でないことを確認させていただいております。
数字4桁

トラックバック

この記事のトラックバック  Ping-URL
ブログ作成者から承認されるまでトラックバックは反映されません。