Bueno, la manera que se me ocurre de hacerlo, si no podés contar con que quien incluye el contenido te pase manualmente un parámetro, sería así.
Desde el swf, con javascript tomás la url del html que lo embebe, hacés una redirección a un script que lleve un "log", pasando esa url como parámetro. Ese script, pongamos en php, lo que hace es registrar en un txt esa url y la hora (o lo que fuera, podría grabar en una base de datos) e inmediatamente redirecciona al contenido original.
Con el SharedObject (las "cookies" de flash), te fijás si el usuario está entrando como lo haría normalmente, o si llega redireccionado desde tu server (si no chequearas esto, harías un "loop" infinito de redireccionamientos).
En caso de que haya entrado "normalmente", lo mandás a tu server, pasando la url; ahí grabás en el so un flag que indica que está registrado. Cuando vuelva al sitio original, redireccionado desde tu server, invertís el valor del flag, para que la próxima vez que entre, siga "trackeando".
Antes de hacer cualquier redirección, te fijás también si podés grabar SharedObjects (si no pudieras, entrarías en el loop infinito y sería bastante engorroso para el usuario).
Bueno, esa es la idea básica. Lo que tiene de "truculento" es que estás haciendo un redireccionamiento en vez de pasar parámetros en segundo plano, pero no veo otra forma, porque desde el swf no podés obtener la url (si podés, pero te daría la url desde donde el cliente descargó el swf, o sea tu servidor, lo cual no te sirve); y getURL() te permite ejecutar javascript, pero no devuelve valores al código actionscript, así que tenés que hacer todo en una misma operación. Que cargue dos veces el mismo swf no sería mayor problema, porque la segunda vez el archivo estaría cacheado por el navegador.
No es lo más elegante ni lo más óptimo, pero funciona y dadas las restricciones, puede ser una alternativa
Código:
var reg_so = SharedObject.getLocal("fReg","/");
reg_so.data.test = "1";
reg_so.flush();
if (reg_so.data.test != undefined ) {
if (!reg_so.data.flagRegistrado || reg_so.data.flagRegistrado == undefined) {
var str_js = "javascript:location.href = 'http://www.tuserver.com/trackearFlashl/log.php?url=' + window.location ; void(0);";
reg_so.data.flagRegistrado = true;
getURL(str_js);
} else {
reg_so.data.flagRegistrado = false;
}
reg_so.flush();
} else {
// si no funciona el track, porque no se pueden usar SharedObjects
// entrarías acá. Podrías mostrar o no el contenido, acá sería tu criterio...
trace("no se pueden guardar sharedObjects");
}
El log de php mínimamente podría ser algo así:
log.php
Código PHP:
error_reporting(E_NONE);
if ($fp = fopen("log.txt","a")) {
$str = date("d-m-Y H:i:s") . "\t" . $_GET['url'] . "\n";
fwrite($fp,$str);
fclose($fp);
}
header("location: {$_GET['url']}");
Para que funcione el código AS, el parámetro allowScriptAccess no puede estar ni en "never" ni en "sameDomain" (en esos casos no se ejecutaría el código javascript). Si el swf está exportado para FP7 o FP6 puede no estar o estar en "always" (que es el valor por defecto). Si es para 8, tiene que estar explícitamente en "always".
Suerte
Califa