consumer key/secretのみの認証だとTwitterサーバにApplication-only authenticationでのアクセスだと勘違いされる

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

twitter gemを使ったruby一行野郎を環境変数を使って改良 - 別館 子子子子子子(ねこのここねこ)の続きです。
Twitterサーバへ認証できていて、検索も出来るのに、なぜかTwitter::Client.new.updateでのツイートが出来ない。
エラーメッセージは

Your credentials do not allow access to this resource

検索してみた

するとこのサイトがヒット。ぐぐるさんありがとう☆

Bearer token used on endpoint which doesn't support application-only auth

Requesting an endpoint which requires a user context (such as statuses/home_timeline) with a bearer token will produce:

HTTP/1.1 403 Forbidden
Content-Type: application/json; charset=utf-8
Content-Length: 91
...
{"errors":[{"message":"Your credentials do not allow access to this resource","code":220}]}

https://dev.twitter.com/docs/auth/application-only-auth

つまり、application-only authでのアクセスなので、ホームタイムラインを見たり、ツイートしたり、などuserに関連するAPIは使えないよ、ということ。おかしいですね、通常のアクセスのはずなのにconsumer key/secretのみでのアクセスだと勘違いされてしまってます。

証明書が有るか否か

実際、以前の(設定ファイルを用意する)方法だと

$ ruby -rtwitter -e 'load "./set.rb"; t = set; puts t.credentials?'
true

と証明書ありになりますが、

$ ruby -e 'puts eval(ENV["TW"]).credentials?'
false

となってしまってます。

原因発見

ということは、OAuthまわりの設定に誤りがある、ということになります。
.bashrcを見直します。
読みやすいようにTWの行に適宜改行を入れてます。

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"], \
auth_token:ENV["OAUTH_TOKEN"], \
oauth_token_secret:ENV["OAUTH_TOKEN_SECRET"])'

じっくり間違い探ししましょう。
 :
 :
 :

わかりましたか?
TW=で始まる行で
oauth_token」
であるべきなのに、
「auth_token」
となっていますwww
ということで、この部分を直すだけで解決しました。

$ ruby -e 'puts eval(ENV["TW"]).credentials?'
true
$ ruby -e 'puts eval(ENV["TW"]).update("ついーと")'
#<Twitter::Tweet:0x00000100c76680>

ツイートもできました\○/

教訓

  • 誤字に注意
  • 欠けても動いてしまうときは辛い
  • でも解決すると理解がかなり深まる