Twitter のアクセストークンをスクリプトで取得する

September 1, 2019

昨今、Twitter API の App 登録が審査など手順が増えたので、気軽に App を増やさなくなりました。そのため、既存の App に対して管理アカウントとは別のアカウントを認可させたいときがあります。

下記の Ruby スクリプトは gem oauth を使って、サーバを立てずにブラウザだけで認可してアクセストークンを取得するものです。認可後のリダイレクト時に付随するクエリ内容を適切に処理さえすれば、対象の Callback URL が 404 Not found であろうとも問題ないです。一時的にサーバを立てる必要もなく、一連の本来サーバサイドで行う処理をローカルから実行して処理できます。

なお Callback URL が自分の持ち物でないとセキュリティ上問題があるのは当然です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
require 'uri'
require 'oauth'

CONSUMER_KEY = '<your consumer key>'
CONSUMER_SECRET = '<your consumer secret>'
CALLBACK_URL = '<your callback url>'

consumer = OAuth::Consumer.new(CONSUMER_KEY, CONSUMER_SECRET, {
site: "https://api.twitter.com",
scheme: :header
})

request_token = consumer.get_request_token(oauth_callback: CALLBACK_URL)
req_url = request_token.authorize_url(oauth_callback: CALLBACK_URL)
puts <<EOS
Go to the following URL and authorize your account on a browser:
#{req_url}

Copy the redirected url from the browser and paste it:
EOS

input = STDIN.gets
redirected_url = input.chomp
rurl = URI.parse(redirected_url)
params = {}.tap do |h|
URI.decode_www_form(rurl.query).each do |entry|
h[entry[0].to_sym] = entry[1]
end
end

access_token = request_token.get_access_token(oauth_verifier: params[:oauth_verifier])
puts <<EOS

===================================
user_id: #{access_token.params[:user_id]}
screen_name: #{access_token.params[:screen_name]}

Access Token: #{access_token.token}
Access Token Secret: #{access_token.secret}
===================================
EOS

スクリプトを実行すると authorize URLが生成されるので、それを認可したいアカウントでサインイン済みのブラウザに貼り付けて移動します。そのまま Twitter の認可画面でボタンを押すと、本来自分のサービスのURLにリダイレクトされます。この状態でURL欄を中身コピーして、貼り付けます。そうすると続きを処理してアクセストークンして出力します。

Ruby Twitter

tilfin freelance software engineer