https://blog.thingslabo.com/archives/000063.html
OAUTHの練習として、上記urlの写経。
ただし、上記urlは2011年の内容で、その後のtwitterの仕様変更により 動作しない部分がありましたので、修正しています。
以下を callback.pl というfile名で保存し、 これをCGIとしてブラウザからアクセスすると、ユーザ情報詳細?が表示されます。
OAUTHでの動作を確認する為、「print STDERR "POINT 1.1\n"」のような debug write を大量に入れています
#!/usr/local/bin/perl use strict; use warnings; use utf8; use CGI; use OAuth::Lite::Consumer; use LWP::UserAgent; use JSON; use Data::Dumper; # 「CGI::param called in list context ...」のerrorとなる為、以下を記載 # https://end0tknr.hateblo.jp/entry/20150621/1434845779 $CGI::LIST_CONTEXT_WARN = 0; # key や secretは、https://developer.twitter.com/en にて取得 my $OAUTH_CONSUMER_PARAM = {consumer_key =>'ないしょ', consumer_secret =>'ないしょ', site =>"http://twitter.com/", request_token_path=>"https://api.twitter.com/oauth/request_token", access_token_path =>"https://api.twitter.com/oauth/access_token", authorize_path =>"https://api.twitter.com/oauth/authorize", callback_url => 'http://cent80.a5.jp:8080/Test/callback.pl'}; # 今回、試用したAPIの内容は、以下のurlにある説明が分かりやすい。 # refer to https://syncer.jp/twitter-api-matome/get/account/verify_credentials my $API_REQ_URL = 'https://api.twitter.com/1.1/account/verify_credentials.json'; main(); sub main { print STDERR "POINT 1.1\n"; my $consumer = OAuth::Lite::Consumer->new(%$OAUTH_CONSUMER_PARAM); my $query = CGI->new; print STDERR "POINT 1.2\n"; my $oauth_token = $query->param('oauth_token'); my $oauth_verifier = $query->param('oauth_verifier'); if($oauth_token and $oauth_verifier){ print STDERR "POINT 1.3\n"; return reqest_with_token_and_verifier($consumer, $oauth_token, $oauth_verifier); } print STDERR "POINT 1.4\n"; return reqest_without_token_and_verifier($consumer,$query); } sub reqest_with_token_and_verifier { my ($consumer,$oauth_token,$oauth_verifier) = @_; print STDERR "POINT 2.1\n"; my $access_token = $consumer->get_access_token(token =>$oauth_token, verifier=>$oauth_verifier); print STDERR "POINT 2.2\n"; my $req = $consumer->gen_oauth_request(method=> 'GET', url => $API_REQ_URL, token => $access_token); print STDERR "POINT 2.3\n"; my $ua = new LWP::UserAgent(); my $res = $ua->request($req); if(not $res->is_success){ print STDERR "POINT 2.4\n"; my $tmp_msg = join(" ", $res->status_line, $!); die $tmp_msg; } print STDERR "POINT 2.5\n"; my $account = JSON::decode_json($res->content); print "Content-type: text/plain;charset=UTF-8\n\n"; print Dumper($account); return; } sub reqest_without_token_and_verifier { my ($consumer,$query) = @_; print STDERR "POINT 3.1\n"; my $request_token = $consumer->get_request_token(); my $uri = $consumer->url_to_authorize(token => $request_token); print $query->redirect($uri); print STDERR "POINT 3.2\n"; return; }
ちなみに、以下が、最終的にtwitter apiから取得できた情報
$VAR1 = {
'status' => {
'truncated' => bless( do{\(my $o = 0)}, 'JSON::PP::Boolean' ),
'possibly_sensitive' => $VAR1->{'status'}{'truncated'},
'in_reply_to_user_id' => undef,
'entities' => {
'hashtags' => [
{
'indices' => [
39,
42
],
'text' => 'fb'
}
],
'user_mentions' => [],
'symbols' => [],
'urls' => [
{
'indices' => [
16,
38
],
'display_url' => "qiita.com/ine1127/items/\x{2026}",
'url' => 'http://t.co/VAlerC7r1q',
'expanded_url' => 'http://qiita.com/ine1127/items/64b5b6cf52471c3fe59c'
}
]
},
'created_at' => 'Sat Sep 12 22:57:03 +0000 2015',
'is_quote_status' => $VAR1->{'status'}{'truncated'},
'favorite_count' => 1,
'id_str' => '642834335138099200',
'place' => undef,
'lang' => 'ja',
'in_reply_to_user_id_str' => undef,
'in_reply_to_status_id' => undef,
'in_reply_to_screen_name' => undef,
'text' => "\x{554f}\x{984c}\x{306a}\x{3051}\x{308c}\x{3070}\x{3001}\x{3044}\x{3044}\x{3093}\x{3067}\x{3059}\x{3051}\x{3069}\x{306d}
http://t.co/VAlerC7r1q #fb",
'contributors' => undef,
'favorited' => $VAR1->{'status'}{'truncated'},
'geo' => undef,
'id' => '642834335138099200',
'in_reply_to_status_id_str' => undef,
'retweet_count' => 0,
'coordinates' => undef,
'source' => '<a href="http://twitter.com" rel="nofollow">Twitter Web Client</a>',
'retweeted' => $VAR1->{'status'}{'truncated'}
},
'url' => 'http://t.co/RL6kuGrhX7',
'created_at' => 'Sat Jul 18 08:56:42 +0000 2009',
'follow_request_sent' => $VAR1->{'status'}{'truncated'},
'profile_image_url_https' => 'https://pbs.twimg.com/profile_images/1881562143/profile_normal.gif',
'name' => 'end0tknr',
'lang' => undef,
'translator_type' => 'none',
'id_str' => '57893029',
'following' => $VAR1->{'status'}{'truncated'},
'protected' => $VAR1->{'status'}{'truncated'},
'profile_background_tile' => $VAR1->{'status'}{'truncated'},
'entities' => {
'description' => {
'urls' => []
},
'url' => {
'urls' => [
{
'expanded_url' => 'http://d.hatena.ne.jp/end0tknr/',
'display_url' => 'd.hatena.ne.jp/end0tknr/',
'url' => 'http://t.co/RL6kuGrhX7',
'indices' => [
0,
22
]
}
]
}
},
'statuses_count' => 520,
'contributors_enabled' => $VAR1->{'status'}{'truncated'},
'profile_image_url' => 'http://pbs.twimg.com/profile_images/1881562143/profile_normal.gif',
'profile_text_color' => '333333',
'description' => "\x{592a}\x{5bb0}\x{5e9c}\x{5929}\x{6e80}\x{5bae}\x{306e}\x{72db}\x{72ac}\x{306f}\x{3001}\x{5999}\x{306b}\x{304b}\x{308f}\x{3044}\x{3044}",
'profile_sidebar_fill_color' => 'DDEEF6',
'default_profile_image' => $VAR1->{'status'}{'truncated'},
'profile_link_color' => '1DA1F2',
'id' => 57893029,
'default_profile' => bless( do{\(my $o = 1)}, 'JSON::PP::Boolean' ),
'listed_count' => 1,
'suspended' => $VAR1->{'status'}{'truncated'},
'is_translator' => $VAR1->{'status'}{'truncated'},
'profile_background_image_url' => 'http://abs.twimg.com/images/themes/theme1/bg.png',
'geo_enabled' => $VAR1->{'status'}{'truncated'},
'notifications' => $VAR1->{'status'}{'truncated'},
'profile_use_background_image' => $VAR1->{'default_profile'},
'followers_count' => 3,
'friends_count' => 10,
'profile_background_color' => 'C0DEED',
'has_extended_profile' => $VAR1->{'status'}{'truncated'},
'screen_name' => 'end0tknr',
'location' => '',
'needs_phone_verification' => $VAR1->{'status'}{'truncated'},
'is_translation_enabled' => $VAR1->{'status'}{'truncated'},
'profile_sidebar_border_color' => 'C0DEED',
'favourites_count' => 0,
'time_zone' => undef,
'profile_background_image_url_https' => 'https://abs.twimg.com/images/themes/theme1/bg.png',
'utc_offset' => undef,
'verified' => $VAR1->{'status'}{'truncated'}
};