2008年03月09日
お知らせ自動配信機
HAVOK4移行に伴う不具合に関して、本日IM送信とノートカード配布を行いましたが、対象者が100人以上居たので、機械的に送信する仕組みを作りました。
その内容に関してメモしておきます。
まずは要求事項。
1.顧客リストを元にIMとノートカードを自動配信する。
2.今回は起動はオーナータッチで起動すれば良い。(将来的にはタイマー起動も欲しいかも?)
と言う事で、結論から言うと、以下のような仕様のスクリプトを作成しました。

オーナーがタッチすると起動し、顧客リスト(ノートカード)を1件づつ読込、顧客名を取得してLinkメッセージを使って子スクリプトを起動します。
子スクリプトは受け取った顧客名から、HTTPリクエストを行い、WEB経由でアバター名からUUIDを取得します。
取得したUUIDを元に、顧客のアバターへIMを自動送信し、更にコンテンツの中のノートカードを送信します。
送信したら「送信完了メッセージ」を親スクリプトへLinkメッセージで返します。
親は完了メッセージを受け取ると、5秒待ってから次のデータを顧客リストから読み込みます。
これを顧客リストの最後まで繰り返すと言う仕組みです。
ここでポイントになった事は、スクリプトからアバターへ、IM送信(llInstantMessage)、ノートカードの提供(llGiveInventory)共に、アバター名では無くアバターのUUIDを指定しなければならない事です。
ちなみに対象顧客リストは、SLのTransaction HistoryデータをEXCELで取得し、ACCESSに登録してあるので、そこから抽出しています。
しかしTransaction Historyにはアバター名は記録されてますが、当然アバターのUUIDは分かりません。
ここではUUIDが必要になります。
スクリプトの関数としては、UUIDからアバター名を取得する関数(llKey2Name)が存在しますが、その逆は存在しません。
しかし、痒い所に手が届くMakapuでは、ちゃんと逆パターンの取得方法が紹介されていました。
それがWEB経由でアバターのUUIDを検索できるサイトから取得する方法です。
今回は、そちらを利用させてもらってUUIDをスクリプト内に取り込んで処理しています。
ただ、HTTPリクエストで取得した場合、全員のUUIDは取得できませんでした。20件ちょっとがエラーになって取得できませんでした。
後から、直接HPへ行って、個別にアバター名を入力して検索したら、何故かちゃんと取得できました。
この辺は英語のサイトなので、どう言う風になっているのかまでは分かりません。
これでIMとノートカードの配布は自動的に、次々と処理されていきました。
ここで、もう一つ注意が必要な事は、今回の仕様では、IMとノートカードを送信した結果を受けて、次のデータを顧客リストから読み込んでいるのですが、スクリプト内部で送信完了として処理していても、実態はタイムラグもあるようで、間をおかずに進めると、途中で「スピードが速すぎる」と言ってスクリプトが落ちてしまいました。
どうもWEBとのやり取りが早過ぎて駄目だったようです。
そこで、例によって「間」を5秒ほど空けて、次のデータを読み込んで処理しました。
2秒でも十分だったのですが、途中でふと思ったのです。
「100件以上も連続で機械的にWEB接続かけたら、それってスパム行為と思われないかな~・・・」と言う事です。
まあ、5秒空けても一緒なんですけどね。気持ちです。^ ^;
と言う事で、めでたく処理は完了しました。
ちなみに、スクリプトを2つに分けたのは、1つのスクリプトだと連続的な処理構造が複雑になってしまうからです。
仮に顧客リストを内部のリストに格納してからであれば、一つのスクリプトで完結できたと思います。
しかし、100人以上の顧客名のリストは、残念ながら内部のリストに格納しきれんませんでした。
そこで、1件づつ読み込んで処理させたのです。
ノートカードを読み込む場合、読み込む命令を発行して、実際にデータを取得する部分は、dataserverイベントで行われます。
そして、HTTPリクエストをした場合、その結果を取得するのは、http_responseイベントになります。
一つのスクリプト内で書く場合は、双方のイベントでキックし合うような構造になってしまいます。
そこで、処理を単純化するために、「顧客カードを読み込む処理」と「HTTPリクエストする処理」を別スクリプトとして分離しました。双方のやり取りにはLinkメッセージを使ってます。
これだとループ的に処理させても、ループ部分はカードデータの読込部分だけになるので、比較的分かりやすく記述できると思います。
今回作ったスクリプトは汎用性も高いと思いますので、今後の顧客管理等にも上手く活用できるかも知れません。
ただ、一つだけ気になった事は、「アバターのUUIDって、勝手に調べて利用して良いの?」と言う事です。
う~ん。。。こう言うのって悪用する人が居なければ良いが・・・と思ってしまいました。
だって、例のテロオブジェクトを無差別に自動配布するなんて事もできてしまうのですよね。
勿論最低アバター名が分からなければ駄目ですけどね。
まあ、そんなこと言っても、SL内のアバター検索で、適当に検索して、プロフィールから送信もできてしまうのだから、気にしてもしょうがない話ですが。^ ^;
その内容に関してメモしておきます。
まずは要求事項。
1.顧客リストを元にIMとノートカードを自動配信する。
2.今回は起動はオーナータッチで起動すれば良い。(将来的にはタイマー起動も欲しいかも?)
と言う事で、結論から言うと、以下のような仕様のスクリプトを作成しました。

オーナーがタッチすると起動し、顧客リスト(ノートカード)を1件づつ読込、顧客名を取得してLinkメッセージを使って子スクリプトを起動します。
子スクリプトは受け取った顧客名から、HTTPリクエストを行い、WEB経由でアバター名からUUIDを取得します。
取得したUUIDを元に、顧客のアバターへIMを自動送信し、更にコンテンツの中のノートカードを送信します。
送信したら「送信完了メッセージ」を親スクリプトへLinkメッセージで返します。
親は完了メッセージを受け取ると、5秒待ってから次のデータを顧客リストから読み込みます。
これを顧客リストの最後まで繰り返すと言う仕組みです。
ここでポイントになった事は、スクリプトからアバターへ、IM送信(llInstantMessage)、ノートカードの提供(llGiveInventory)共に、アバター名では無くアバターのUUIDを指定しなければならない事です。
ちなみに対象顧客リストは、SLのTransaction HistoryデータをEXCELで取得し、ACCESSに登録してあるので、そこから抽出しています。
しかしTransaction Historyにはアバター名は記録されてますが、当然アバターのUUIDは分かりません。
ここではUUIDが必要になります。
スクリプトの関数としては、UUIDからアバター名を取得する関数(llKey2Name)が存在しますが、その逆は存在しません。
しかし、痒い所に手が届くMakapuでは、ちゃんと逆パターンの取得方法が紹介されていました。
それがWEB経由でアバターのUUIDを検索できるサイトから取得する方法です。
今回は、そちらを利用させてもらってUUIDをスクリプト内に取り込んで処理しています。
ただ、HTTPリクエストで取得した場合、全員のUUIDは取得できませんでした。20件ちょっとがエラーになって取得できませんでした。
後から、直接HPへ行って、個別にアバター名を入力して検索したら、何故かちゃんと取得できました。
この辺は英語のサイトなので、どう言う風になっているのかまでは分かりません。
これでIMとノートカードの配布は自動的に、次々と処理されていきました。
ここで、もう一つ注意が必要な事は、今回の仕様では、IMとノートカードを送信した結果を受けて、次のデータを顧客リストから読み込んでいるのですが、スクリプト内部で送信完了として処理していても、実態はタイムラグもあるようで、間をおかずに進めると、途中で「スピードが速すぎる」と言ってスクリプトが落ちてしまいました。
どうもWEBとのやり取りが早過ぎて駄目だったようです。
そこで、例によって「間」を5秒ほど空けて、次のデータを読み込んで処理しました。
2秒でも十分だったのですが、途中でふと思ったのです。
「100件以上も連続で機械的にWEB接続かけたら、それってスパム行為と思われないかな~・・・」と言う事です。
まあ、5秒空けても一緒なんですけどね。気持ちです。^ ^;
と言う事で、めでたく処理は完了しました。
ちなみに、スクリプトを2つに分けたのは、1つのスクリプトだと連続的な処理構造が複雑になってしまうからです。
仮に顧客リストを内部のリストに格納してからであれば、一つのスクリプトで完結できたと思います。
しかし、100人以上の顧客名のリストは、残念ながら内部のリストに格納しきれんませんでした。
そこで、1件づつ読み込んで処理させたのです。
ノートカードを読み込む場合、読み込む命令を発行して、実際にデータを取得する部分は、dataserverイベントで行われます。
そして、HTTPリクエストをした場合、その結果を取得するのは、http_responseイベントになります。
一つのスクリプト内で書く場合は、双方のイベントでキックし合うような構造になってしまいます。
そこで、処理を単純化するために、「顧客カードを読み込む処理」と「HTTPリクエストする処理」を別スクリプトとして分離しました。双方のやり取りにはLinkメッセージを使ってます。
これだとループ的に処理させても、ループ部分はカードデータの読込部分だけになるので、比較的分かりやすく記述できると思います。
今回作ったスクリプトは汎用性も高いと思いますので、今後の顧客管理等にも上手く活用できるかも知れません。
ただ、一つだけ気になった事は、「アバターのUUIDって、勝手に調べて利用して良いの?」と言う事です。
う~ん。。。こう言うのって悪用する人が居なければ良いが・・・と思ってしまいました。
だって、例のテロオブジェクトを無差別に自動配布するなんて事もできてしまうのですよね。
勿論最低アバター名が分からなければ駄目ですけどね。
まあ、そんなこと言っても、SL内のアバター検索で、適当に検索して、プロフィールから送信もできてしまうのだから、気にしてもしょうがない話ですが。^ ^;
llDetectedTouchST
llAddToLandPassList
【注意】Bulk Permissions機能は使っては駄目!
HTTP-INを使ってみた。
オブジェクトへの指示
ペットを作るには(6)
llAddToLandPassList
【注意】Bulk Permissions機能は使っては駄目!
HTTP-INを使ってみた。
オブジェクトへの指示
ペットを作るには(6)
Posted by Gonbe Shan at 23:07│Comments(0)
│スクリプトのお勉強メモ