メールで Twitter、OAuth
メールで Twitter、しばらく便利に使っていたのだけど、認証方式を変えないといけない。そう思いながら半年経ってしまった。
- メールで Twitter、そして機能追加 - Rubyとか Illustratorとか SFとか折紙とか
- メールで Twitter、リファクタリング続き - Rubyとか Illustratorとか SFとか折紙とか
- メールで Twitter、リファクタリング - Rubyとか Illustratorとか SFとか折紙とか
OAuth認証
認証についていろいろ
- http://dev.twitter.com/pages/oauth_faq
- http://apiwiki.twitter.com/OAuth-Examples
- twitterでOAuthを使う方法(その1:認証まで): てっく☆ゆきろぐ
- twitterでOAuthを使う方法(その2:前回の続き〜APIにアクセスしてみる): てっく☆ゆきろぐ
- http://techno-st.net/2009/11/26/twitter-api-oauth-0.html
要するに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
クライアント登録
- Twitter Application Management からアプリケーションの登録。自分ひとりで使うつもりのものなのであんまり凝らない
- 名前は「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」
- authorizeページにブラウザアクセス、「許可」して暗証番号、すぐに「PIN:」入力
- 「Token: 」「Secret: 」の値返ってきた。これをメモ。
そして実際の接続
なんとか 4つのキーワード|トークンを得たが、それから実際の認証接続要求を組み立てるのも大変そう。冒頭のリンク先や下記
という訳で何かクライアントを探そう、というか既に oauth-0.4.4 ジェムが入っているのでそれで何とか、http://ukstudio.jp/posts/2009/07/14/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 するのは http://dev.twitter.com/doc/get/statuses/friends_timeline なんかも参考に、さっきのスクリプトを 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 とかフォーマット指定も忘れ易いの注意。