メールで Twitter、OAuth

メールで Twitter、しばらく便利に使っていたのだけど、認証方式を変えないといけない。そう思いながら半年経ってしまった。

OAuth認証

認証についていろいろ

要するに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

クライアント登録

  1. Twitter Application Management からアプリケーションの登録。自分ひとりで使うつもりのものなのであんまり凝らない
    1. 名前は「hs9587-twitter-mail」にしましょう説明も、ウェブサイトURLはこのはてなページ「http://d.hatena.ne.jp/hs9587/」所属も、アプリケーションの種類は「クライアントアプリケーション」です、アクセスタイプは「Read & Write」、謎ワードを入力して登録。
      • すぐ分かるが名前に twitter は良くない
    2. 同意文書に I Accept
    3. ええと「アプリケーション名には「twitter」を含めることができません。」だって
    4. じゃあ「hs9587-tweet-mail」で
    5. 同意文書に I Accept
    6. Twitter is over capacity.
    7. もう一度入力して、同意文書に I Accept
    8. 入力フォーム再表示から、Twitter is over capacity.
    9. もう一度入力して、同意文書に I Accept
    10. 入力フォーム再表示から、一拍置いて「 アプリケーションを登録しました。 」画面
      1. 「Consumer key」「Consumer secret」記載あり

登録後は、twitterホームで下行「API」リンクから、developers画面上行「Your apps」リンクから、アプリケーション一覧: にて登録アプリケーション情報詳細へ。

get-twitter-oauth-token

  1. コマンドラインから「get-twitter-oauth-token」、/var/lib/gems/1.9.1/bin だ、「Consumer key」「Consumer secret」を聞かれるので入力
  2. ということなのでそのアドレスにブラウザでアクセス
    • 「アプリケーションが、あなたのアカウントへの接続を要求しています。」
    • http://d.hatena.ne.jp/hs9587/が開発したhs9587-tweet-mailというアプリケーションは、Twitter上にあるあなたに関連するデータに<云々>
    • ということなので、「許可する」釦押下
    • hs9587-tweet-mailに戻り、暗証番号を入力してください。
      • そして暗証番号の表示あり、メモ
      • 暗証番号のタイムアウト短いみたい、メモってる間に「PIN:」入力待ちがタイムアウト「Error: 401 Unauthorized」
  3. 再び「get-twitter-oauth-token」コマンド、「Consumer key」「Consumer secret」
    • 前回の暗証番号では「Error: 401 Unauthorized」
    • 「PIN:」入力待ちは結構すぐタイムアウトして「Error: 401 Unauthorized」になるのでそうと知るまでこの辺なんどか繰り返した
  4. 再び「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 とかフォーマット指定も忘れ易いの注意。