February 6, 2010

twitter-auth を使って Rails で簡単 Twitter 認証♪

twitter-auth という Rails プラグインを使うと簡単に Twitter を使った認証が行えるようになります。

http://github.com/mbleigh/twitter-auth

ですが、普通に使おうとすると request_token を取得するところで 以下のようなエラーが出てしまいました。

OpenSSL::SSL::SSLError (SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed):
...

サーバー証明書がないためにエラーになっているようなのですが、調べてみたところ twitter-auth には証明書を指定する方法が用意されていませんでした。
なので github で fork して証明書を指定できるようにしてこの問題を回避することにしました。

http://github.com/jugyo/twitter-auth

インストール

./script/plugin install git://github.com/jugyo/twitter-auth.git

使い方

generator が用意されていて、以下を実行すると必要なファイルを作ってくれます。

 script/generate twitter_auth 

migration も作られるので必要に応じてスキーマを編集して rake db:migrate してください。

証明書ファイルの取得

以下のページを参考に、 Twitter の CA 証明書ファイルを取得し、適当な場所に保存します。

http://d.hatena.ne.jp/vividcode/20091031/1256967931

コンシューマーキーとシークレットキーの取得

以下のページからアプリケーションを登録し、コンシューマーキーとシークレットキーを取得してください。

https://twitter.com/apps

設定

config/twitter_auth.yml を編集します。

development:
  strategy: oauth
  oauth_consumer_key: "コンシューマーキー"
  oauth_consumer_secret: "シークレットキー"
  base_url: "https://twitter.com"
  authorize_path: "/oauth/authenticate"
  api_timeout: 10
  remember_for: 14 # days
  oauth_callback: "http://localhost:3000/oauth_callback"
  ca_file: "証明書ファイルのパス"
...

確認

./script/server でアプリケーションを起動し http://localhost:3000/session/new にアクセスすると、リダイレクトされて以下のようなページが表示されると思います。

twitter_oauth

承認を求めているアプリケーションの名前が正しいことを確認し「Allow」ボタンを押してください。
リダイレクトされて http://localhost:3000/ に帰ってきたら成功です。
おめでとうございます。

April 7, 2009

ruby で OAuth を使ってみる実験

ruby で OAuth を使ってみる実験です。

twitter にアプリケーションを登録

まず twitter に自分の作ったアプリケーションを登録します。
自分のアプリケーションが無い場合でも適当なのでいけるんじゃないんでしょうか。
設定画面(Settings)の以下のリンク(丸で囲んだところ)からアプリケーションの登録画面に辿り着けるはずです。

registration

登録画面はこんな感じです。

registration2

登録すると以下のような画面が見れて、「Consumer key」と「Consumer secret」というのが発行されているのがわかります。

registration3

この「Consumer key」と「Consumer secret」を使って認証処理を行います。

oauth をインストール

oauth ライブラリを gem でインストールします。

sudo gem install oauth

irb で実験

irb で実験してみます。

% irb

まず、irb 上で以下を実行してください。

require 'rubygems'
require 'oauth'

consumer = OAuth::Consumer.new(
  "< Consumer key >",
  "< Consumer secret >",
  :site => "http://twitter.com"
)
request_token = consumer.get_request_token
puts request_token.authorize_url

処理に少し時間がかかるかもしれませんが、最後に URL が出力されるはずです。
この irb はまた後で使うので、終了せずにそのまま置いといてください。
出力された URL にアクセスすると以下のような画面が出てくると思います。

registration4

深く考えずに「Allow」をクリックしましょう。
その後、irb に戻り、以下を実行してください。

access_token = request_token.get_access_token

以上で twitter.com での OAuth による認証は完了です。
内部的には「Consumer key」と「Access token」の交換みたいなことが行われています。
取得した「Access token」の情報(token と token_secret の二つ)をアプリケーション側で保持しておけばいつでも認証を通してのアクセスができます。

試しに twitter に何かメッセージをポストしてみましょう。
以下を実行してみてください。

access_token.post('/statuses/update.json', :status => 'test for oauth')

うまく行きましたか?
http://twitter.com/ にアクセスしてみて、ちゃんとメッセージが投稿されていれば実験成功です。

rubytter の OAuth 対応の話

ちなみに、rubytter の OAuth 対応を昨日行いました。
上記で取得した「access_token」を OAuthRubytter というクラスに渡して new すると Rubytter と同じインターフェイスで OAuth な rubytter が楽しめます。

例:

r = OAuthRubytter.new(access_token)
r.update('Hello OAuth!!')
February 14, 2009

Rubytter

Rubytter は Ruby で書かれたシンプルな Twitter ライブラリです。
Twitter API を Ruby から利用しやすいようにラップしているだけで、それ以外のことは何もしていません。
現状、API のほとんどのメソッドに対応してます。

インストール方法

gem で簡単にインストールできます。

sudo gem install rubytter

開発に使っている GitHub から直接 gem をインストールすることもできます。

gem source -a http://gems.github.com
sudo gem install jugyo-rubytter

ソースコード

http://github.com/jugyo/rubytter

使い方

Rubytter の使い方は非常にシンプルで簡単です。

まず始めに Rubytter のインスタンスを作ります。
その際、引数に Twitter のログインID(ユーザーID or メールアドレス)とパスワードを指定します。

rubytter = Rubytter.new('login_id', 'password')

メッセージの投稿には update メソッドを使います。

rubytter.update('ただいまー!')

タイムラインの取得には friends_timeline メソッドを使います。

client.friends_timeline.each do |status|
  puts "#{status.user.screen_name}: #{status.text}"
end

タイムライン取得時に一度に取ってこれるデータ件数は 20 件で、ページを指定することで 20 件以降のデータを取ってくることができます。

client.friends_timeline(:page => 2).each do |status|
  puts "#{status.user.screen_name}: #{status.text}"
end

API とメソッドの対応

Rubytter と Twitter API とのメソッドの対応は以下のようになっています。

Rubytter Twitter
update(message) /statuses/update
remove_status(id, params = {}) /statuses/destroy/
public_timeline() /statuses/public_timeline
friends_timeline() /statuses/friends_timeline
replies() /statuses/replies
user_timeline(id) /statuses/user_timeline/
show(id) /statuses/show/
friends(id) /statuses/friends/
followers(id) /statuses/followers/
user(id) /users/show/
direct_messages() /direct_messages
sent_direct_messages() /direct_messages/sent
direct_message(message) /direct_messages/new
remove_direct_message(id, params = {}) /direct_messages/destroy/
follow(id, params = {}) /friendships/create/
leave(id, params = {}) /friendships/destroy/
friendship_exists() /friendships/exists
followers_ids(id) /followers/ids/
friends_ids(id) /friends/ids/
favorites() /favorites
favorite(id, params = {}) /favorites/create/
remove_favorite(id, params = {}) /favorites/destroy/
verify_credentials(params = {}) /account/verify_credentials
end_session(params = {}) /account/end_session
update_delivery_device(params = {}) /account/update_delivery_device
update_profile_colors(params = {}) /account/update_profile_colors
limit_status() /account/rate_limit_status
update_profile(params = {}) /account/update_profile
enable_notification(id, params = {}) /notifications/follow/
disable_notification(id, params = {}) /notifications/leave/
block(id, params = {}) /blocks/create/
unblock(id, params = {}) /blocks/destroy/
search(query or params) (search.twitter.com)/search

Twitter API の詳細については以下を参照してください。
Twitter API Wiki / REST API Documentation

enjoy!

January 17, 2009

Termtter、エンジェル資金調達へ

ま、嘘なんだけど。

TechCrunch Japan にこういうニュースがあった。

TweetDeck、エンジェル資金調達へ

TweetDeckはイギリスのプログラマーIain Dodsworthが独力で作り上げたサービスだ。Adobe AIRを利用しているので、デスクトップ・アプリケーションはもちろんクロス・プラットフォームだ。

Termtter も一応クロス・プラットフォームだけどね!

現在公開ベータ中のTweetDeckは、多数の友達をフォローしているヘビーユーザーにとって特に便利な機能をいくつか備えている。ユーザーはメッセージをトピックやグループによって分類してそれぞれにカラムを割り当てて表示することができる。これで多数のメッセージが見通しよく読めるようになる。

それ Termtter でもできるけどね!

ま、そんなことはどうでもいいんですけどね。

基本的に Termtter は Ruby を理解してる人にしか使いこなせないと思います。
逆に、Ruby を理解している人にとっては Termtter はものすごく強力な Twitter クライアントになります。

Twitter の使い方は人によって千差万別で、アプリケーションの作り手がそれをすべて予測して実装するのはまず不可能です。
そこで、Termtter ではプラグインシステムを導入しました。
Ruby が書ければ誰でも簡単に Termtter に機能を追加することができます。
必要な機能は自分で実装すればいいのです。
Ruby が書けない人は Ruby を勉強すればいいと思います。

http://github.com/jugyo/termtter

January 12, 2009

Termtter の開発について

Termtter の開発が楽しいです。

http://github.com/jugyo/termtter

初めの頃は僕一人で開発してて自分のプログラムという感覚が強かったのですが、今はもうまったくそんな風には思わないですね。
開発者全員が共同で所有してるものみたいな感じがします。
みんなで開発するのって楽しいですね。
ま、仕事とは違いますからね。

プラグインの仕組みを入れたのが良かったと思います。
初めは hook を追加する機能しかなかったのですが。
コマンドを追加できるようにしたあたりから、かなり楽しくなってきたように思います。
自分では絶対に思いつけないような素敵コマンドがたくさん実装されていきました。

僕自身は Termtter の開発が最終的にうまくいこうが失敗しようが正直どっちでもいいんですよね。
できればうまくいってほしいですけど、今みたいにみんなで議論したりアイデアを出したりしながら真剣に考えてプログラミングするというそのプロセスこそがなにより重要だと思うんです。
良いものを作るためにみんなで知恵を出し合うというのがいいですね。
なので、そういう雰囲気を維持できるように僕は頑張りたいと思います。
楽しめなければ意味ないですし、楽しくなければ誰も参加したいとは思わないですからね。

January 8, 2009

Termtter Tips – plugin プラグイン

近況

すごいペースで Termtter の開発が進んでいます。
http://github.com/jugyo/termtter/tree/master

コミッターの数も増えました。
現在、以下の方々が開発に参加しています(ありがとうございます!)。

あと、Twitter にコミットログを流すようにしました。
http://twitter.com/termtter

それと、Lingr にチャットルームを作りました(ujihisa さんが)
http://www.lingr.com/room/termtter

今日の Tips

さて今日の Tips ですが、plugin プラグインを紹介したいと思います。
plugin プラグインは、termtter 起動中にプラグインを読み込むためのプラグインです。
とりあえずこのプラグインさえ読み込んでおけば後でなんとでもなります。

plugin プラグインを有効にするには ~/.termtter ファイルに以下を記述します。

plugin 'plugin'

plugin プラグインを有効にするすと以下の二つのコマンドが使えるようになります。

  • plugins
  • plugin

plugins コマンド

plugins コマンドを実行すると、利用可能なプラグインの一覧が出力されます。

例)

> plugins
english
erb
favorite
fib
filter
growl
keyword
log
notify-send
plugin
say
shell
standard_plugins
stdout
system
translation
uri-open
yesno

plugin コマンド

plugin コマンドを使うと任意のプラグインをその場で読み込むことができます。
試しに fib プラグインを読み込んでみましょう。

> plugin fib
=> true

ついでに fib を実行してみましょう。

> fib 100
=> fib(100) = 354224848179261915075

これで「fib(100) = 354224848179261915075」というメッセージが twitter に送信されました。
ちゃんと送信されたかどうか list コマンドを使って確かめてみましょう。

> list
(01:06:17) jugyo: fib(100) = 354224848179261915075 1102123752
...

ちゃんと送信されてますね!

January 5, 2009

Termtter のその後

先日紹介した Termtter ですが、活発に開発が続いています。
Termtter – ターミナルエミュレータ上で動作する Twitter クライアント

ujihisa さんや bubblegum さんが機能追加のためのプログラムを書いてくれて(ありがとうございます!)、そのほとんどがすでに本体に取り込まれています。

ujihisa さんには Termtter のコミッターになってもらいました。
リファクタリングとかがしがしやってくれるので非常に助かりますし、リファクタリング後のソースが僕にとって勉強になるのでありがたいです。

最近追加された機能

以下の機能が最近追加されました。

独自のコマンドを追加できるようになった
手軽にコマンドを追加できます
Growl による通知
Growl を使って通知を行います。
まだ改善の余地があります。
bubbles さんがユーザーのアイコンを表示するようなのを作っているのでそれを取り込むかもしれません。
uri-open コマンド
ujihisa さん作。メッセージ中の URL を一気に開きます。便利です。
Mac の say コマンドでメッセージを読み上げる機能
ujihisa さん作。かなり楽しい。
この発想はなかったです。
コマンド補完機能
bubbles さん作。超絶便利!。
前から欲しかった機能だけど実装方法がわからなかったんですよね。
さらに ujihisa さんがメッセージ投稿時の @ 以降のユーザー名を補完する機能を実装してくれて、これまた超便利!
この補完機能によって、そんじょそこらの Twitter クライアントよりも断然使いやすくなったと思います。
nokogiri を使うのをやめた
これは機能追加ではありませんが。
わざわざ nokogiri をインストールしてもらうのは忍びないし Twitter API は JSON によるレスポンスにも対応しているので受け取るデータを XML から JSON に変えました。

雑感

やっぱターミナルですね。
ターミナルに集約させることでいろいろなことが最小限の手間でできるようになるんですね。
ターミナルに向いているアプリとそうでないものがあると思いますが、テキストベースのコミュニケーションツールである Twitter は明らかにターミナルに向いています。
そもそもなんで Termtter を作ろうと思ったかというと、Linux 上で動作する手頃な Twitter クライアントがなかったからなんです。
実際作ってみると、下手な GUI アプリよりも使いやすいと感じました。

懸案・課題

懸案および課題を以下に挙げておきます。

  • Termtter という名前がそもそもいけてない
  • TinyURL による URL の短縮と展開
  • 会話の流れ(reply のつながり)を表示するようなコマンド
  • screen 上で通知できるようにしたい
  • メールによる通知ができるようにしたい(どっかのサーバー上で動かしておいて、フィルターに引っかかったメッセージを自分宛に送ったり)
  • rubyforge に登録したいんだけど、なんか面倒くさそうなのでまだやってない。

関連記事

rubyneko – jugyoさんのtermtterのbranchを作った
termtter から growl に通知する – Learning to be Me
termtter から growl に通知する の続き – Learning to be Me
termtterで補完 – Learning to be Me