2011-04-04

3arrows の OpenSocial RPC API (2-legged OAuth) で、節電呼びかけでんこちゃん社内 bot を作ってみたよ

こんにちは。Nobuhiro Nakajima @ YOKOHAMA です。

3arrows - Google Apps アカウントでも使える社内 Twitter
http://www.3arrows.jp/

3arrows は、2-legged OAuth による OpenSocial RPC API を提供しています。2-legged OAuth は mixiアプリなどソーシャルアプリの世界では、標準化されたリクエスト署名方式で、アプリと外部システムの連携に適しています。詳しくは、次のページを参考にしてください。

2-legged OAuth による API アクセス >> mixi Developer Center
http://developer.mixi.co.jp/appli/spec/pc/restful-api-for-pc/2-legged-oauth-api-access

このエントリでは 2-legged OAuth による OpenSocial RPC API を使って、電力使用状況と節電を呼びかける でんこちゃん 社内 bot の作り方を紹介します。

でんこちゃん社内 bot

就業時間中の1時間に1度、でんこちゃん bot がタイムラインに節電を呼びかける投稿をします。このとき、現在の電力使用状況とその日の推移グラフも合わせて投稿します。



①でんこちゃん bot
②東京電力アプリのロゴ
③東京電力アプリのリンク先 http://www.tepco.co.jp/forecast/index-j.html
④電力使用状況
⑤電力使用状況の推移グラフ (クリックすると、次のとおり拡大する)


でんこちゃんユーザの作成

コントロールパネルで、でんこちゃんを表すユーザを作成します。ここでは、メールアドレスを denkochan@lrlab.to とします。

東京電力アプリの作成

コントロールパネルで、東京電力を表すアプリを作成します。



アプリのガジェットXMLは次のとおりです。アプリのタイトルは東京電力とし、アイコンは Twitter 公式アカウント から拝借します。アプリは、コンテンツを持たせず、東京電力サイトにリンクさせます。
<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="東京電力" description="東京電力から節電のお願いです">
<Link rel="icon" href="http://a0.twimg.com/profile_images/1276730827/tepco_normal.JPG" />
</ModulePrefs>
<Content type="url" href="http://www.tepco.co.jp/forecast/index-j.html"></Content>
</Module>
コンシューマキーとシークレットの入手

2-legged OAuth のコンシューマキーとシークレットは、コントロールパネルから入手できます。OpenSocial RPC API のエンドポイント (URL) も同様です。


バッチの作成

東京電力 から LWP::Simple を使って、電力の使用状況データ (CSV) をダウンロードします。そして、最新の電力使用状況を集計し、Google Chart API を使って、当日の推移グラフを作成します。
use strict;
use warnings;

use LWP::Simple;
use Encode 'decode_utf8';

my $url = 'http://www.tepco.co.jp/forecast/html/images/juyo-j.csv';
my @rows = split(/\r\n/, get($url));

shift @rows;
shift @rows;

# ピーク時供給力(万kW)
my ($cap) = split(/,/, shift @rows); 

shift @rows;
shift @rows;

# 24時間分の当日実績(万kW)
my @hours = map {
    my @cols = split(/,/, $_); $cols[2];
} @rows;

my $latest;

# 最新の当日実績(万kW)
for (reverse(@hours)) {
    last if $latest = $_;
}

# 電力使用率
my $per = sprintf('%.1f', $latest / $cap * 100);

# 当日実績(万kW)の推移グラフ
my $chart = 'http://chart.googleapis.com/chart' . 
    '?chs=400x240' .
    '&cht=bvo' .
    "&chxr=0,0,$cap|1,0,23" .
    '&chxt=y,x' .
    '&chbh=10' . 
    '&chd=t:' . join(',', map { int($_ / $cap * 100) } @hours);
続けて、Activities API を使って、電力使用状況を 3arrows に投稿します。アクティビティの作成を JSON RPC で組み立て、OAuth::Lite::Consumer を使って、リクエストを署名して発行します。

API の Endpoint、Consumer Key、Consumer Secret には、前述のコントロールパネルから入手した値を指定します。また、xoauth_requestor_id には、でんこちゃん(投稿者) を表す denkochan@lrlab.to を指定しています。

アクティビティの作成に成功すると、アクティビティID がレスポンスされます。万が一失敗したときは、JSON RPC のエラーか HTTP ステータスのエラーがレスポンスされます。
use Data::Dumper;
use JSON::XS;
use OAuth::Lite::Consumer;

# アクティビティのタイトル
my $title = <<EOB;
じゃん! 電気を大切にね。
> 電力使用状況 $cap 万kW 中 $latest 万kW ($per%)
> $chart
EOB

# アクティビティの作成を表す JSON RPC
my $content = JSON::XS::encode_json({
    jsonrpc => '2.0',
    method => 'activities.create',
    params => {
        userId => '@viewer',
        group => '@self',
        activity => { title => decode_utf8($title) } # UTF-8 フラグ
    },
    id => 1
});

# API の Endpoint, Consumer Key, Consumer Secret, Viewer
my %options = (
    endpoint => 'http://nakajiman.3arrows.jp/api/rpc/a',
    consumer_key => '{consumer key}',
    consumer_secret => '{consumer secret}',
    requester_id => 'denkochan@lrlab.to',
);

my $consumer = OAuth::Lite::Consumer->new(
    consumer_key => $options{consumer_key},
    consumer_secret => $options{consumer_secret}
);

# リクエストの署名と発行
my $response = $consumer->request(
    method  => 'POST',
    url => $options{endpoint},
    headers => [ 'Content-Type' => 'application/json' ],
    content => $content, 
    params => {
        xoauth_requestor_id => $options{requester_id},
    });

# リクエストの成否
if ($response->is_success) {
    print Dumper(JSON::XS::decode_json($response->decoded_content));
} else {
    warn $response->status_line;
}

1;
バッチの実行

就業時間の 9:00 から 18:00 の間で、1時間に一度、バッチを実行するように cron を登録します。

ダウンロード

でんこちゃん社内 bot のソースコードは、次のページからダウンロードできます。

ダウンロード - 3arrows.jp
https://sites.google.com/a/socialprise.jp/3arrows-jp/downloads