はてなブックマークエントリのTwitter自動投稿

今までのあらすじ:

次は、これらを組み合わせて、はてなブックマークの新着エントリをTwitterに自動投稿することを試してみます。
(要はtwitterfeedと同じような機能を再現したい)

現時点では、最新のエントリを投稿するところまでできました。投稿済みのエントリを覚えておいて、未投稿のエントリを投稿する処理ができれば一応の完成です。

test1.rb:

require 'rubygems'
require 'jcode'
require 'rss'
require 'twitter'

HEADER = '[bookmark]' # 投稿内容の先頭につける固定文字列
BODY_LENGTH = 115 # 本文を切り詰める文字数

class String
  # 文字列を指定した文字数に切り詰める
  def truncate(length)
    return self if self.jlength <= length
    i = 0
    new_string = ''
    self.each_char {|char|
      break if i >= length
      new_string << char
      i += 1
    }
    return new_string
  end
end

rss = RSS::Parser.parse('rss.xml')
item = rss.items[0]
tag_string = item.dc_subjects.map{|subject| "[#{subject.content}]"}.join
comment = (item.description == '' ? '' : ": #{item.description}")
message = "#{HEADER}#{tag_string} #{item.title}#{comment}".truncate(BODY_LENGTH) +
  " #{item.link}"

client = Twitter::Client.new(:login => <ユーザ名>, :password => <パスワード>)
client.status(:post, message)

備忘録として、いくつかポイントを列挙します。

  • 投稿中にURLが含まれていると、bit.lyによる短縮URLに自動的に変換される。
  • 投稿した文字列が140文字を超えていても、短縮URL変換後の全体の文字数が140文字に収まっていればOK (らしい)。
  • bit.lyによる短縮URLが20文字程度、多少余裕を見て25文字と見て、URLを除く本文を最大115文字で切り詰める処理を行う。
  • Rubyでは文字列を文字数で切り詰める簡単な方法がないようなので、1文字ずつ切り出してカウントする処理を実装した。
  • Rubyスクリプトからbit.lyのWeb APIを呼び出すことで、最大長を140字ぴったりにすることも考えられるが、面倒そうなので今回は見送り。