Home > Java | Web > Apache XML-RPCを使った、サンプルプログラムを書いてみました。

Apache XML-RPCを使った、サンプルプログラムを書いてみました。

  • 2012-01-22 (日) 3:36
  • Java | Web

ブログへの記事投稿を自動化してみたいと思い、XML-RPCについて調べてみました。
また、Apache XML-RPCライブラリを使用して、JavaでXML-RPC APIを使用したサンプルプログラムを書いてみました。

XML-RPCについて

 XML-RPCの詳細はWikipediaを参照。
 HTTP経由でXMLをやりとりして、リモートプロシージャコールできる?ということで、XML-RPCに対応したブログなら、XML-RPC APIを使って記事を投稿したり、編集、削除できるようです。
 とりあえず、Wordpressでの対応方法、XML-RPCが利用できる主なブログサービスを調べました。

 また、XML-RPC APIについても参考になりそうな記事を調べました。

Apache XML-RPCについて

 JavaでXML-RPCを扱うライブラリとして、Apache XML-RPCがあります。
 公式サイトからApache XML-RPCをダウンロードし、Commons Codecから依存ライブラリのCommons-Codec.jarをダウンロードしました。

サンプルコード

 とりあえず、ブログ投稿用のクラスとして、以下のようなコードを書いてみました。
 FC2に新規ブログを開設してテストしてみた結果、あっさりとXML-RPCで記事を投稿できました。
 記事投稿はできたのですが、カテゴリーはうまく設定できなかったので、もう少し調べてみる必要がありそうです。
 GAE/JやHerokuのcronと組み合わせたら、1日単位でデータを自動生成して自動投稿するとか、色々できそうです。
 

package net.termat.xmlrpc;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;

public class XMLRPCBlogPost {
	private Map<Object,Object> hash;
	private XmlRpcClient client;
	private Object[] params;

	public XMLRPCBlogPost(String url,String blogid,String username,String password)
 		throws MalformedURLException{
		hash = new HashMap<Object,Object>();
		XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
		config.setServerURL(new URL(url));
		client = new XmlRpcClient();
		client.setConfig(config);
		params = new Object[5];
		params[0] = blogid;
		params[1] = username;
		params[2] = password;
		params[3] = hash;
		params[4] = true;
	}

	/**
	 *
	 * @param title タイトル
	 */
	public void setTitle(String title){
		hash.put("title", "タイトルです");
	}

	/**
	 *
	 * @param desc 本文
	 */
	public void setDescription(String desc){
		hash.put("description", desc);
	}

	/**
	 *
	 * @param more 本文
	 */
	public void setMoreText(String more){
		hash.put("mt_text_more", more);
	}

	/**
	 *
	 * 投稿内容を消去
	 */
	public void clear(){
		hash.clear();
	}

	private Map<String,String> getCategory() throws XmlRpcException{
		Object[] results = (Object[])client.execute("mt.getCategoryList", params);
		Map<String,String> ret=new HashMap<String,String>();
		for(Object result : results){
			if(result instanceof HashMap<?,?>){
				@SuppressWarnings("unchecked")
				HashMap<String,String> hash= (HashMap<String,String>)result;
				ret.put(hash.get("categoryName"), hash.get("categoryId"));
			}
		}
		return ret;
	}

	public List<String> getSupportedMethods() throws XmlRpcException{
		Object[] results = (Object[])client.execute("mt.supportedMethods", params);
		List<String> ret=new ArrayList<String>();
		for(Object result : results){
			ret.add(result.toString());
		}
		return ret;
	}

	/**
	 *  カテゴリーを設定する
	 *
	 * @param id
	 * @param categoryName
	 * @return
	 * @throws XmlRpcException
	 */
	public boolean setCategory(int id,String categoryName)throws XmlRpcException{
		Map<String,String> categories=getCategory();
		String cid=categories.get(categoryName);
		if(cid!=null){
			Map<Object,Object> map=new HashMap<Object,Object>();
			map.put("categoryId", Integer.parseInt(cid));
			map.put("isPrimary", true);
			Object[] tmp=new Object[5];
			tmp[0] = id;
			tmp[1] = params[1];
			tmp[2] = params[2];
			tmp[3] = map;
			tmp[4] = true;
			Object result = client.execute("mt.setPostCategories", tmp);
			if(result instanceof Boolean){
				return ((Boolean)result).booleanValue();
			}else{
				return false;
			}
		}else{
			return false;
		}
	}

	/**
	 * 投稿をポストする
	 *
	 * @return
	 * @throws XmlRpcException
	 */
	public int post() throws XmlRpcException {
		hash.put("dateCreated", new Date(System.currentTimeMillis()));
		hash.put("mt_convert_breaks", true);
		hash.put("mt_allow_comments", true);
		hash.put("mt_allow_pings", true);
		Object result = client.execute("metaWeblog.newPost", params);
		if(result instanceof Number){
			return ((Number)result).intValue();
		}else{
			return -1;
		}
	}

	public static void main(String[] args){
		try{
			XMLRPCBlogPost rpc=new XMLRPCBlogPost(
				"エンドポイント",
				"bid",
				"username",
				"password");
			rpc.setTitle("タイトル");
			rpc.setDescription("本文1");
			rpc.setMoreText("本文2");
			int id=rpc.post();
			rpc.setCategory(id, "カテゴリ");
			System.out.println(id);
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

Related posts:

  1. Apache Pivot
  2. GAEでbit.lyの短縮URLサービスを利用してみた。
  3. CSVFileReader
  4. ZipIO
  5. selenium2.0のWebDriver APIを試してみました。

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://termat.sakura.ne.jp/java/apache-xml-rpc%e3%82%92%e4%bd%bf%e3%81%a3%e3%81%9f%e3%80%81%e3%82%b5%e3%83%b3%e3%83%97%e3%83%ab%e3%83%97%e3%83%ad%e3%82%b0%e3%83%a9%e3%83%a0%e3%82%92%e6%9b%b8%e3%81%84%e3%81%a6%e3%81%bf%e3%81%be/trackback/?_wpnonce=800c13c3e0
Listed below are links to weblogs that reference
Apache XML-RPCを使った、サンプルプログラムを書いてみました。 from TM's Workspace

Home > Java | Web > Apache XML-RPCを使った、サンプルプログラムを書いてみました。

Google Analyticator

173
Unique
Visitors
Powered By Google Analytics

Return to page top