Posted in as3 by nicoB on July 21st, 2007

In this little tutorial, I’ll show you how to connect to the Flickr Service in actionscript3.

flickr connector window

Here’s the demo

First of all, you’ll need :

- a Flickr account

- a Flickr API Key

- the Adobe as3flickrlib

- the Adobe as3corelib

To connect to the flickr service you must understand how it works :

flickr connection

 

 

- Classes

We are going to create a few classes :

  • FlickrEngine : manage the flickr connection
  • FlickrEngineEvent: the event of the FlickrEngine
  • Connector: the movieClip class to control the connection
  • PhotoManager : the Document class

- FlickrEngine

So, we are going to create a class FlickrEngine:

package com.nicoB.photoManager.flickr {

        import com.adobe.webapis.flickr.*;
        import com.adobe.webapis.flickr.methodgroups.*;
        import com.adobe.webapis.flickr.events.*;

        import flash.events.EventDispatcher;
        import flash.net.URLRequest;
        import flash.net.navigateToURL;

        import com.nicoB.photoManager.flickr.FlickrEngineEvent;

        public class FlickrEngine extends EventDispatcher{

                //var
                private var oFlickr : FlickrService;
                private var oAuth : Auth;
                private var sFrob : String;
                private var sId : String;

                public function FlickrEngine(){
                        oFlickr = new FlickrService("API KEY");
                        oFlickr.secret = "SECRET";

                        // Event listeners
                        oFlickr.addEventListener(FlickrResultEvent.AUTH_GET_FROB, _onGetFrob);
                        oFlickr.addEventListener(FlickrResultEvent.AUTH_GET_TOKEN, _onGetToken);
                }

                //———————————
                //                  CONNECTION
                //———————————

                //connect to flickr service : get the application frob
                public function connect(){
                        oAuth = new Auth(oFlickr);
                        oAuth.getFrob();
                }

                //event when getting the frob
                private function _onGetFrob(e : FlickrResultEvent){
                        var eEvent:FlickrEngineEvent;

                        if (e.success){

                                eEvent = new FlickrEngineEvent(FlickrEngineEvent.ONOPENPOPUP);
                                dispatchEvent(eEvent);

                                sFrob = e.data.frob;

                                var sUrlConnexion = oFlickr.getLoginURL(sFrob, AuthPerm.WRITE);
                                navigateToURL(new URLRequest(sUrlConnexion), "_blank");

                        }
                        else {
                                trc("error getting frob");
                                eEvent = new FlickrEngineEvent(FlickrEngineEvent.ONERRORGETTINGFROB);
                                dispatchEvent(eEvent);
                        }
                }

                //get the token when user is registered
                public function validConnection(){
                        oAuth.getToken(sFrob);
                }

                //event when getting the token
                private function _onGetToken(e : FlickrResultEvent){
                        var eEvent:FlickrEngineEvent;

                        if (e.success){
                                var authResult:AuthResult = AuthResult(e.data.auth);

                                sId = authResult.user.nsid;

                                trc("user id="+sId);
                                trc("user perms="+authResult.perms);

                                oFlickr.token = authResult.token;
                                oFlickr.permission = authResult.perms;

                                eEvent = new FlickrEngineEvent(FlickrEngineEvent.ONCONNECTED);
                                this.dispatchEvent(eEvent);

                        }
                        else {
                                trc("error getting token");
                                eEvent = new FlickrEngineEvent(FlickrEngineEvent.ONERRORGETTINGTOKEN);
                                this.dispatchEvent(eEvent);
                        }
                }

                //————————————
                //                  TRC
                //————————————
                private function trc(statements){
                        trace("FLICKRENGINE : "+statements.join(", "));
                }

        }

}

- FlickrEngineEvent

An other class that extends the main event class:

package com.nicoB.photoManager.flickr {

        import flash.events.Event;

        public class FlickrEngineEvent extends Event{

                static public const ONOPENPOPUP:String = "onOpenPopup";
                static public const ONERRORGETTINGFROB:String = "onErrorGettingFrob";
                static public const ONERRORGETTINGTOKEN:String = "onErrorGettingToken";
                static public const ONCONNECTED:String = "onConnected";

                public var data:Object;

                public function FlickrEngineEvent(type:String, bubbles:Boolean=false, cancelable:Boolean=false) {
                        super(type, bubbles, cancelable) ;
                }

                public function getName():String {
                        return currentTarget.getName() ;
                }
        }
}

- Connector

Then we create a MovieClip “Connector” which listen to the flickrengine events and warn the user.

For each event, we’ll create a new frame :
connector frame

We’ll link a Connector class to this MovieClip :

package com.nicoB.photoManager {

        import flash.display.MovieClip;
        import com.nicoB.photoManager.flickr.FlickrEngine;
        import com.nicoB.photoManager.flickr.FlickrEngineEvent;

        import flash.events.MouseEvent;

        public class Connector extends MovieClip {

                private var iStep : Number;
                private var oFlickrEngine : FlickrEngine;

                public function Connector(){
                        iStep = 0;

                        this.addEventListener(MouseEvent.CLICK, _onRelease);
                }

                public function init(oFlickrEngine : FlickrEngine){

                        this.oFlickrEngine = oFlickrEngine;

                        oFlickrEngine.addEventListener(FlickrEngineEvent.ONERRORGETTINGFROB, _onError);
                        oFlickrEngine.addEventListener(FlickrEngineEvent.ONERRORGETTINGTOKEN, _onError);
                        oFlickrEngine.addEventListener(FlickrEngineEvent.ONOPENPOPUP, _onPopupOpened);
                        oFlickrEngine.addEventListener(FlickrEngineEvent.ONCONNECTED, _onConnected);

                }

                private function _onRelease(e : MouseEvent){
                        switch (iStep){
                                case 0 :
                                        oFlickrEngine.connect();
                                        break;
                                case 1 :
                                        oFlickrEngine.validConnection();
                                        break;
                        }

                }

                //————————————
                //                  EVENT FLICKR ENGINE
                //————————————

                private function _onError(e : FlickrEngineEvent){
                        iStep = 2;
                        gotoAndStop("error");
                }

                private function _onPopupOpened(e : FlickrEngineEvent){
                        iStep = 1;
                        gotoAndStop("waiting");
                }

                private function _onConnected(e : FlickrEngineEvent){
                        iStep = 3;
                        gotoAndStop("connected");
                }

                //————————————
                //                  TRC
                //————————————
                private function trc(statements){
                        trace("CONNECTOR : "+statements.join(", "));
                }

        }
}

- PhotoManager

Finally, let’s create a document class to create the flickr engine and initialize the mc connector :

package com.nicoB.photoManager {

        import flash.display.MovieClip;
        import com.nicoB.photoManager.flickr.FlickrEngine;
        import com.nicoB.photoManager.flickr.FlickrEngineEvent;

        public class PhotoManager extends MovieClip {

                private var oFlickrEngine : FlickrEngine;

                public function PhotoManager(){
                        oFlickrEngine = new FlickrEngine();
                        oFlickrEngine.addEventListener(FlickrEngineEvent.ONCONNECTED, _onConnected);

                        mcConnector.init(oFlickrEngine);

                }

                private function _onConnected(e : FlickrEngineEvent){
                        trc("great you’re connected to the flickr service");
                }

                //————————————
                //                  TRC
                //————————————
                private function trc(statements){
                        trace("PHOTOMANAGER : "+statements.join(", "));
                }

        }
}

et voilà!

List of replies :

  1. Manu, says

    Classe !!!
    Une démo ? les sources ? :p



  2. Thomas, says

    et une ptite démo ???



  3. nicoB, says

    I’ve just added a little demo where you can try the connection at this url : http://nicob.info/labs/flickr/connection/connection.html.



  4. monsieur.vd., says

    coool


Leave a Reply