ブログへの記事投稿を自動化してみたいと思い、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:
- Newer: 形態素解析ライブラリ:lucene-gosenを使ってみました。
- Older: 「プログラマが知るべき97のこと」を読み始めた。
Comments:0
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
