ラベル Python の投稿を表示しています。 すべての投稿を表示
ラベル Python の投稿を表示しています。 すべての投稿を表示

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 を使用します。

2009年9月1日火曜日

Blogger用MT形式修正スクリプト

昨日の記事の ブログのコメントがおかしくなりました;; のBlogger用XMLへのコンバートについて書きますね^^

ソラマメ管理画面の読み込み・書き出しから、ブログ記事をMovable Type形式(MT形式)のデータでダウンロードできるんですね。その際、文字コードはUTF-8を指定してください。

そして、保存したMT形式データはMovableType2Blogger conversion utilityでBlogger用データに変換できるんですが、このコンバーターはまだ完成度が低いみたいで、日付データが12時間表記じゃないとエラーが出るんですよw
あと、文字コードはUTF-8でもBOM無し?でないとダメみたいです。試しにWindows XPのメモ帳でUTF-8保存したMT形式ファイルを使うとエラーになりました。

なので変換エラーが出なくなるように、時刻の24時間表記を12時間表記に変換して、記事の投稿時間のずれを調整するPythonスクリプトを書いてみたんです。Pythonはちょっとかじった程度にしか使ったことなかったんですが、Blender使ってる人だったらインストールされてるので使用しました。

#!/usr/bin/env python

import sys,re,datetime

if len(sys.argv) <= 1:
  print "Usage: "+sys.argv[0]+" filename"

else:
  s="dummy"
  text=""
  f=open(sys.argv[1])
  while s != "":
    s=f.readline()
    m=re.match("(^DATE: )(\d{2}/\d{2}/\d{4} \d{2}:\d{2}:\d{2})(\r{0,1}\n{0,1}$)",s)
    if m:
      data=m.group(2)
      dt=datetime.datetime.strptime(data,"%m/%d/%Y %H:%M:%S")
      dt=dt+datetime.timedelta(hours=-9)
      data=dt.strftime("%m/%d/%Y %I:%M:%S %p")
      s=m.group(1)+data+m.group(3)
    text+=s
  f.close()

  new="conv_"+sys.argv[1]
  f=open(new,"w")
  f.write(text)
  f.close()
  print "Saved to "+new

このスクリプトをmt4blogger.pyって名前で保存して、Windowsだったらコマンドプロンプトを開いて、スクリプトとデータの置いてあるフォルダで次のように入力します。Pythonのインストールされてるフォルダも確認してパスを合わせてくださいね。
c:\python26\python mt4blogger.py blog-UTF-8.txt
blog-UTF-8.txtはソラマメからダウンロードしたデータファイルです。実行すると変換されたデータがconv_blog-UTF-8.txtってファイル名で作成されますので(上書きの確認とかありませんw)、そのファイルをMovableType2Blogger conversion utilityでコンバートしてください。

Pythonのtimeとかdatetimeがややこしくて時差の調整でかなりつまずきました。その時いろいろ検索してたら、ソラマメでは既にweb上で変換できるサービスを公開されてる方がいたんですよw
bloggerに簡単引っ越し(ちょっち修正(mayuko Nishiさん)
んー、もう書きかけのスクリプト放り出して、そちらを利用させてもらおうかな。。。って思ったんですが、もうちょっとで完成って感じだったので何とか諦めずに書き上げたんですけどね^^;

9月5日追記: Blogger形式にコンバートすると追記だった部分やコメント部分の改行だけの行が失われちゃうみたいですね。