コマンドラインでツイートするRubyスクリプト(つづき)

先日、コマンドラインでツイートするRubyスクリプトを作ってみましたが、引数の最後がURLだった場合、Google URL Shortener APIを使って短縮するようにしてみました。

このままでも動きますが、GoogleはAccess Keyの取得を推奨し、設定するとAnonymous状態と比べて制限*1が拡大されます。先日、公開したスクリプトを既にお使いで、Access Keyを設定したい場合は、お手数ですが「~/.twrc」ファイルに「google_api_access_key」を追記してください。

google_api_access_key: <YOUR ACCESS KEY>

ソース

#!/usr/bin/env ruby
$KCODE = 'u'

require 'fileutils'
require 'yaml'
require 'rubygems'
require 'oauth'
require 'json'

class Tw
  CONFIG_FILE   = '.twrc'

  # Twitter API
  KEY            = 'consumer_key'
  SECRET         = 'consumer_secret'
  TOKEN          = 'access_token'
  TOKEN_SECRET   = 'access_token_secret'
  MAX_LENGTH     = 140
  TWITTER_API    = 'http://api.twitter.com'
  UPDATE_URL     = 'https://api.twitter.com/1/statuses/update.xml'

  # Google URL Shortener API
  ACCESS_KEY     = 'google_api_access_key'
  GOOGLE_APIS    = 'www.googleapis.com'
  SHORTENER_PATH = '/urlshortener/v1/url'

  attr_accessor :config

  def initialize
    config_file = File.join(File.expand_path('~'), CONFIG_FILE)
    begin
      @config = YAML.load(File.read(config_file))
    rescue
      @config = {
        KEY          => prompt(KEY),
        SECRET       => prompt(SECRET),
        TOKEN        => prompt(TOKEN),
        TOKEN_SECRET => prompt(TOKEN_SECRET),
        ACCESS_KEY   => prompt(ACCESS_KEY)
      }
      File.open(config_file, 'w') {|f| f.write(@config.to_yaml)}
      FileUtils.chmod(0600, config_file)
      puts "saved to #{config_file}"
    end
  end

  def get_token
    consumer = OAuth::Consumer.new(@config[KEY],
                                   @config[SECRET],
                                   :site => TWITTER_API)
    token_hash = {
      :oauth_token        => @config[TOKEN],
      :oauth_token_secret => @config[TOKEN_SECRET]
    }
    access_token = OAuth::AccessToken.from_hash(consumer, token_hash)
  end

  def shorten_url(long_url)
    params = {'longUrl' => long_url}
    params.store('key', @config[ACCESS_KEY]) if @config[ACCESS_KEY] && !@config[ACCESS_KEY].empty?
    response = ''

    http = Net::HTTP.new(GOOGLE_APIS, 443)
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
    response = http.post(SHORTENER_PATH, params.to_json, {'Content-Type' => 'application/json'})

    return Net::HTTPOK == response.class ? (JSON.parse(response.body))['id'] : ''
  end

  private

  def prompt(string)
    print string.gsub('_', ' ').capitalize + ":"
    gets.strip
  end
end

URL_REGEXP = /(^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$)/ix

tw = Tw.new

if URL_REGEXP =~ (ARGV.length > 0 ? ARGV[ARGV.length - 1] : '')
  status = (ARGV[0, ARGV.length - 1].join(' ') + ' ' + tw.shorten_url($1)).strip
else
  status = ARGV.join(' ')
end

unless status.empty? && status.split('').length > Tw::MAX_LENGTH
  response = tw.get_token.post(Tw::UPDATE_URL, {:status => status})
  exit(Net::HTTPOK == response)
else
  exit(false)
end

設定

アプリをTwitter Applicationsで登録してください。アプリケーションの種類は、「クライアントアプリケーション」です。

Access TokenとAccess Token Secretは、アプリを登録した後、右サイドメニューにある「My Access Token」をクリックすると取得できます。

Access Keyは、Google APIs Consoleで取得できます。

引数なしで起動し、Consumer Key、Consumer Secret、Access Token、Access Token Secret、Google Api Access Keyを入力してください。Access Keyは省略する場合、単にエンターキーでスキップしてください。

使い方

Twitterに投稿したいメッセージを引数として、起動してください。複数の引数は、半角の空白で連結します。ただし、半角括弧が文中にある場合は、文章全体をダブルクォーテーションで囲ってください。

注意点

当たり前のことですが、「AS IS」*2です。

バレンタインチョコ欲しい!*3

欲しいプレゼントは…

Apple iPod touch 64GB MC547J/A

Apple iPod touch 64GB MC547J/A

*1:queries/day。一日に何回、問い合わせ(短縮化)をGoogleが受け付けるか。

*2:The MIT License

*3:はてなキーワードのキャンペーンに応募してみました。