Index > gdata-java-client で blogger への投稿,取得,更新 ( groovy )
Thu, November 26, 2009

gdata-java-client で blogger への投稿,取得,更新 ( groovy )

gdata-java-client を使えばJavaから簡単にBloggerを利用できる。

これを使って、 TwitterとBloggerを別々のツールではなく一つのツールから投稿・管理できるような ツールを作れないかと検討中。(当然Twitter のAPIも調べなければならないが)
とりあえず、Bloggerに gdata-java-client経由で基本的な処理(投稿・取得・更新) ができるかどうか試したのでメモ。

TOC

  1. 事前準備
  2. 共通コード
  3. create
  4. fetch
  5. update

その1 事前準備

※ 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動くのかな)

 Twitter
follow me on Twitter
 Categories