twitter gemを使ったruby一行野郎を環境変数を使って改良

注意:Twitter gemのバージョンが5未満の設定ですので、5以上だと以下の手順は無効ですゴメンナサイ

前準備

前提としてTwitter Application Managementでconsumer_key, consumer_secret, oauth_token, access_token, oauth_token_secretを取得済みであるとします。
もちろんtwitter gemもインストール済みである必要があります。
設定ファイルset.rbを作業ディレクトリに用意します。

def set
  Twitter::Client.new(:consumer_key => "your_consumer_key",
                      :consumer_secret => "********",
                      :oauth_token => "********",
                      :oauth_token_secret => "********")
end

twitter gemを使ったruby一行野郎(ツイート・トレンド・検索・フォロー&フォロワー一覧・リスト一覧&操作…) - 別館 子子子子子子(ねこのここねこ)

として別ファイルを用意させていましたが、ファイルのあるディレクトリでしか実行できないのが残念でした。
環境変数に登録すればいいんじゃね?と思って試してみました。

.bashrcに登録

環境変数へ登録するために、.bashrcへ以下の内容を追加します(修正済み)。

export CONSUMER_KEY="your_consumer_key"
export CONSUMER_SECRET="your_consumer_secret"
export OAUTH_TOKEN="your_oauth_token"
export OAUTH_TOKEN_SECRET="your_oauth_token_secret"
export TW='Twitter::Client.new(consumer_key:ENV["CONSUMER_KEY"],consumer_secret:ENV["CONSUMER_SECRET"],oauth_token:ENV["OAUTH_TOKEN"],oauth_token_secret:ENV["OAUTH_TOKEN_SECRET"])'

例えば検索するときですが、設定ファイルset.rbを使う場合だと

ruby -rtwitter -e 'load "./set.rb"; t = set; puts t.search("riocampos", {count:100}).to_hash[:statuses].map{ |i| "@#{i[:user][:screen_name]}: #{i[:text]}"}'

となり、「load "./set.rb"; t = set;」の部分が不要になります。その代わりにtがすこしややこしくなります。

ruby -rtwitter -e 'eval(ENV["TW"]).search("riocampos", {count:100}).to_hash[:statuses].map{ |i| puts "@#{i[:user][:screen_name]}: #{i[:text]}"}'

さらに-rtwitterを略するには

環境変数RUBYOPTに-rtwitterを登録すればOKです。
.bashrcにさらに追加します。

export RUBYOPT="-rtwitter"

これでほんの少し短く出来ます。

ruby -e 'eval(ENV["TW"]).search("riocampos", {count:100}).to_hash[:statuses].map{ |i| puts "@#{i[:user][:screen_name]}: #{i[:text]}"}'

なぜツイートできないの?

しかし。
ツイートも同じくできるかと思ったのですが

$ ruby -rtwitter -e 'eval(ENV["TW"]).update("tweet by one liner!")'
/Users/common/.rbenv/versions/1.9.3-p448/lib/ruby/gems/1.9.1/gems/twitter-4.8.1/lib/twitter/response/raise_error.rb:21:in `on_complete': Your credentials do not allow access to this resource (Twitter::Error::Forbidden)
(以下略)

とエラーを返されてしまいました。
403 Forbidden
のようです。なぜでしょう…。

解決しましたw → consumer key/secretのみの認証だとTwitterサーバにApplication-only authenticationでのアクセスだと勘違いされる - 別館 子子子子子子(ねこのここねこ)