• Bitte schaltet eure Ad Blocker aus. SLinfo kann nur betrieben werden, wenn es durch Werbung Einnahmen erzielt. Vielen Dank!!
  • Wir freuen uns, wenn du dich in unserem Forum anmeldest. Bitte beachte, dass die Freigabe per Hand durchgeführt wird (Schutz vor Spammer). Damit kann die Freigabe bis zu 24 Stunden dauern.
  • Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anbieten zu können und die Zugriffe auf unsere Website zu analysieren. Sie geben Einwilligung zu unseren Cookies, wenn Sie unsere Webseite weiterhin nutzen.

Name2Key

Bittersweet Frostbite

Moderatorin in Urlaub
Kennt jemand einen funktionierenden Name2Key-Service?

"http://w-hat.com/name2key/" scheint nicht mehr aktualisiert zu werden. Und wenn ich direkt über "http://vwrsearch.secondlife.com/client_search.php?q=" gehe, dann funktioniert das zwar im Browser, in einem LSL-Script bekomme ich aber ein "Access Denied".
 
Da LL anscheinend die Sim IP Adressen sperrt, hatt man hier versucht das über einen Proxy zu lösen:

http://wiki.secondlife.com/wiki/Name2Key_in_LSL

Vielleicht kann man sich da auch selber was basteln. (Der Babelfish in dem Beispiel scheint nicht so zu funktionieren wie man sich das wünscht.) z.B. selber einen Dienst hosten der als GET oder POST Value die Such URL (oder besser nur den Namen) entgegennimmt, stellvertretend sucht und die Antwort (den Key) zurückgibt. Sollte mit ein paar Zeilen PHP zu machen sein. (Man kann latürlich auch ASP.NET, J2EE, Ruby on Rails oder wasweißichnochalles nehmen. :) )

HTH

EDIT: Wenn man soetwas macht, sollte man natürlich den übergebenen Wert validieren bzw. den Dienst nicht öffentlich zugänglich machen. ...oder besser beides.
 
Zuletzt bearbeitet:
Oops, ich hatte auch "http://w-hat.com/name2key/" verwendet. Das muss ich dann wohl auch mal ändern, bzw erweitern.

Besser ist das. ;)
Beware Hax hatte mir das mal erklaert. Die beiden tauschen sich gegenseitig mit den UUIDs aus und aktuallisieren sich gegenseitig. Drum kann es mal vorkommen, das der eine aktueller ist als der andere und sich erst spaeter angleicht, da dies nicht in Echtzeit geschiet.

Das liegt an den ADD-Scripten. manche senden neue Keys an W-HAT, weil sie halt diesen Service nutzen und andere wiederum das Script von HaxWorx. Deshalb ist es empfehlenswert bei beiden anzufragen.

LG
Dae
 
Zuletzt bearbeitet:
Ich habe diese Relay/Proxy Idee nochmal weitergesponnen. Wenn man das herausfischen der UUID auslagern möchte (und/oder sich von dritten unabhängig machen will) könnte man das folgendermaßen machen.

Ein einfaches PHP Script (Da man das meist Problemlos überall hosten kann) das den Avatar Namen entgegen nimmt, die LL Suche aufruft, die UUID findet und zurückgibt. D.h. im Body der Antwort steht nur die Avatar UUID oder im Fehlerfall ein NULL_KEY, was das raus greifen der UUID im LSL Script einfacher macht. Damit hat man ein Interface, dass tatsächlich nur die Avatar UUID zurückliefert und nicht eine irgendwie geartete HTML Seite (die Änderungen unterlegen sein kann), aus der man sich die UUID noch raus suchen muss. Ändert LL etwas an der Suche muss man nur das PHP Script anpassen und nicht alle seine Scripte in SL.

Die Verwendung von DOM/XPath und regulärem Ausdruck scheint im ersten Moment etwas aufwendig zu sein. Man könnte ja auch einfach nach http://world.secondlife.com/resident/ suchen. Sollte aber LL die Ergebnisseite ändern muss man im Zweifel nur den XPath abändern. Daher habe ich mich entschieden den Bereich, auf den ich den regulären Ausdruck anwende, auf diese Art und Weise einzuschränken. (Ist zwar in diesem Fall auch nicht 100% Eindeutig, aber besser als nix.) Auch habe ich ab und an Werbung vor den eigentlichen Suchergebnissen und versuche dadurch zu verhindern, dass diese mir in die quere kommt.

Ist auch nur ein Ansatz. Quick'n'Dirty. Wenn man es produktiv einsetzen will sollte man auf jeden Fall die Fehlerbehandlung sowie die Validierung der Benutzereingabe verbessern. (Zugriff ließe sich z.B. per .htaccess regeln wenn man es nicht öffentlich anbieten will.) Ich verwende PHP auch nicht so oft, daher weiß ich auch nicht was gerade so best practice ist. Eine vernünftige Implementierung überlasse ich daher dem geneigten Entwickler. ;)

PHP:
<!DOCTYPE html>
<html>
<head>
    <title>Name2Key</title>
</head>
<body><?php

$NULL_KEY   = '00000000-0000-0000-0000-000000000000';
$SEARCH_URL = 'http://vwrsearch.secondlife.com/client_search.php';

function get_uuid($name)
{
    global $NULL_KEY, $SEARCH_URL;
    
    $html = file_get_contents($SEARCH_URL . '?q=' . $name);
    if($html === FALSE)
        return $NULL_KEY;
    
    $domDoc = new DOMDocument();
    if($domDoc->loadHTML($html) == FALSE)
        return $NULL_KEY;

    $xPath = new DOMXPath($domDoc);
    $result = $xPath->query(
        "/html/body/div[@class='wrapper']/div[@class='results_container']/div[@class='result resident_icon']/h3[@class='result_title']/a/@href"
    );
    if($result->length == 0)
        return $NULL_KEY;

    $urlAvatar = $result->item(0)->nodeValue;

    $count = preg_match('/[0-9a-fA-F]{8}(?:-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}/', $urlAvatar, $uuid);
    if($count == 0)
        return $NULL_KEY;

    return $uuid[0];
}

$avatarName = $_GET["name"];
if(preg_match('/[\w\s\d\.]+/', $avatarName) > 0) {
    $avatarName = str_replace(' ', '.', $avatarName);
    echo get_uuid($avatarName);
} else
    echo $NULL_KEY
?></body>
</html>

Ich setze einen Punkt zwischen Avatar Vor- und Nachname, da mir die Suche sonst ab und an mehrere Treffer anzeigt und der erste nicht unbedingt der tatsächlich gesuchte ist. Die Validierung des Avatarnamens habe ich nach Gutdünken gemacht. Keine Ahnung was noch im Avatar Namen erlaubt ist, bzw. ob hier auch Displaynamen verwendet werden können.

Kleiner Test wie man die UUID abfragt:
Code:
string URL = "http://your.domain.tld/name2key.php";
key g_kRequest = NULL_KEY;

default
{
    state_entry()
    {
        llOwnerSay("Reset!");
    }

    touch_start(integer iNumber)
    {
        if(g_kRequest == NULL_KEY) {

            string sName = "Oz Linden";
            
            llOwnerSay("Querying UUID for " + sName + "...");
            g_kRequest = llHTTPRequest(URL + "?name=" + llEscapeURL(sName), [], "");
        } else
            llOwnerSay("Already processing request!");
    }

    http_response(key kRequest, integer iStatus, list lMetadata, string sBody)
    {
        integer bError = TRUE;
        if (kRequest == g_kRequest && iStatus == 200) { 
            integer idxStart = llSubStringIndex(sBody, "<body>");
            integer idxEnd   = llSubStringIndex(sBody, "</body>");
            if(idxStart != -1 && idxEnd != -1) {
                idxStart += 6;
                idxEnd   -= 1;
                if( (idxEnd-idxStart) > 36 )
                    idxEnd = idxStart + 35;
                string sUuid = llGetSubString(sBody, idxStart, idxEnd);
                llOwnerSay("UUID: " + sUuid);
                bError = FALSE;
            }
        }
        
        if(bError == TRUE)
            llOwnerSay("Something went wrong!");
        
        g_kRequest = NULL_KEY;
    }
}
 
Zuletzt bearbeitet:
Wenn das Schript nun noch aus einer Liste Namen eine Liste von UUIDs generiert ist es perfekt, bzw umgekehrt ;)

inworld dauert das ewig.
 
Zuletzt bearbeitet:
Sowas? (Ich hätte von Anfang an das HTML wegschmeißen sollen...)

PHP:
<?php 

$NULL_KEY   = '00000000-0000-0000-0000-000000000000';
$SEARCH_URL = 'http://vwrsearch.secondlife.com/client_search.php';

function get_uuid($name)
{
    global $NULL_KEY, $SEARCH_URL;
    
    $html = file_get_contents($SEARCH_URL . '?q=' . $name);
    if($html === FALSE)
        return $NULL_KEY;
    
    $domDoc = new DOMDocument();
    if($domDoc->loadHTML($html) == FALSE)
        return $NULL_KEY;

    $xPath = new DOMXPath($domDoc);
    $result = $xPath->query(
        "/html/body/div[@class='wrapper']/div[@class='results_container']/div[@class='result resident_icon']/h3[@class='result_title']/a/@href"
    );
    if($result->length == 0)
        return $NULL_KEY;

    $urlAvatar = $result->item(0)->nodeValue;

    $count = preg_match('/[0-9a-fA-F]{8}(?:-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}/', $urlAvatar, $uuid);
    if($count == 0)
        return $NULL_KEY;

    return $uuid[0];
}

$error = TRUE;

$listNames = json_decode($_POST["data"]);
if(json_last_error() == JSON_ERROR_NONE) {
    
    $listNameKeyValues = array();

    foreach($listNames as $name) {
        $key = get_uuid( str_replace(' ', '.', $name) );
        $listNameKeyValues[] = array($name, $key);
    }

    $jsonReturn = json_encode($listNameKeyValues);
    if(json_last_error() == JSON_ERROR_NONE) {
        echo $jsonReturn;
        $error = FALSE;
    }
}
if($error)
    echo "error";
?>

Code:
string URL = "http://your.domain.tld/name2keylist.php";
key g_kRequest = NULL_KEY;

default
{
    state_entry()
    {
        llOwnerSay("Reset!");
    }

    touch_start(integer iNumber)
    {
        if(llDetectedKey(0) != llGetOwner())
            return;

        if(g_kRequest == NULL_KEY) {
            string sBody = "data=" + llList2Json(JSON_ARRAY, ["Oz Linden", "Pete Linden"]);
            llOwnerSay("Querying...");
            g_kRequest = llHTTPRequest(
                URL,
                [
                    HTTP_METHOD, "POST",
                    HTTP_MIMETYPE, "application/x-www-form-urlencoded",
                    HTTP_BODY_MAXLENGTH, 4096
                ],
                sBody
            );
        } else
            llOwnerSay("Already processing request!");
    }

    http_response(key kRequest, integer iStatus, list lMetadata, string sBody)
    {
        integer bError = TRUE;
        if (kRequest == g_kRequest && iStatus == 200 && sBody != "error") { 
            list lJson = llJson2List(sBody);
            integer i;
            for(i = 0; i < llGetListLength(lJson); i++) {
                list lNameKey = llJson2List( llList2String(lJson, i) );
                string sName = llList2String(lNameKey, 0);
                string sKey  = llList2String(lNameKey, 1);
                llOwnerSay(sName + " :: " + sKey);
            }
            bError = FALSE;
        }
        
        if(bError == TRUE)
            llOwnerSay("Something went wrong!" + " :: " + (string)iStatus);
        
        g_kRequest = NULL_KEY;
    }
}


Lässt sich auch so umstricken, dass man nur die UUIDs zurückbekommt.
 
Zuletzt bearbeitet:
Liebe Gemeinde, die Lindens haben wie viele Jahre dazu gebraucht?
Keine Ahnung, jedenfalls ist es jetzt da und funzt. :)

In der Wiki fand ich jetzt endlich funktionierende Funktionen zum Thema Name2Key.
Zum einen waere das llName2Key(); was ich persoenlich fuer wenig Sinnvoll halte, da der Avatar sich dazu auf der selben Region befinden muss. Genau wie bei dem llKey2Name();

Zum zweiten ist da noch die Funktion llRequestUserKey(string UserName); (nicht displayname)
In der Wiki findet ihr nun folgendes BeispielScript:
Code:
key name_key_query;
default
{
   state_entry()
   {
       name_key_query = llRequestUserKey("rider.linden");
   }
 
   dataserver(key queryid, string data)
   {
       if ( name_key_query == queryid )
       {
           llSay(0, "The key for this user is : " + data);
       }
   }
}
Fuer die ersten spielereien ist das ganz OK, doch wenig benutzerfreundlich, da der Name direkt im Befehl eingetragen werden muss.

Aus diesem Grund habe ich gleich mal versucht etwas uebersicht rein zu bringen.
Das sah dann so aus:
Code:
string Name4Request = "daemonika.nightfire";
key name_key_query;

default
{
   state_entry()
   {
       name_key_query = llRequestUserKey(Name4Request);
   }
 
   dataserver(key queryid, string data)
   {
       if(name_key_query == queryid)
       {
           llSay(0, "secondlife:///app/agent/" + data + "/about");
       }
   }
}

Bei der Version lasse ich auch den Key gleich als klickbaren Chatlink ausgeben, welcher gleich das Profil des entsprechenden Avatars oeffnet.

Das gefiel mir aber immer noch nicht, da man immer noch manuell den Namen rein schreiben und wieder speichern musste.
Darum habe ich es etwas erweitert und einen Listener eingebaut, damit man das Script fuer die Abfrage nicht mehr oeffnen, aktuallisieren und speichern muss.

Das sieht dann jetzt so aus:
Code:
// Eingabe Beispiele: /1get&daemonika.nightfire /1get&Daemonika Nightfire
// Resident Beispiele: /1get&daemonika.resident /1get&Daemonika Resident /1get&Daemonika

key owner;
key name_key_query;

default
{
    state_entry()
    {
        owner = llGetOwner();
        llListen(1,"","","");
    }
 
    listen(integer channel, string name, key id, string message)
    {
        if(id == owner)
        {
            list parse = llParseString2List(message, ["&"], []);
            string cmd = llList2String(parse, 0);
            string name = llList2String(parse, 1);
          
            if(cmd == "get")
            {
                name_key_query = llRequestUserKey(name);
            }
        }
    }
 
    dataserver(key queryid, string data)
    {
        if(name_key_query == queryid)
        {
            llOwnerSay("\nProfil: secondlife:///app/agent/" + data + "/about\n Key: " + data);
        }
    }
}

Damit die Eingabe Fehlerfrei funktioniert, weil Avatar namen auch mit Leerschritt geschrieben werden koennen, habe ich als Seperator im Parse Befehl das & verwendet, da Namen niemals dieses Zeichen beinhalten koennen.
Fuer diejenigen die einen Viewer verwenden, der den Key eventuell nicht im Profil anzeigt, habe ich den Key in der Chat-Ausgabe hinzugefuegt.

Wenn ihr nun einen Key abfragen moechtet, verwendet fuer die eingabe im Chat nun folgenden befehl: /1get& und anschliessend ohne Leerschritt nach dem & den Namen und drueckt feuer. ;)
Entsprechende Beispiele stehen im Script ganz oben als Kommentar.

Zufaellig hatten wir dieses Thema Avatar Name gerade Inworld, wo sich darueber beklagt wurde, das die Gift Optionen diverser Vendoren nur schlecht als Recht funktioniert.
Liebe Vendoren Ersteller, diese Funktion ist ideal dazu geeignet, den richtigen Namen bzw. Key fuer Geschenke heraus zu finden.

LG
Dae
 

Users who are viewing this thread

Zurück
Oben Unten