Skip to content

Instantly share code, notes, and snippets.

@dragon3
Created July 23, 2010 01:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dragon3/486905 to your computer and use it in GitHub Desktop.
Save dragon3/486905 to your computer and use it in GitHub Desktop.
use strict;
use warnings;
use utf8;
use Encode qw(encode_utf8);
use MIME::Base64 qw(decode_base64);
use OAuth::Lite::Consumer;
use Plack::Request;
use Plack::Response;
my $site = 'https://cacoo.com';
my $html = join( '', <DATA> );
my $tokens = {
k1 => 'd2ttcFBwWEd6SEJY',
k2 => 'Z0ZPc2FiZmxhSg==',
s1 => 'amx5bHJlZkhaak55aUhrbWpmVW5x',
s2 => 'U0VLVnNTbFJkcXpGbndWbmZiTEdD',
};
my $consumer = OAuth::Lite::Consumer->new(
consumer_key => decode_base64( $tokens->{k1} . $tokens->{k2} ),
consumer_secret => decode_base64( $tokens->{s1} . $tokens->{s2} ),
site => $site,
request_token_path => '/oauth/request_token',
access_token_path => '/oauth/access_token',
authorize_path => '/oauth/authorize',
);
# get request token
sub request {
my ( $req, $res ) = @_;
my $request_token =
$consumer->get_request_token( callback_url => $req->base . 'callback', )
or die $consumer->errstr;
$res->cookies->{rt} = $request_token->as_encoded;
$res->redirect( $consumer->url_to_authorize( token => $request_token, ) );
}
# callback
sub callback {
my ( $req, $res ) = @_;
my $verifier = $req->param('oauth_verifier');
if ($verifier) {
my $request_token =
OAuth::Lite::Token->from_encoded( $req->cookies->{rt} );
my $access_token = $consumer->get_access_token(
token => $request_token,
verifier => $verifier,
) or die $consumer->errstr;
$res->cookies->{rt} = undef;
$res->cookies->{at} = $access_token->as_encoded;
}
$res->redirect( $req->base . '' );
}
sub diagrams {
my ( $req, $res ) = @_;
call_api( $req, $res, '/api/v1/diagrams', { offset => 0, limit => 100, } );
}
sub diagram {
my ( $req, $res ) = @_;
my $id = $req->param('diagramId') or return diagrams( $req, $res );
call_api( $req, $res, '/api/v1/diagrams/' . $id, {} );
}
sub image {
my ( $req, $res ) = @_;
my $id = $req->param('diagramId') or return diagrams( $req, $res );
$req->parameters->add( 'format', 'png' );
call_api( $req, $res, '/api/v1/diagrams/' . $id, {} );
}
sub users {
my ( $req, $res ) = @_;
my $name = $req->param('name') or return diagrams( $req, $res );
call_api( $req, $res, '/api/v1/users/' . $name, {} );
}
sub account {
my ( $req, $res ) = @_;
call_api( $req, $res, '/api/v1/account', {} );
}
sub top {
my ( $req, $res ) = @_;
if ( $req->cookies->{at} ) {
$res->body( Encode::encode_utf8 $html );
}
else {
$res->redirect( $req->base . 'login' );
}
}
sub call_api {
my ( $req, $res, $path, $params ) = @_;
unless ( $req->cookies->{at} ) {
$res->redirect( $req->base . 'login' );
return;
}
my $access_token = OAuth::Lite::Token->from_encoded( $req->cookies->{at} );
my $format = $req->param('format') ? $req->param('format') : 'json';
my $http_res = $consumer->request(
method => 'GET',
url => $site . $path . '.' . $format,
token => $access_token,
params => $params || {},
);
unless ( $http_res->is_success ) {
if ( $http_res->code == 400 || $http_res->code == 401 ) {
$res->redirect( $req->base . 'login' );
return;
}
die $http_res->as_string;
}
if ( $format eq 'png' ) {
$res->content_type('image/png');
$res->body( $http_res->decoded_content );
}
else {
$res->content_type('text/plain; charset=UTF-8');
$res->body( encode_utf8( $http_res->decoded_content ) );
}
}
my $app = sub {
my $req = Plack::Request->new(shift);
my $res = Plack::Response->new(200);
my $path_info = $req->path_info;
if ( $path_info eq '/users' ) { users $req, $res }
elsif ( $path_info eq '/login' ) { request $req, $res }
elsif ( $path_info eq '/callback' ) { callback $req, $res }
elsif ( $path_info eq '/diagrams' ) { diagrams $req, $res }
elsif ( $path_info eq '/diagram' ) { diagram $req, $res }
elsif ( $path_info eq '/image' ) { image $req, $res }
elsif ( $path_info eq '/account' ) { account $req, $res }
else { top $req, $res }
return $res->finalize;
};
__DATA__
<html>
<head>
<meta name="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p>
<a href="/account">あなたのアカウント情報</a> (account)
<br />
<a href="/diagrams">あなたの図リスト</a> (diagrams)
</p>
<p>
<form method="GET" id="diagram" action="/diagram">
diagramId「<input type="text" name="diagramId" value="" />」<input type="submit" name="" value="の図情報" /> (diagram)
</form>
</p>
<p>
<form method="GET" id="image" action="/image">
diagramId「<input type="text" name="diagramId" value="" />」<input type="submit" name="" value="の画像出力" /> (image)
</form>
</p>
<p>
<form method="GET" id="users" action="/users">
ユーザ名「<input type="text" name="name" value="" />」<input type="submit" name="" value="さんのユーザ情報" /> (users)
</form>
</p>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment