2010年7月20日火曜日

ピックギフトのスクリプト

今回はプロフィールのピックに土地を登録して頂いてる方にオブジェクトを渡す、簡単なピックギフト配布装置のスクリプトです^^ LSLだけでは無理なのでPHPなどが使える外部サーバーをご用意くださいね。

http://blogs.secondlife.com/community/technology/blog/2010/07/08/search-todays-release
ピック登録はもうサーチランクに影響しなくなったんですが、ピックを見て来てくれる人もいるし、沢山の方のピックに登録されてれば知名度とかは上がるんじゃないかなって思います。

今月、プロフのウェブページの仕様が変わってピックの部分だけ独立したページになりました。それでうちで販売してた装置も動作不能に陥ったんですが、購入者様は現在修正版をご入手可能です。

ピックの出てるアドレスはhttp://world.secondlife.com/resident/アバターUUID/picksなので、このページをチェックする部分を外部サーバーに置いたスクリプトで処理します。まずLSLスクリプトです。土地のUUIDはllGetParcelDetailsにサーバー1.36で追加されたPARCEL_DETAILS_IDで調べます。
// Profile picks gift
string url="http://○○○.××/picks.php";  // 外部サーバーに置いたスクリプトのアドレス

default
{
    touch_start(integer total_number)
    {
        key id=llDetectedKey(0);  // タッチしたアバターのキー
        if (id) {
            key place=llList2Key(llGetParcelDetails(llGetPos(),[PARCEL_DETAILS_ID]),0);  // 土地のUUID取得
            llHTTPRequest(url,[HTTP_METHOD,"POST", HTTP_MIMETYPE,"application/x-www-form-urlencoded"],"place="+(string)place+"&id="+(string)id);  // 外部サーバーにデータを送ってチェック
        }
    }

    http_response(key request_id, integer status, list metadata, string body)
    {  // HTTPレスポンス
        if (status != 200) llWhisper(0,"Error - status "+(string)status);  // ステータス200以外はエラー表示
        else {
            body=llStringTrim(body,STRING_TRIM);  // 改行コードを除去
            list l=llCSV2List(body);  // カンマで分割してリストに格納
            key id=llList2Key(l,0);  // アバターのキー
            string result=llList2String(l,1);  // 結果
            if (id) {
                if (result == "OK") {  // OKだったら
                    llGiveInventory(id,llGetInventoryName(INVENTORY_OBJECT,0));  // コンテンツ内の最初のオブジェクトを渡す
                    llInstantMessage(id,"Thank you for having our place in your picks.");
                }
                else {  // NGのとき
                    llInstantMessage(id,"Our place not found in your picks. ('Show in search' must be enabled) Please add this place in your picks and try again 1 or 2 days later.");
                }
            }
            else llOwnerSay("Data error!");
        }
    }
}

そして外部サーバーに設置するPHPスクリプトです。ピックに土地のキーが載ってれば「アバターUUID,OK」、載ってなかったら「アバターUUID,NG」を出力します。
<?php
// picks.php

// フォームデータ取得
$id=isset($_REQUEST['id'])? $_REQUEST['id']:"";  // アバターのキー
$place=isset($_REQUEST['place'])? $_REQUEST['place']:"";  // 土地のキー

if (!$id || !$place) exit;  // フォームデータがなかったら終了

// プロフィールのピックページからデータ取得
$data=implode("",file("http://world.secondlife.com/resident/".$id."/picks"));

// 土地のキーの有無を調べて結果を出力
if (strpos($data,'/place/'.$place.'">')) echo $id.",OK";
else echo $id.",NG";
?>

PHP対応してないサーバー用に一応Python版も書いてみました。うちで借りてるサーバーはPython対応じゃなかったので、きちんと動作テストできてないですけどw
#!/usr/bin/env python

# picks.py

import sys,urllib,cgi

form=cgi.FieldStorage()
id=form.getvalue("id")
place=form.getvalue("place")

print "Content-Type: text/plain; charset=UTF-8\n\n"

if id == None or place == None:
  sys.exit()

fp=urllib.urlopen("http://world.secondlife.com/resident/"+id+"/picks")

if fp.read().find('/place/'+place+'">') > -1:
  print id+",OK"
else:
  print id+",NG"


え? Perlですか? Perlはちょっと文法が嫌いなので。。。す、すみません>< 今度できたら載せたいと思います。;

2時10分頃追記: Pythonは500エラー出たので日本語のコメント行消しました。たぶんコメントでも日本語を入れるときは文字コード指定みたいなのがいるんですかね?

22時20分頃追記: Pythonの文字列検索部分に>が抜けてたので付け加えました。

7月21日追記: Perlも書けたので載せます^^
#!/usr/bin/perl

# picks.pl

use CGI;
use LWP::Simple;

# フォームデータ取得
$q=new CGI;
$id=$q->param('id');
$place=$q->param('place');

# サーバー用ヘッダ
print "Content-Type: text/plain; charset=UTF-8\n\n";

# フォームデータがなかったら終了
if ($id eq "" || $place eq "") {
  exit;
}

# プロフィールのピックページからデータ取得
$data=get("http://world.secondlife.com/resident/$id/picks");

# 土地のキーの有無を調べて結果を出力
if (index($data,'/place/'.$place.'">') > -1) {
  print "$id,OK";
}
else {
  print "$id,NG";
}



2012年1月5日追記: Pythonですが、Google App Engineを使用する場合はurllibが使えないので urllib.urlopen の代わりに urlfetch.fetch を使用します。

0 件のコメント:

コメントを投稿