llHTTPRequest() を用いた外部鯖との通信に関するメモ
1. 基礎知識
1-a) llHTTPRequest() を使って POST 送信する (LSL)
- HTTP_MIMETYPE を “application/x-www-form-urlencoded” にする
- 送信内容は BODY に記載する
string URL = "http://hoge.com/foo/bar.php"; list PARAMS = [HTTP_METHOD, "POST", HTTP_MIMETYPE, "application/x-www-form-urlencoded"]; string BODY = "key1=value1&key2=value2"; key RequestID = llHTTPRequest(URL, PARAMS, BODY);
1-b) 外部鯖で PST/PDT を取得する (PHP)
date_default_timezone_set を America/Los_Angeles に設定すると通信発生時の PST / PDT を取得できるため、LSL 側からタイムスタンプを送信する必要はない。PST / PDT の切替も PHP 任せで良い(勝手に夏時間に変更してくれる)。
<?php date_default_timezone_set("America/Los_Angeles"); $today = date("Y-m-d H:i:sT"); // ex) 2018-03-30 22:33:03PDT
1-c) 外部鯖で送信元の情報を取得する (PHP)
llHTTPRequest() を使いインワールドから外部鯖にアクセスした場合、$_SERVER に以下の情報が格納されている1)ため、特に LSL 側から送信せずとも情報を取得できる。
- $_SERVER[“HTTP_X_SECONDLIFE_OBJECT_NAME”] ⇒ 送信元オブジェクト名
- $_SERVER[“HTTP_X_SECONDLIFE_OBJECT_KEY”] ⇒ 送信元オブジェクト UUID
- $_SERVER[“HTTP_X_SECONDLIFE_REGION”] ⇒ 送信元オブジェクトが置かれているリージョン名とその座標 ex) Serpentata (257792, 263168)
- $_SERVER[“HTTP_X_SECONDLIFE_LOCAL_POSITION”] ⇒ 送信元オブジェクトのリージョン座標 ex) (164.346359, 106.232956, 104.000000)
- $_SERVER[“HTTP_X_SECONDLIFE_OWNER_NAME”] ⇒ 送信元オブジェクトの所有者名 ex) fk0724 Resident
- $_SERVER[“HTTP_X_SECONDLIFE_OWNER_KEY”] ⇒ 送信元オブジェクトの所有者 UUID
2. 実践その1 インワの状態を自鯖に送信し、そのログを保管する
2-a) LSL側の仕様
- 以下のログを収集し、外部鯖の PHP に投げる
- ギフトお持ち帰りログ
- ブロガーパックお持ち帰りログ
- ガチャのアイテム交換ログ
- 実装はユーザ関数で行い、各種スクリにコピペで動くようにする
2-b) ユーザ関数 : uuPushLog(string type, string av_name, key av_key, string extension)
- string type : 何に関するログなのか(G : ギフト / B : ブロガーパック / E : 交換)
- string av_name : アバター名
- key av_key : アバターの UUID
- string extension : 通信内容の拡張
key uuPushLog(string type, string av_name, key av_key, string extension){ string URL = "http://hoge.com/foo/bar.php"; list PARAMS = [HTTP_METHOD, "POST", HTTP_MIMETYPE, "application/x-www-form-urlencoded"]; string BODY = "type=" + llEscapeURL(type); BODY += "&avname=" + llEscapeURL(av_name); BODY += "&avkey=" + (string)av_key; BODY += "&extension=" + llEscapeURL(extension); return llHTTPRequest(URL, PARAMS, BODY); }
2-c) PHP 側の仕様
- 受け取ったデータをどうするのか? という部分は逐次変更する可能性があるため、LogSaveClass として切り離しておく
- 1日単位のテキストデータとして鯖に保管する ⇒ ./save/oneday.php
- 種類別のテキストデータとして鯖に保管する ⇒ ./save/type.php
- とにかく全データを MySQL に入れてしまう ⇒ ./save/mysql.php e.t.c.
- LogSaveClass に以下のデータを受け渡す
- 受信日時
- $_SERVER 各種
- $_POST 各種
2-d) PHP での受信部分の実装
LogSaveClass にデータを渡すだけのもの。
<?php date_default_timezone_set("America/Los_Angeles"); header("content-type: text/plain; charset=utf-8"); require_once('save/oneday.php'); $LOG = new LogSaveClass; $LOG->save(date("Y-m-d H:i:sT"), $_SERVER, $_POST);
1)
一部抜粋 / 参照 : http://wiki.secondlife.com/wiki/LlHTTPRequest