注意: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}]}
つまり、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>
ツイートもできました\○/
教訓
- 誤字に注意
- 欠けても動いてしまうときは辛い
- でも解決すると理解がかなり深まる