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

2011-03-30

3arrows アップデート! Google Apps アカウントでログインできるようになりました。

3月28日(月)、企業やチーム向けのプライベートマイクロブログ、3arrows をアップデートしました。アップデートの主な内容は次の通りです。

Google Apps アカウントでログインできるようになりました!

コントロールパネルの 「ユーザーの管理」 画面で、「Google Apps アカウントでログインする」 のチェックボックスにチェックを入れると、以後、3arrows に Google Apps アカウントでログインできるようになります。

なお、Google Apps for Business をご利用の方は、Google Apps の OpenID の設定を有効にする必要があります。


「ログイン」 画面では Google Apps アカウントのドメインを入力してください。


今回の Google Apps アカウントへの対応で、3arrows は個人間のコラボレーション、企業内のコラボレーション、企業間のコラボレーションを支援できるようになりました。

3arrows では、異なるドメインのメールアドレスのユーザー、異なるドメインの Google Apps アカウントのユーザーを、区別せずメンバーとして招待することができます。


全てのアプリケーションの更新をお願いします!

管理者の方は、コントロールパネルのアプリケーションタブから、全てのアプリケーションを更新してください。「更新する」 リンクをクリックすると、アプリケーションを更新できます。「最新」 と表示されれば更新の完了です。


3arrows では、引き続き α テストのユーザーを募集しています。サインアップの手続きはとても簡単です。数分ですぐに利用を始めることができます。企業や個人等、利用条件に制限はありませんので、この機会にぜひお試しください。

2011-03-21

Google Apps Script に続けて Windows Script Host (WSH) で 2-Legged OAuth をやってみました

こんにちは。なかじまん @ YOKOHAMA です。
東北関東大震災で被災された皆さまには心よりお見舞い申し上げます。



Google Apps Script の UrlFetch Services は 2Legged OAuth に対応してないっぽいので自前でやってみた に続いて、Windows Script Host (WSH) を使って Windows のコマンドラインから 2-Legged OAuth をやってみました。

WSH の場合、いろいろな実装方法を選択できそうなのですが、前述の Google Apps Script の JavaScript をそのまま動かす方法を選択しています。

なので、ソースコードはほとんど同じで、UrlFetch Services ではなく XMLHttpRequest を同期で使っているくらいの違いです。
<job>
<script language="JavaScript" src="sha1.js"></script>
<script language="JavaScript" src="oauth.js"></script>
<script language="JavaScript" src="json2.js"></script>
<script language="JavaScript">

  var endpoint = 'http://nakajiman.3arrows.jp/api/rpc/a';
  var consumerKey = '{Consumer Key}';
  var consumerSecret = '{consumer Secret}';
  var requestor_id = 'nakajiman(at)lrlab.to';

  var message = { method: 'POST', action: endpoint, parameters: {} };

  OAuth.setParameter(message, 'oauth_consumer_key', consumerKey);
  OAuth.setParameter(message, 'oauth_version', '1.0');
  OAuth.setParameter(message, 'oauth_timestamp', OAuth.timestamp());
  OAuth.setParameter(message, 'oauth_nonce', OAuth.nonce(6));
  OAuth.setParameter(message, 'xoauth_requestor_id', requestor_id);

  OAuth.SignatureMethod.sign(message, { consumerSecret: consumerSecret });

  var url = OAuth.addToURL(endpoint, message.parameters);
  var data = JSON.stringify({
      jsonrpc: '2.0',
      method: 'activities.create',
      params: { userId: '@viewer', group: '@self', activity: { title: 'Say hello!' } },
      id: 1
  });
  
  var xhr = WScript.CreateObject('MSXML2.XMLHTTP');
  xhr.open(message.method, url, false);
  xhr.setRequestHeader('Content-Type', 'application/json');
  xhr.send(data);
  
  if (xhr.status != 200)
    WScript.Echo(xhr.status + ' ' + xhr.statusText);
  else {
    var res = JSON.parse(xhr.responseText);
    WScript.Echo(res.result);
  }

</script>
</job>
ただいま、 企業やチーム向けのプライベートマイクロブログ 3arrows では、お客様のシステムやサービスとの連携を目的とした「シングルサインオン」と「2-Legged OAuth ベースの API」に取り組んでいます。

2-Legged OAuth ベースの API 公開により、システムやサービスの統合に加えて、Google Apps Script や Windows Script Host から 3arrows を操作して、ユーリティティの用途としても活用できるようになります。

2011-03-07

3arrows アップデート! 投稿内容を引用して返信できるようになりました! Gmail や Trac のような明瞭な引用です!

3月2日(水)、企業やチーム向けのプライベートマイクロブログ、3arrows をアップデートしました。アップデートの主な内容は次の通りです。

ステータスの引用機能の追加

マイクロブログの各ステータスを引用できるようになりました。


Twitter の以前の RT 機能と類似の機能となりますが、引用したステータスがそれと分かるようにスタイリングされ、また、3arrows は Twitter と比較して文字数の制限が緩いため、ステータスを途中で切ることなく引用することができます。

ステータス上でのアプリケーションのアイコンと名前の表示

日報等、各アプリケーションからマイクロブログに通知されたステータスには、それと分かるようにアプリケーションのアイコンと名前を表示するようになりました。


これにより、どのアプリケーションからの通知なのかが一目で分かるようになります。

全てのアプリケーションの更新をお願いします!

管理者の方は、コントロールパネルのアプリケーションタブから、全てのアプリケーションを更新してください。「更新する」 リンクをクリックすると、アプリケーションを更新できます。「最新」 と表示されれば更新の完了です。


3arrows では、引き続き α テストのユーザーを募集しています。サインアップの手続きはとても簡単です。数分ですぐに利用を始めることができます。企業や個人等、利用条件に制限はありませんので、この機会にぜひお試しください。

Facebook のプロフィール写真をウェブカメラを経由でアップロードしてみた。ウェブカメラから multipart/form-data で静止画をアップロードできるライブラリを探しています。

こんにちは。Nobuhiro Nakajima です。

Facebook のプロフィール写真は、ウェブカメラを経由してウェブブラウザからアップロードできるらしいので試してみました。

手持ちのウェブカメラは マイクロソフト ウェブカメラ LifeCam VX-800 JSD-00006 です。↓これ。今なら 1,000 円くらいで入手できます。

マイクロソフト ウェブカメラ LifeCam VX-800 JSD-00006

プロフィール写真の設定ページから写真を撮るボタンをクリックすると、ポップアップが開きます。許可をクリックすると、ウェブカメラの映像が移り出すので、カメラボタンをクリックして、写真を撮ります。



すると、次のとおり、ウェブカメラで撮影した静止画がプロフィール写真として掲載されます。



ウェブカメラからの写真の撮影は Flash で実現されています。Flash 内で、ウェブカメラのストリームを扱い撮影のタイミングで静止画にして、サーバにアップロードするという仕組みのようです。

同じことをやってみたくて、ライブラリなどを探していると、いくつか発見できました。例えば、これとか。

jQuery webcam plugin - Website and Application Intelligence
This plugin provides three different modes to access a webcam through a small API directly with JavaScript - or more precisely jQuery.
ただ、今まで見つけたライブラリは、静止画のデータを HTTP POST の raw データとしてアップロードするものでした。これだと AppEngine の Blob Storage に直接アップロードできないのです。

ということで multipart/form-data でウェブカメラから静止画をアップロードできるライブラリを探しています。もしも、ご存じでしたらぜひ教えてください。

2011-03-03

3arrows アップデート! 無料プラン、独自ドメイン/専用環境プラン、OEM プランを追加しました。

3 月 1 日 (火)、企業やチーム向けのプライベートマイクロブログ、3arrows料金表を改定しました。改定の主な内容は次の通りです。

無料プランの追加

3arrows を無料で利用できるプランを追加しました。今後、ユーザー数が 5 人以内の場合、3arrows は無料で利用できます。

独自ドメイン/専用環境プランの追加

3arrows を独自ドメイン、専用環境で利用できるプランを追加しました。セキュリティポリシー上、共用環境での利用が難しかったお客様でも、今後は独自ドメイン、専用環境で 3arrows を利用できます。(有料になります。)

OEM プランの追加

3arrows を OEM として、お客様のブランドで提供したり、お客様のサービスに組み込んで提供できるプランを追加しました。3arrows は柔軟で堅牢なアーキテクチャーの元で実装されているため、デザイン、機能ともにフルカスタマイズした上で提供することが可能です。

3arrows では、引き続き α テストのユーザーを募集しています。サインアップの手続きはとても簡単です。数分ですぐに利用を始めることができます。企業や個人等、利用条件に制限はありませんので、この機会にぜひお試しください。

2011-03-02

Google Apps Script の UrlFetch Services は 2Legged OAuth に対応してないっぽいので自前でやってみた

こんにちは。なかじまんです。

Google Apps Script の UrlFetch Services は 2Legged OAuth に対応してないっぽいので自前でやってみた。ちなみに 3Legged OAuth は標準でできるみたいです。

はじめに JavaScript の OAuth ライブラリ の内sha1.js と oauth.jp oauth.js を貼り付けます。そして、次のようにリクエストを署名して、UrlFetch Services でエンドポイントを叩きます。

以下の例では、Google Friend Connect の People API を呼び出して、Viewer (xoauth_requestor_id) のプロフィールを取得して、ニックネームを表示しています。
function myFunction() {

  var action = 'http://www.google.com/friendconnect/api/people/@me/@self';
  var accessor = { consumerSecret: '{consumerSecret}' };
  var message = { method: 'GET', action: action, parameters: {}, };

  OAuth.setParameter(message, 'oauth_consumer_key', '{oauth_consumer_key}');
  OAuth.setParameter(message, 'oauth_version', '1.0');
  OAuth.setParameter(message, 'oauth_timestamp', OAuth.timestamp());
  OAuth.setParameter(message, 'oauth_nonce', OAuth.nonce(6));
  OAuth.setParameter(message, 'xoauth_requestor_id', '18200614986198926446');

  OAuth.SignatureMethod.sign(message, accessor);

  var url = OAuth.addToURL(action, message.parameters);

  var response = UrlFetchApp.fetch(url, {method: message.method });
  if (response.getResponseCode() == 200) {
    var res = JSON.parse(response.getContentText());
    Browser.msgBox(res.entry.displayName);
  }
}
今回は Query String で試しましたが Authorization Header でも大丈夫なはず。

ということで Google Apps Script から 2Legged OAuth できちゃいました。