コマンドラインでTwitterに投稿

30分プログラム、その91。コマンドラインTwitterに投稿するためのスクリプト
id:mzp:20070725:notifyの通知をTwitterでやれたら便利じゃね、とid:zyxwvが言っていたので。

使い方

$ twit --username="mzp" --password="xxxx" こんにちは こんにちは

ソース

#! /opt/local/bin/ruby -w
# -*- mode:ruby enconding:utf-8 -*-
#
# twit.rb - Command line twiter poster
#
# Copyright(C) 2007 by mzp
# Author: MIZUNO Hiroki <hiroki1124@gmail.com> 
# http://mzp.sakura.ne.jp/
#
# Timestamp: 2007/07/26 22:24:44
#
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Ruby itself.
#

# SEEALSO:
#  http://groups.google.com/group/twitter-development-talk/web/api-documentation
#  http://watcher.moe-nifty.com/memo/docs/twitterAPI.txt
require 'optparse'
require 'kconv'
require 'net/http'

Net::HTTP.version_1_2 # magic

class Twitter
  def initialize(username,password)
    @username = username
    @password = password
    @http = Net::HTTP.start 'twitter.com'
  end

  # Update user's state
  def update(status)
    post '/statuses/update.json',{'status'=>status}
  end

  private
  def post(path,data)
    req = Net::HTTP::Post.new(path)
    req['content-type'] = 'application/x-www-form-urlencoded'
    req.basic_auth @username,@password
    req.body = data.map{|k,v| "#{k}=#{URI.encode v}"}.join '&'

    res = @http.request req
    res.code == '200' or raise res.message
  end
end


if __FILE__ == $0 then
  opt = OptionParser.new

  username = password = nil
  opt.on('-u USERNAME','--username=USERNAME'){|username|}
  opt.on('-p PASSWORD','--password=PASSWORD'){|password|}
  opt.parse! ARGV

  twitter = Twitter.new username,password
  twitter.update(ARGV.join(' ').toutf8)
end

補足

参考にしたやつ。

で、昨日のid:mzp:20070725:notifyと組み合わせるなら、

export NOTIFY_COMMAND='twit -u mzp -p xxx $@がおわったよ'

とするのがおすすめ。シングルクオートがポイント。

あと、ブックマークコメントによると、gemにあるらしいですよ。

それgemにあるよ。http://twitter.rubyforge.org/