ソラマメブログ

2010年10月21日

セカンドライフからTwitterしてみました^^



Twitterのアカウントはずっと前に取得していたのですが、そんなことすら忘れたまましばらく放置してました。
TVなどでTwitterのことが取り上げられるたびに、なんかやる気が失せるというか・・・
ひねくれてるんですよねー


そんなワタシにkiddさんから、「Twitterしないの?Twitterなんでもいいからつぶやいたらどう?」と勧められて、重い腰をあげたわけですが、せっかくなので、セカンドライフからつぶやくことを目標にはじめてみました。


セカンドライフからTwitterしてみました^^


※以下、いまさらな内容ですが、OAuthと格闘しながらセカンドライフからTweetできるようになるまでの試行錯誤のメモです。



* * *

■もうちゃんとしたサービスあるやん

「セカンドライフからつぶやく」
そう目標設定するとなんかやる気がわいてきたのですが、ちょっと検索してみるだけでセカンドライフからTweetするツールって結構あるみたいですね。
特に、こちらのサービス(SLITTERさん)はユーザインタフェースも含めてすごく作りこんでいらっしゃって今更自作ツール作ってもと、早くもくじけちゃいました。

自作するのではなくサービス利用したい方はいますぐSLITTERさんへ訪問するといいかも。
(ワタシはまだ登録してませんのでご質問にはお答えできません。あしからずご了承くださいませ)


■OAuth認証って?

その次の日。
くじけながらもとりあえずセカンドライフからTweetするのに必要な情報をいろいろ調べてみると、前は簡単にBasic認証でアクセスできたのが、最近は「OAuth認証」を使わないとダメってことがわかりました。

早速しらない言葉がでてきました。「OAuth認証」って何?

詳しくは、@ITのページに解説記事がありましたが、すごく面白い考え方ですよねー

@IT「APIアクセス権を委譲するプロトコル、OAuthを知る」

ユーザがもつすべてのリソースにアクセスできるか、まったくアクセスできないか。
従来の考え方では、その制御しかできなかったんだそうです。
OAuthは、リソースの一部だけの許可を与えるために考えられた認証プロトコルですね。

具体例でいうと、Twitterを使うとき、最初にログインしますよね?
ユーザは直接Twitterのサイトにアクセスして、IDとパスワードを入力してログインすると、そのあとつぶやいたりできますが、それ以外に表示の変更とかプロフィールの変更とかもできるようになっています。

別のサイトBで新しいサービス・・・例えば自動でなにかつぶやくようなbotを作ることを考えます。
サイトBでは、自動でつぶやくためのプログラムが動いているわけです。
このプログラムが実際につぶやくとき、Twitterにログインしないとつぶやけないわけなので、なんらかの形でサイトBに対してIDとパスワードを教えてあげる必要があります。

リモートからのアクセスでTwitterのすべての機能を使えるわけではなくて、実際には公開されているAPIの機能しか使えないのですが、それでもユーザ情報のすべてを書き換えることのできる大事なIDとパスワードをサイトBに委託することは本当に安全なのでしょうか?

OAuth認証はそんな不安を少し取り除いてくれそうです。

OAuthの場合、サイトBはユーザ情報とまったく関係のない「コンシューマ」用の情報しか持っていません。
サイトBがユーザの代わりに「つぶやき」サービスを実施するとき、最初に1回Twitterの画面を表示させてログイン&コンシューマにサービスを許可という手続きをさせます。

Twitterの場合はこんな画面がでます。

セカンドライフからTwitterしてみました^^

この画面はTwitterのサイトが表示しているもので、入力もサイトBを経由せず直接Twitterのサイトに送信されます。
意味は、Twitterサービスの一部(=つぶやきとかに関わるサービス)をサイトBに承認しますがいいですか?ってこと。
ユーザが承認すると、画面はサイトBに移り、サイトBのサービスを継続しますが、サイトBの方では、「ユーザに認証してもらった」という情報しか伝わらず、ユーザID・パスワードは関知しないというのがポイントです。

手続きは複雑になるけど、面白い考え方だと思いませんか?



■動きを理解するためのCGIサンプル

考え方がわかっても、これを動かすためのスクリプトを書いてみる・・・みたいなことはワタシには無理なので、サンプルプログラムを探してみました。
いろいろ落ちていましたけど、ワタシ的にはみのねっとぶろぐさんのスクリプトが非常に参考になりました。

Twitter OAuth認証サンプル - みのねっとぶろぐ

※すばらしいサンプルありがとうございました。

早速、サーバーにおいてみるのですが、なんかライブラリとかも必要で、よくわからないまま悪戦苦闘。
結局詳しいお友達の力も借りてようやくサンプルを動かせました。

動かして体験すると理解も早いです。
その後で読んだ公式ページの解説もイメージがあるので読みやすかった気がします。

Authenticating Requests with OAuth


ま・細かいとこまで理解できなかったけどなんとなくこんなもんなのねていうとこまで。

それから公式ページにあったチャート。
これも大事やよね。直リンしてみます。

←クリックで元画像表示



■LSLからTweetするためのライブラリ

CGI経由でTweetできるようになったので、あとはこれをセカンドライフの中から呼び出すだけよね。
と思ってたのですが、サンプルとか探しているうちに面白いもの発見しました。

セカンドライフからTwitterしてみました^^

Twitter OAuth Library - Second Life Wiki

LSLだけで、OAuth認証できるライブラリです。
CGIを使う方法だとサーバを用意しないといけないのですが、このライブラリでは、llRequestURL()を利用してオブジェクト自身がサーバの代わりになるという動きをしています。

ライブラリとサンプルのセットで、MarketPlaceから0L$で入手できます。

Twitter OAuth Library 1.0

LSLだけでというところは素晴らしいですよね。
実は、「セカンドライフからTweetする」という当初の目的には、このライブラリがあれば十分なのでした。


でも、せっかくCGIのサンプルを手に入れたことだし、LSLからCGI経由でTweetすることにしてみました。



■LSLからCGIをコールする(GET/POST)

LSLから外部のページを呼び出すときに使用する
llHTTPRequest()という関数は、Youtubeのときにも使った気がするんですけど、まったく覚えてなくて・・・
またイチから勉強しなおしです。
OAuthでは、GETとPOST両方でてくるので一応どちらにでも対応できるように関数化しました。

  key HTTP_reqest(string url, string method, list parm) {
    key reqid = NULL_KEY;
    string str = "";
    string dlm = "";
    integer i;
    integer n = llGetListLength(parm);
    for (i = 0; i < n; i+=2) {str += dlm + llList2String(parm, i) + "=" + llList2String(parm, i + 1); dlm = "&";}
    
    if (method == "GET") {
      reqid = llHTTPRequest(url + "?" + str, [HTTP_METHOD, "GET"], "");
    }
    else if (method == "POST") {
      reqid = llHTTPRequest(url, [HTTP_METHOD, "POST", HTTP_MIMETYPE, "application/x-www-form-urlencoded"], str);
    }
    return reqid;
  }


パラメータの引渡しでエスケープした方がいいかなと思ったのですが、ウチのサーバでのテストでは問題なく日本語が通るので省略してます。気になる場合は、パラメータ組立のとこを以下のように変更してください。
for (i = 0; i < n; i+=2) {str += dlm + llList2String(parm, i) + "=" + llEscapeURL(llList2String(parm, i + 1)); dlm = "&";}




■LSLからCGI経由でTweet

長くなりましたが、これで準備が整ったので結合します。

CGIは先に紹介したみのねっとぶろぐさんのスクリプトを元に以下の変更をしました。
(1)ブラウザに出力するところを、LSLに戻すために簡略化した。
(2)サンプルでは、HTMLで値をキープするようになっていたのをサーバで管理するように変更

LSL側はシンプルに
(1)チャットメッセージをCGIに送信
(2)OAuthのための認証画面リダイレクトの戻りがきたとき、llLoadURL()で認証画面をブラウザに表示
ってことしかやってません。

てかワタシのレベルでは、そんなに大胆に作りかえれないのですが、ここまで変更するのに結構時間がかかってしまいました。
でも、やっと・・・

やっとセカンドライフから発言したものがTwitterに出力できたとき。
ちょっと涙がこぼれました・・・
あは^^

セカンドライフからTwitterしてみました^^

セカンドライフからTwitterしてみました^^

※発言したSIM名を自動的に付加するようにしてます。

* * *

あいかわらずなんの役にも立たないメモですいません。
そんなメモなんですが、間違いとかあればご指摘いただけるとうれしいです。



(おまけ)
画像が寂しいのでちょっと演出入っちゃいましたが、実際のところこんな感じです。

セカンドライフからTwitterしてみました^^




同じカテゴリー(Creation)の記事画像
なんとなく目玉クリップを作ってみました^^
お花いっぱいの場所でいろいろ教えていただきました^^
ライオンみたいなものを作ってみました^^
1プリムのキャンドルに挑戦してみました^^
夏のお洋服つくってみました^^
W杯で寝不足だったりします^^;
同じカテゴリー(Creation)の記事
 なんとなく目玉クリップを作ってみました^^ (2011-09-25 22:50)
 お花いっぱいの場所でいろいろ教えていただきました^^ (2011-04-17 14:59)
 ライオンみたいなものを作ってみました^^ (2011-03-31 09:41)
 1プリムのキャンドルに挑戦してみました^^ (2010-12-11 23:55)
 夏のお洋服つくってみました^^ (2010-08-15 10:08)
 W杯で寝不足だったりします^^; (2010-06-28 04:40)

Posted by jinko at 11:16│Comments(0)Creation
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。