2011-01-09
メールで Twitter、OAuth
Ruby | |
![]()
メールで Twitter、しばらく便利に使っていたのだけど、認証方式を変えないといけない。そう思いながら半年経ってしまった。
- メールで Twitter、そして機能追加 - Rubyとか Illustratorとか SFとか折紙とか
- メールで Twitter、リファクタリング続き - Rubyとか Illustratorとか SFとか折紙とか
- メールで Twitter、リファクタリング - Rubyとか Illustratorとか SFとか折紙とか
OAuth認証
認証についていろいろ
- OAuth FAQ | Twitter Developers
- Page not found | Twitter Developers
- twitterでOAuthを使う方法(その1:認証まで): てっく☆ゆきろぐ
- twitterでOAuthを使う方法(その2:前回の続き〜APIにアクセスしてみる): てっく☆ゆきろぐ
- Twitter API を OAuth で認証するスクリプトを 0 から書いてみた - trial and error
要するに4つのキーワード|トークンを手に入れるのだ、それはジェムで、jugyoさん有難う
get-twitter-oauth-token (1.0.1)
Author: jugyo
Homepage: http://github.com/jugyo/get-twitter-oauth-token
The "get-twitter-oauth-token" is a command to get OAuth token.
Successfully installed oauth-0.4.4 Successfully installed get-twitter-oauth-token-1.0.1
クライアント登録
- Sign in with your Twitter account | Twitter Developers からアプリケーションの登録。自分ひとりで使うつもりのものなのであんまり凝らない
- 名前は「hs9587-twitter-mail」にしましょう説明も、ウェブサイトURLはこのはてなページ「http://d.hatena.ne.jp/hs9587/」所属も、アプリケーションの種類は「クライアントアプリケーション」です、アクセスタイプは「Read & Write」、謎ワードを入力して登録。
- すぐ分かるが名前に twitter は良くない
- 同意文書に I Accept
- ええと「アプリケーション名には「twitter」を含めることができません。」だって
- じゃあ「hs9587-tweet-mail」で
- 同意文書に I Accept
- Twitter is over capacity.
- もう一度入力して、同意文書に I Accept
- 入力フォーム再表示から、Twitter is over capacity.
- もう一度入力して、同意文書に I Accept
- 入力フォーム再表示から、一拍置いて「 アプリケーションを登録しました。 」画面
- 「Consumer key」「Consumer secret」記載あり
- 名前は「hs9587-twitter-mail」にしましょう説明も、ウェブサイトURLはこのはてなページ「http://d.hatena.ne.jp/hs9587/」所属も、アプリケーションの種類は「クライアントアプリケーション」です、アクセスタイプは「Read & Write」、謎ワードを入力して登録。
登録後は、twitterホームで下行「API」リンクから、developers画面上行「Your apps」リンクから、アプリケーション一覧: にて登録アプリケーション情報詳細へ。
get-twitter-oauth-token
- コマンドラインから「get-twitter-oauth-token」、/var/lib/gems/1.9.1/bin だ、「Consumer key」「Consumer secret」を聞かれるので入力
- Couldn't get a file descriptor referring to the console
- Access here: http://api.twitter.com/oauth/authorize?oauth_token=<云々>
- ということなのでそのアドレスにブラウザでアクセス
- 再び「get-twitter-oauth-token」コマンド、「Consumer key」「Consumer secret」
- 前回の暗証番号では「Error: 401 Unauthorized」
- 「PIN:」入力待ちは結構すぐタイムアウトして「Error: 401 Unauthorized」になるのでそうと知るまでこの辺なんどか繰り返した
- 再び「get-twitter-oauth-token」コマンド、「Consumer key」「Consumer secret」
そして実際の接続
なんとか 4つのキーワード|トークンを得たが、それから実際の認証接続要求を組み立てるのも大変そう。冒頭のリンク先や下記
という訳で何かクライアントを探そう、というか既に oauth-0.4.4 ジェムが入っているのでそれで何とか、UKSTUDIO - RailsからOAuthを利用してTwitterにポストする とか参考に。
#!/usr/bin/ruby # coding: utf-8 require '<どっか>/digest/digest.rb' require 'openssl' require 'nkf' require 'rubygems' require 'oauth' class Digest::HMAC def self.digest(signature_base_string, secret, digest_class) OpenSSL::HMAC.digest OpenSSL::Digest::SHA1.new, secret, signature_base_string end # def self.digest(signature_base_string, secret, digest_class) end # class Digest::HMAC consumer = OAuth::Consumer.new <コンシューマキー>, <コンシューマシークレット>, :site => 'http://twitter.com' HsTweet = OAuth::AccessToken.new consumer, <アクセストークン>, <アクセスシークレット> case $PROGRAM_NAME when __FILE__ then response = HsTweet.post '/statuses/update.json', :status => NKF.nkf('-w', ARGV.join(' ')) puts response, response.body else # case $PROGRAM_NAME end # case $PROGRAM_NAME
ええと ruby は 1.8系。前段の digest や openssl そして Digest::HMAC とかは、なんかバージョンとかライブラリの場所が混乱してるのか oauthジェムの使う digestメソッドが上手く動かなかったのででっち上げ。
基本は中段、4つのキーワード|トークンをセットする所。
後段、実行部は $PROGRAM_NAME での分岐にしてるのは、まあそういうもの。
だからタイムラインを GET するのは GET statuses/friends_timeline | Twitter Developers なんかも参考に、さっきのスクリプトを irb で require してこんな感じ
irb(main):002:0> r = HsTweet.get '/statuses/friends_timeline.json?count=1' => #<Net::HTTPOK 200 OK readbody=true>
はじめ API のいう Optional指定の場所が分からなくて難渋した。UPDATE の時と一緒で HsTweet.get の第2,3引数にハッシュで指定するのかと思ったらエラーになったり何も起こらなかったり。そうじゃなくて単にパスに入れれば良いのね。あと、.json とか .xml とかフォーマット指定も忘れ易いの注意。





