gdata-java-client で blogger への投稿,取得,更新 ( groovy )
gdata-java-client を使えばJavaから簡単にBloggerを利用できる。
これを使って、
TwitterとBloggerを別々のツールではなく一つのツールから投稿・管理できるような
ツールを作れないかと検討中。(当然Twitter のAPIも調べなければならないが)
とりあえず、Bloggerに gdata-java-client経由で基本的な処理(投稿・取得・更新)
ができるかどうか試したのでメモ。
TOC
その1 事前準備
- http://code.google.com/p/gdata-java-client/ にアクセスして 2つのzip(gdata-samples.java-1.39.1.zip , gdata-src.java-1.39.1.zip )を入手
- これらを展開して、以下の5つの jar を 作業ディレクトリにコピー(※)
- gdata-base-1.0.jar
- gdata-blogger-2.0.jar
- gdata-blogger-meta-2.0.jar
- gdata-core-1.0.jar
- google-collect-1.0-rc1.jar
※ google-collect-1.0-rc1.jarだけが gdata-samples.java-1.39.1.zip に含まれている点に注意
その2 共通で使用するコードをまとめる
いまからテスト用に作成する create.groovy, fetch.groovy, update.groovy の3つのクラスで共通して使用するコードをまとめた MyUtils.groovy を用意。
import com.google.gdata.client.*
import com.google.gdata.data.*
import com.google.gdata.util.ServiceException
class MyUtils {
static def SCHEME="http://www.blogger.com/atom/ns#";
static def createCategory(def label){
def c=new Category()
c.setScheme(SCHEME)
c.setTerm(label)
return c
}
static def METAFEED_URL = "http://www.blogger.com/feeds/default/blogs";
static def getFeedUrl(){
def feedUrl = new URL(METAFEED_URL);
return feedUrl
}
static def getBlogId(GoogleService myService) throws ServiceException, IOException {
Feed resultFeed = myService.getFeed(getFeedUrl(), Feed.class);
if (resultFeed.getEntries().size() > 0) {
Entry entry = resultFeed.getEntries().get(0);
return entry.getId().split("blog-")[1];
}
throw new IOException("User has no blogs!");
}
static def getGoogleService(def userName,def userPassword) throws ServiceException{
def s = new GoogleService("blogger","blogger-store");
s.setUserCredentials(userName, userPassword);
return s
}
}
Bloggerでは一つのアカウントで複数のブログを管理できます。 もし、一つのアカウントで複数のブログを使用している場合、 getBlogId() メソッドに注意してください。
ここで示しているコードは、最初のブログIdを取得しています。 処理対象とするブログが2番目にある場合は、コードを変更する必要があります。
その3 create.groovy
新規エントリーを投稿するクライアント。
import com.google.gdata.client.*
import com.google.gdata.data.*
import com.google.gdata.util.ServiceException
def FEED_URI_BASE = "http://www.blogger.com/feeds";
def POSTS_FEED_URI_SUFFIX = "/posts/default";
def USER = '' //Googleアカウントのユーザ名を設定
def PASS = '' //Googleアカウントのパスワードを設定
def title = new PlainTextConstruct('test')
def body = new PlainTextConstruct('This is a first entry.')
def e = new Entry()
e.setTitle( title )
e.setContent( body )
e.getCategories().add( MyUtils.createCategory('groovy') )
e.getAuthors().add( new Person(USER,null,USER) )
e.setDraft(true)
def s = MyUtils.getGoogleService(USER,PASS)
def feedUri = FEED_URI_BASE + "/" + MyUtils.getBlogId(s);
def postUrl = new URL(feedUri + POSTS_FEED_URI_SUFFIX);
def entry = s.insert(postUrl, e);
println entry.getEditLink().getHref()
USER,PASS の部分は適切な値を設定します。(Googleアカウントを指定)
最後の行で、新規投稿したエントリーのURLを標準出力しています。
この値(URL)は、エントリーの取得や更新のハンドルとして使います。
println entry.getEditLink().getHref()
たとえば以下のようなURLが出力されます
http://www.blogger.com/feeds/1847252719964105862/posts/default/8223743646041267081
実行
$ export CLASSPATH=gdata-base-1.0.jar:google-collect-1.0-rc1.jar:gdata-core-1.0.jar:gdata-blogger-2.0.jar:gdata-blogger-meta-2.0.jar; groovy create
その4 fetch.groovy
その3で投稿したエントリーを取得して標準出力します。
import com.google.gdata.data.blogger.BlogEntry
import com.google.gdata.client.*
import com.google.gdata.data.*
import com.google.gdata.util.ServiceException
import com.google.api.gbase.client.FeedURLFactory
def USER = '' //Googleアカウントのユーザ名を設定
def PASS = '' //Googleアカウントのパスワードを設定
def url = '' // create.groovy を実行したときに標準出力されたURLを設定
def entryUrl = new URL( url )
def s = MyUtils.getGoogleService(USER,PASS)
def entry = s.getEntry(entryUrl,BlogEntry.class)
println entry.class.name
println entry.getTitle().getPlainText()
println entry.getTextContent().getContent().getPlainText()
変数urlにはその3 で標準出力されたURLを設定しておく必要があります。
実行
$ export CLASSPATH=gdata-base-1.0.jar:google-collect-1.0-rc1.jar:gdata-core-1.0.jar:gdata-blogger-2.0.jar:gdata-blogger-meta-2.0.jar; groovy fetch
test
This is a first entry.
その5 update.groovy
その3で投稿したエントリーを取得した上で値を変更して、更新します。
import com.google.gdata.data.blogger.BlogEntry
import com.google.gdata.client.*
import com.google.gdata.data.*
import com.google.gdata.util.ServiceException
import com.google.api.gbase.client.FeedURLFactory
def USER = '' //Googleアカウントのユーザ名を設定
def PASS = '' //Googleアカウントのパスワードを設定
def url = '' // create.groovy を実行したときに標準出力されたURLを設定
def entryUrl = new URL( url )
def s = MyUtils.getGoogleService(USER,PASS)
def entry = s.getEntry(entryUrl,BlogEntry.class)
println entry.class.name
println entry.getTitle().getPlainText()
println entry.getTextContent().getContent().getPlainText()
def text = entry.getTextContent().getContent().getPlainText()
def body = new PlainTextConstruct(text + ' test')
entry.setContent( body )
s.update( entryUrl, entry )
その4 と同様に 変数urlにはその3 で標準出力されたURLを設定しておく必要があります。
実行
$ export CLASSPATH=gdata-base-1.0.jar:google-collect-1.0-rc1.jar:gdata-core-1.0.jar:gdata-blogger-2.0.jar:gdata-blogger-meta-2.0.jar; groovy update
投稿ハブとして機能するツールをどう実装するか
Twitter APIとgdata APIを使えば、一カ所でtweetとblog両方投稿できるツールができる。 問題はそれをどこに置くかだ。 当初は、google app engine 上に設置しておこうと考えていた。 これなら、クライアントはブラウザさえあればいいことになるので、 iPhoneやPCから投稿できる。
しかし、google app engine の場合、認証が二重になるのが面倒だ。(GAEとBloggerの2つ) 自分しか使わないとすれば、app engine のデータストアに パスワードを保存してしまえばいいのかもしれない。 (現にMovaTwitterなどはそうしているわけだし)
一方JavaとかGroovyで実装してデスクトップアプリとしてしまうと、PCからしか使えない。 どこでもメモできる体制をつくるという意味で大きく後退してしまう。 とくにiPhoneはJavaが動かないから。 となるとやはりAndroidか。(Androidでgdata-java-client動くのかな)
