2007年8月24日金曜日

Twitterクライアント for SL作成の続き

さて、これまで2つほどSecond Lifeから使えるTwitterクライアントを試してみたのですが、どれもアップデートはできるが日本語メッセージを受信すると文字化けしてしまうということで、やっぱ自分で作ってみることにしてみました。

前回作ったステータスアップデートの動作テストや2つほど試したクライアントの動作状況から考えて、lslのみでクライアントを作るのは困難な様子。
ちなみに、lslのみでステータスのアップデートは可能ですが、http_responseのbodyには「Unsupported or unknown Content-Type.」と帰ってきてしまいます。
ということでlslのみはあきらめて、間にPHPを使ったWebアプリをかますことに・・・

なぜPHPなのかは、特に深い意味はないのですが単に「Services_Twitter」というPearライブラリを使ってみたかっただけ(笑)
いや、これが簡単で便利なのですよ。

アップデートについては大体分かっているので、先にtimelineの取得をやります。
・・・できました。
もちろんα版(というよりもまだ検証段階かw)なので、フレンドのTimelineから最新メッセージ1件だけを取ってきてllOwnerSayで返すだけです。

初めはPHPからの返り値をurlencode()で処理してたのですが、これを使うと半角スペースが「+」に変換されちゃうので、lsl側での処理がめんどう。
と言うことで、Base64を使っています。この方がデータ量もちょっと少なくなりますしね。

この調子で、次は複数メッセージの取得を考えてみます。
http_responseのbodyは2048byteしか受け取れないので最大で20件分のメッセージを一気に受け取ると取りこぼれが起きちゃうので、複数回に分けて受け取るようにしようかと・・・
このとき毎回Twitterにアクセスしちゃうと1時間に70リクエストの制限に引っかかっちゃう恐れがあるので、ここも考えないといけません。メッセージをPHP側で一時保存して処理するとか。
う~ん、Services_Twitterにキャッシュ機能があるようだけど、これ使えないかなぁ。


PHPソース

<?php
//ライブラリの準備
$PATH = get_include_path();
set_include_path($PATH . PATH_SEPARATOR . ’classes/’);
require_once ’Services/Twitter.php’;
require_once ’Jsphon.php’;

//変数の準備
$user = ’TwitterのユーザID’;
$pass = ’パスワード’;

//Twitterに接続
$st =& new Services_Twitter($user, $pass);
$st->enableJsonConvert();
$a = $st->getFriendsTimeline();

//SLに値を返してやる
$str = $a[0]["user"]["name"] . "(" . $a[0]["created_at"] . ")\n" . $a[0]["text"];
echo base64_encode($str);
?>



lslソース

//変数の準備
key requestid;

default
{
  state_entry()
  {
    llOwnerSay("Touch me, I will get recent message.");
  }
  touch_start(integer tcnumber)
  {
    state download;
  }
}

state download
{
  state_entry()
  {
    requestid = llHTTPRequest("http://上のPHPにアクセスするURL",[HTTP_METHOD,"GET"],"");
  }
  http_response(key request_id, integer status, list metadata, string body)
  {
    if (request_id == requestid)
    {
      llOwnerSay(0,llBase64ToString(body));
    }
    else
    {
      llOwnerSay(0,(string)status+" error");
    }
    state default;
  }
}

0 件のコメント: