2010年7月12日月曜日

(LSL)imgタグに頼らないプロフ画像の取得方法

おはよーございます^^

さて、2010年7月上旬頃に行われたリンデンのwebページ改変によって、従来普及していたimgタグを読み込む方法ではプロフ画像の取得ができなくなってしまいました。お困りの方も多いと思います。(私も最初、あわてましたw)

先日、私がバージョンアップした製品で行った修正のエッセンスだけを抽出したサンプルスクリプトを作りましたので公開します。

ちなみにこのサンプルでは、このスクリプトを入れたプリムをタッチした人のプロフ画像を表示するようになっています。プロフ画像を登録していない人や公開していない人は、ブランク画像が表示されるようになっています。(正常系はテスト済です。プロフ登録のない人がタッチしたら、、、たぶん動くと思うけど保証はできません。あしからず^^; )

まずは、サクっとソースからw
---
// profile picture get
// 2010.07.12 snowlet Magic

integer side = ALL_SIDES; //ALL_SIDES or face number 0 through 5
string Texture_blank = "5748decc-f629-461c-9a36-a35a221fe21f" ;

//States
default
{
 state_entry()
 {
  llSetTexture(Texture_blank, side);
 }
 on_rez(integer start_param)
 {
  llResetScript();
 }
 touch_start (integer total_number)
 {
  // profile url set
  string URL_RESIDENT = "http://world.secondlife.com/resident/";
  llHTTPRequest( URL_RESIDENT + (string)llDetectedKey(0),[HTTP_METHOD,"GET"],"");
 }

 http_response(key req,integer stat, list met, string body)
 {
  string Meta_string = "<meta name=\"imageid\" content=\"" ;
  integer Meta_position = llSubStringIndex(body,Meta_string);
  integer Meta_length = llStringLength(Meta_string);
  integer UUID_length = 35 ; // RFC 4122
  string imageid = llGetSubString(body,Meta_position+Meta_length,Meta_position+Meta_length+UUID_length); // get profile image uuid
  if ((key)imageid != NULL_KEY){ // profile uuid check
   llSetTexture(imageid, side); // true
  }else{
   llSetTexture(Texture_blank, side); // false
   llSay(0,"No Image");
  }
 }
}
---

従来まで広く一般的に行われていた方法との違いです。

従来の方法)
 リンデンのプロフが表示されるwebページの中程に位置していたimgタグの情報を読み取ってプロフ画像のUUIDを拾っていた。

修正後の方法)
リンデンのプロフが表示されるwebページのヘッダ部分にメタタグ(imageid)としてプロフ画像のUUIDが埋め込まれているので、そちらを読み込むようにしました。

ちなみに、、、ソースをみて頂ければわかるとおもいますが、プロフ画像のUUIDは固定長として処理しています。まぁ、RFCで規定されてる規格なので、これで問題ないと考えてのことなのですが・・・w気になる方は、この辺もちゃんと処理するようにしてくださいね^^;

あと、画像が取得できなかった場合、画像のUUIDとしてNULL_KEYが返ります。今までみたいな、FALSEが帰ってくるとかではないので条件分岐などする場合はご注意ください。


写真のプロフ画像、ボケボケで申し訳ありません。長い時間放置したのですが、なぜかきちんと読み込みが完了しなくて・・・^^;;

0 件のコメント:

コメントを投稿