前回作ったステータスアップデートの動作テストや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;
}
}