Visualizzazione dei risultati da 1 a 8 su 8

Discussione: Captcha in PHP/Flash

  1. #1

    Captcha in PHP/Flash

    Salve a tutti.

    Come prima premessa, sono uno sviluppatore PHP che si diletta di tanto in tanto ad utilizzare Flash, e che l'altro giorno ha pensato bene di cercare un metodo per ovviare un problema che hanno molti sviluppatori: creare un classico sistema di captcha anche quando l'hoster non permette la creazione "al volo" di immagini che contengono quelle stringhe di caratteri, diciamo, anti-spammers.

    Ho pensato che si sarebbe potuto ovviare con un file in flash che legge, con LoadVars. un file PHP.
    Detto file si occuperà di generare una stringa alfanumerica causale, salvarla in una sessione e generare una stringa del tipo nome_variabile=variabile.

    Visto che non è PHP lo scoglio, ho pensato di fare i primi tentativi in Flash con un file di testo ed un SWF con una semplice etichetta di testo dinamico.

    Scrivo di seguito il codice (semplificato dalle altre cose che avevo pensato per rendere incasinata la captcha stessa):

    Codice PHP:
    // prelevo il file che contiene la stringa alfanumerica
    this.loadVariables("file.txt");

    // la stringa contenuta nel file è
    // str_captcha=abcdefgh1234

    this.onEnterFrame = function() {
        var 
    captcha:String str_captcha;
        var 
    num:Number captcha.length;

    // separo le singole lettere che compongono la stringa
    // per poterle successivamente modificare 
    // di inclinazione, grandezza blur ecc ecc
        
    for (0numi++){
            var 
    singola_lettera:String captcha.substr(i1);

            
    trace(singola_lettera);


    Quando mando in esecuzione questo script, tutto funziona e la separazione della stringa nei singoli caratteri è perfetta ma, come bene immaginate va in loop..... in quanto ho utilizzato onEnterFrame.
    Ho provato con onLoad ma non mi da nessun output quindi non so come risolvere.
    Chi mi può dare una graditissima mano?
    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  2. #2
    UP
    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  3. #3
    UP
    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  4. #4
    in generale onEnterFrame esegue la funzione ad esso collegata alla frequenza fotogrammi del filmato e per eliminarlo si utilizza delete this.onEnterFrame in base al verificarsi di una condizione.

    nel tuo caso basterebbe verificare che si è giunti al termine della stringa (i==num-1) in un if all'interno del ciclo.

    ora però dimentica quello che ti ho detto perchè non serve onEnterFrame per fare quello che ti serve.
    ti posto un codicino un pochino più affidabile e customizzabile di quello che utilizzavi.
    Codice PHP:
    var captcha:String;
    function 
    loadCaptcha():Void {
        var 
    file:String "file.txt";
        var 
    captchaLoader:LoadVars = new LoadVars();
        
    captchaLoader.onLoad = function(success):Void  {
            if (
    success) {
                
    captcha this["str_captcha"];
            }
            
    displayLetters(captcha);
        };
        
    captchaLoader.load(file);
    }
    function 
    displayLetters(myStr:String):Void {
        for (
    i=0i<myStr.lengthi++) {
            var 
    singola_lettera:String myStr.substr(i1);
            
    trace(singola_lettera);
        }
    }

    loadCaptcha(); 
    guardati come si utilizza LoadVars per caricare variabili da una stringa.
    in as2 è il metodo che offre più controllo e affidabilità.
    il resto del codice per te che programmi in php (e anche bene )mi sembra ovvio.


  5. #5
    Stavo giusto vedendo il meotdo LoadVars nell'help in linea di Flash.
    Non l'ho ancora utilizzato ma appena ho un minuto di tempo vedrò di utilizzarlo.

    Appena risolvo, posterò il codice così se qualcuno avrà la mia stessa necessità potrà - magari - prendere spunto.

    Per ora grazie.
    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  6. #6
    Ciao.

    Ho risolto scrivendo così:
    codice:
    var lv:LoadVars = new LoadVars();
    
    lv.onLoad = function(success:Boolean) {
        if (success) {
         var captcha:String = this.str_captcha;
         var num:Number = captcha.length; 
    
    	 for (i = 0; i < num; i++){ 
    		var singola_lettera:String = captcha.substr(i, 1); 
    		testo_txt.text += singola_lettera;
        } 
        } else {
    		testo_txt.text = "Errore!!!";
        }
    };
    lv.load("sessione.php");
    Però ora ho un altro problema.
    Mi andava di applicare una distorsione pseudo-random alle lettere (nonché pensavo ad un po' di blur), però non risco a risolvere.

    Pensavo di impostare una variabile angolo nel ciclo di FOR generando un numero casuale.
    Numero che avrei poi messo come segue:

    codice:
    	 for (i = 0; i < num; i++){ 
    	 	var angolo:Number = Math.floor(Math.random()*100);
    		var singola_lettera:String = captcha.substr(i, 1);
    		testo_txt._rotation = angolo;
    		testo_txt.text += singola_lettera;
        }
    Mandando in esecuzione, però, non vedo più la scritta.
    Dove sbaglio questa volta?

    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

  7. #7
    devi incorporare i caratteri nel campo di testo dinamico.
    a destra nel pannello proprietà embed->basic latin se vuoi tutti i caratteri normalmente utilizzati, altrimenti quelli che ti servono.

    [edit]comunque per ottenere quello che vuoi devi crearti dinamicamente tanti campi di testo quante sono le lettere della stringa e applicare la rotazione e/o il blur separatamente a ciascuno[/edit]

  8. #8
    Scusa se rispondo solo oggi, ma ho avuto poco tempo per fare prove su questo progettino.

    Dunque, ho pensato di modificare lo script come segue:

    codice:
    	 for (i = 0; i < num; i++){ 
    var singola_lettera:String = captcha.substr(i, 1);
    var angolo:Number = Math.floor(Math.random()*100);
    
    this.createTextField("testocaptcha_txt", i*10, (i*20), 15, 20, 20);
    
    testocaptcha_txt.text = singola_lettera;
    testocaptcha_txt._rotation = angolo;
    }
    Però, non ottengo né il messaggio di errore, né alcuna scritta nel file SWF. :master:
    Dov'è che sbaglio?

    <ALCIO />
    Per cortesia: no PVT Tecnici
    ******* LINKS *******
    SRL
    MetalWave

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.