Puente de Javascript a Flash para almacenar SO "cookies" dentro de flash
(5)
Para construir sobre lo que dijo el rmeador , y para ayudarlo a comenzar, necesitará saber cómo usar dos clases en la API FLEX3, SharedObject y ExternalInterface .
SharedObject le permitirá almacenar y recuperar datos de una computadora cliente y ExternalInterface le permitirá a su ActionScript comunicarse con su javascript.
El uso de objetos compartidos es simple.
Para poner datos en una máquina de usuarios, simplemente cree un SharedObject y añada propiedades a la propiedad de datos de sharedObject.
private var sharedObject : SharedObject = SharedObject.getLocal("myCookie");
sharedObject.data.DATA_FOR_THE_COOKIE = DATA;
La recuperación de datos desde SharedObject es igual de simple. Asegúrese de que el tamaño de SharedObject sea mayor que 0 (asegúrese de que SharedObject exista) y simplemente busque los nombres de propiedad a través de la propiedad de datos de SharedObject.
if(sharedObject.size > 0)
// access data from cookie with -> sharedObject.data.DATA_FROM_THE_COOKIE;
Para pasar los datos almacenados en SharedObject a su javascript, necesitará usar ExternalInterface.
Digamos que tienes una función de JavaScript para recuperar las variables
function retrieveVars( vars ){
// Do something with vars.
}
Para llamar a esta función desde actionscript, usará
ExternalInterface.call("retrieveVars", DATA_ITEM_1, DATA_ITEM_2, ...);
Es así de simple.
Tenga en cuenta que esta técnica no funcionará si el reproductor flash del cliente tiene su configuración de almacenamiento establecida en 0, o si el navegador del cliente no tiene ActiveX o NPRuntime.
Después de leer esto en la pregunta ¿Cómo identifico de manera única las computadoras que visitan mi sitio web? :
Una posibilidad es usar cookies flash:
Ubiquitous availability (95 percent of visitors will probably have
destello)
You can store more data per cookie (up to 100 KB) Shared across browsers, so more likely to uniquely identify a machine Clearing the browser cookies does not remove the flash cookies.
Tendrá que crear una pequeña película flash (oculta) para leer y escribir.
Traté de encontrar si alguien ya había hecho algo como esto, así que no tendría que reinventar la rueda. Hasta ahora, no tuve suerte (tal vez no conozco el término correcto para buscar), excepto el código en el lado de la flash
El uso que tengo para esto es para evitar que un usuario responda un cuestionario varias veces, pero los usos futuros pueden prohibir los trolls.
¿Alguien sabe una biblioteca de código abierto que hace esto y me permite acceder a través de javascript?
Advertencias: No sé flash y no tengo una licencia.
Editar: Puedes hacer eso usando evercookie . Es un poco malvado, pero funciona.
Tengo dudas en responder a tu pregunta, porque parece que se está desviando peligrosamente cerca del mal ... Además, está condenada al fracaso. Si realmente desea evitar que un usuario responda un cuestionario varias veces, lo mejor que puede hacer es hacer que registre una cuenta de usuario. Si desea evitar que registren varias cuentas de usuario, puede hacer que verifiquen algo a través de una tarjeta de crédito o un correo postal, que en general son soluciones insostenibles. En resumen, internet es anónimo.
De todos modos, si realmente quiere seguir adelante con este plan, puede construir su aplicación en Flex (una variante de Flash) de manera bastante trivial. Hay toneladas de documentación en el sitio de Adobe. Algunos de ellos son bastante escasos y molestos, particularmente la API de colecciones, pero será suficiente para sus propósitos. ActionScript (el lenguaje de programación subyacente a Flash y Flex) se parece mucho a JavaScript y es fácil de aprender. Flex tiene un SDK gratuito (generalmente disponible en un pequeño enlace desde la página que le indica que debe obtener el costoso Flex Builder; Flex Builder es principalmente una herramienta GUI, mientras que usted escribirá código directo sin un IDE con solo el SDK), entonces una licencia no debería ser un problema. El puente JavaScript to Flash también está bien documentado.
Para las personas que buscan esto ahora, asegúrese de revisar evercookie .
Evercookie definitivamente hace el trabajo, pero esto está un poco más cerca de lo que originalmente estabas pidiendo: https://github.com/nfriedly/Javascript-Flash-Cookies MIT license.
BakedGoods parece ser exactamente lo que necesitas (o más bien, lo que necesitas ); es una biblioteca Javascript que establece una interfaz uniforme que se puede usar para realizar operaciones de almacenamiento comunes en todas las instalaciones de almacenamiento nativas y algunas no nativas, incluidos los Objetos Compartidos Localmente Flash (las "cookies" de las que habla).
Con él, crear un LSO se puede lograr con un código tan simple como:
bakedGoods.set({
data: [{key: "key", value: "value"}],
storageTypes: ["flash"],
complete: function(byStorageTypeRemovedItemKeysObj, byStorageTypeErrorObj){/*code*/}
});
Recuperar y eliminar datos es igual de fácil. Confía en mí en todo esto, lo sabría; soy su mantenedor :)
Si por alguna razón prefieres desplegar tu propia solución, rmeador y ForYourOwnGood te han proporcionado suficiente información para ayudarte a comenzar.
Sin embargo, olvidaron decirle cómo hacer algo muy importante: cómo acceder, con Javascript, al código ActionScript que manejará los Objetos Compartidos .
Primero, deberá encapsular su código de ActionScript en un método y luego registrar ese método como parte de ExternalInterface de su aplicación principal:
function handleObjects(/*param1, param2, ... */):void {/*code*/}
ExternalInterface.addCallback("handleObjects");
En segundo lugar, deberá compilar su aplicación Actionscript (su código) y crear un elemento en su HTML que haga referencia al archivo .swf resultante.
Luego, suponiendo que el elemento HTML mencionado anteriormente se representa como un elemento DOME llamado flashDOMElement
, puede llamar a su método con el elemento DOMElement:
flashDOMElement.handleSharedObjects(/*arg1, arg2, ... */);
¡Y eso es! Hay un par de cosas que hemos omitido mencionar o descuidado, pero en general, implementar su propia solución no es difícil. Sin embargo, implementar su propia solución confiable es una cuestión diferente, que es en parte la razón por la que le sugiero que use BakedGoods.