倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

まとめツイート・スクリプト

最近、何故かはてなダイアリーがツイートをまとめてくれないので、まとめ記事を生成する Groovy スクリプト書いてみました。 Powered by Twitter4J。 ローカル・ファイルに書き出すので、ダイアリーには自分で投稿しないといけませんが・・・

@Grab('org.twitter4j:twitter4j-core:[2.2.4,)')

import twitter4j.*

def date = new Date().previous().format('yyyy/MM/dd')    // デフォルトは昨日
//date = '2011/10/13'    // 日付入力

if(args.size() > 0) date = args[0]    // 引数があるならそちらを使う
def targetDate = Date.parse('yyyy/MM/dd', date)

def content = generate(targetDate)
output(targetDate, content)

/** 記事内容を生成 */
def String generate(Date date){
    def dateString = date.format('yyyy年MM月dd日').replace('年0', '年').replace('月0', '月')
    println "********** ${dateString}のツイート **********"
    def content = '' << "*t*[twitter]${dateString}のツイート\n><div class=\"twitter-tweet-wrapper\">"

    def start = date
    def end = start.next()

    def twitter = new TwitterFactory().getInstance()
    boolean goNext = true
    int i = 1

    while(goNext){
        twitter.getUserTimeline(new Paging(i, 40)).each{ status ->
            if(status.createdAt < start){
                goNext = false

            }else if(status.createdAt < end){
                // 確認のため、標準出力へも書き出す
                def abst = status.text.size() > 20 ? status.text.substring(0, 20) : status.text
                println "${status.createdAt.format('yyyy/MM/dd/hh:mm:ss')} ${abst}..."

                // [twitter:124481523058610176:tweet] みたいなの
                content << "\n[twitter:${status.id}:tweet]"
            } 
        }

        i++
    }

    content << '\n</div><'
    return content.toString()
}

/** ファイルへ出力 */
def output(Date date, String content){
    def file = new File("hatena-${date.format('yyyy-MM-dd')}.txt")
    file.text = content
}
  • スクリプト : hatena.groovy 直 (Windows)
  • 日付入力」の行のコメントをはずして書かれている形式で日付を入力すると、日付指定を行えます。
  • スクリプト実行時に同様の形式(「2011/10/13」のような形式)の引数を渡すと、そちらの日付を優先します。

なんか、日付の操作に慣れてないせいかゴチャゴチャしてしまってる感じがありますが、Twitter4J でやってることは Twitter#getUserTimeline(Paging) メソッドで自分のツイートを取得しているだけです。 あっ、ページ指定はちょっと面倒かも。

 new Paging(i, 40)

で、40ツイートを1ページとして i ページ目の40ツイートを取得します。 今の場合は、指定した日付の前日以前のツイートが現れるまで順々にページをさかのぼっていきます。

実行すると「hatena-2011-10-13.txt」といった名前のファイルが、以下のような内容で生成されます:

*t*[twitter]2011年10月13日のツイート
><div class="twitter-tweet-wrapper">
[twitter:124481523058610176:tweet]
[twitter:124479041716760576:tweet]
[twitter:124383675788963843:tweet]
[twitter:124381619783073792:tweet]
[twitter:124381523725131776:tweet]
[twitter:124381376064663552:tweet]
[twitter:124314322187984896:tweet]
[twitter:124313333762490369:tweet]
[twitter:124313083559686146:tweet]
[twitter:124310729917603841:tweet]
[twitter:124272506596110336:tweet]
[twitter:124272332385681408:tweet]
[twitter:124174125831962624:tweet]
[twitter:124172509426876416:tweet]
[twitter:124172211115405313:tweet]
</div><

この内容を手動でダイアリーに投稿するのは面倒だけど、Hatena の API いじる方がもっと面倒そう。 よってこれにて終了。

追伸、twitter にガンガンとリクエストを送ってるとレスポンスを拒否られてしまうようですね。 混み具合にもよるのかもしれないけど。 バグだと思ってハマってしまいましたとさ。

Twitter API ポケットリファレンス (POCKET REFERENCE)

Twitter API ポケットリファレンス (POCKET REFERENCE)