1. Bitte schaltet eure Ad Blocker aus. SLinfo kann nur betrieben werden, wenn es durch Werbung Einnahmen erzielt. Vielen Dank!!
    Information ausblenden
  2. 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.
    Information ausblenden
  3. 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.
    Information ausblenden

Name2Key

Dieses Thema im Forum "Scripting" wurde erstellt von Bittersweet Frostbite, 16. August 2015.

  1. Bittersweet Frostbite

    Bittersweet Frostbite Moderatorin in Urlaub

    Beiträge:
    1.924
    Zustimmungen:
    239
    Punkte für Erfolge:
    63
    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".
     
  2. Johanna Burnstein

    Johanna Burnstein Freund/in des Forums

    Beiträge:
    749
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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: 16. August 2015
  3. Nicoletta Schnute

    Nicoletta Schnute Forumsgott/göttin

    Beiträge:
    8.042
    Zustimmungen:
    729
    Punkte für Erfolge:
    123
    Ich hab da mal was Gebasteltes ... muss ich suchen
     
  4. MartinRJ Fayray

    MartinRJ Fayray Freund/in des Forums

    Beiträge:
    796
    Zustimmungen:
    2
    Punkte für Erfolge:
    18
  5. Daemonika Nightfire

    Daemonika Nightfire Forumsgott/göttin

    Beiträge:
    7.851
    Zustimmungen:
    1.169
    Punkte für Erfolge:
    124
    Dieser Dienst funktioniert einwandfrei: http://name2key.haxworx.net/
    Ich verwende den in Kombination mit diesem http://w-hat.com/name2key/, da die beiden sich gegenseitig aktualisieren.
    Das heisst, wenn die Abfrage bei W-Hat NULL_KEY zurueck liefert, wird automatisch bei Haxworx angefragt und erst dann findet eine Ausgabe statt.

    LG
    Dae
     
    Zuletzt bearbeitet: 17. August 2015
  6. Nicoletta Schnute

    Nicoletta Schnute Forumsgott/göttin

    Beiträge:
    8.042
    Zustimmungen:
    729
    Punkte für Erfolge:
    123
    Oops, ich hatte auch "http://w-hat.com/name2key/" verwendet. Das muss ich dann wohl auch mal ändern, bzw erweitern.
     
  7. Daemonika Nightfire

    Daemonika Nightfire Forumsgott/göttin

    Beiträge:
    7.851
    Zustimmungen:
    1.169
    Punkte für Erfolge:
    124
    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: 17. August 2015
  8. Johanna Burnstein

    Johanna Burnstein Freund/in des Forums

    Beiträge:
    749
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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: 19. August 2015
  9. Nicoletta Schnute

    Nicoletta Schnute Forumsgott/göttin

    Beiträge:
    8.042
    Zustimmungen:
    729
    Punkte für Erfolge:
    123
    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: 19. August 2015
  10. Johanna Burnstein

    Johanna Burnstein Freund/in des Forums

    Beiträge:
    749
    Zustimmungen:
    0
    Punkte für Erfolge:
    0
    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_uuidstr_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: 19. August 2015
  11. Daemonika Nightfire

    Daemonika Nightfire Forumsgott/göttin

    Beiträge:
    7.851
    Zustimmungen:
    1.169
    Punkte für Erfolge:
    124
    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
     

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden