Page 1 sur 1

My.DeviantArtApi

Posté : 15 févr. 2012, 22:22
par inwebo
Hello world,

Utilisateur depuis 5 ans maintenant du site http://www.deviantart.com/ ( que je vous conseil au passage ), je fais un constat trés amer : Mais ou se trouve votre API ? et tout ce qui fait un site moderne ? Comment maintenir mon portfolio synchronisé avec mon compte deviantart sans y passer 1H ? C'est vraiment trop ? FlickR dispose lui depuis quelques temps maintenant de son API, faut en prendre de la graine les copains.

Alors voilà une class PHP5 utilisant l'extension DOM pour parser votre compte deviant art et renvoyer toutes les infos nécessaires (avatar, id, gallerie). Rien de bien compliqué mais cela rends bien des services.

Fonctionnement trés simple, je considère qu'une page retourné par deviantart est un arbre DOM, qu'il suffira de parser avec des requêtes Xpath pour en extraire les informations que l'on souhaite.
Plus précisément pour l'application une page ouaib est un objet DOMDocument (c'est ce que fais toutes les classes dont le nom commence par dom). Nous pouvons donc requêter ces objets avec des requêtes XPATH (toutes les classes commençant par deviant).

Chaque résultat de requêtes est stocké dans deux attributs de classes.

Les attributs de classes se terminant par NodeList (ex de la classe DeviantFavorites $favoritesNodeList) sont des objet ... NodeList.
Un second attribut se terminant par SplObjectStorage (ex de la classe DeviantFavorites $favoritesDeviationsSplObjectStorage) est une collection d'objet (voir la documentation).

! Mise en garde !
J'ai lu la charte d'utilisation et cette classe n'as pas l'air de rentrer en conflit avec, donc si des anglophones (avertis) pouvaient me confirmer.

Par contre vous DEVEZ utiliser cette class uniquement avec VOTRE COMPTE deviantart, je n'ai pas écrit cette API dans l'idée de piller le travail des autres. VOUS êtes responsable de ce que vous faites !

Protips, mettez en CACHE tout ce que vous allez récupérer, les images et les pages HTML. Deviantart se réserve le droit de BANNIR des IP si ils considèrent (à tort ou à raison) qu'il y a une utilisation frauduleuse du service.

Pour les curieux l'API est disponible sous forme d'archive phar (voir make.php) et cet excellent article de Pascal martin.
<?php
/**
 * My.Deviant API
 *
 * LICENCE
 *
 * Vous êtes libre de :
 *
 * Partager : reproduire, distribuer et communiquer l'oeuvre
 * Remixer  : adapter l'oeuvre
 *
 * Selon les conditions suivantes :
 *
 * Attribution : Vous devez attribuer l'oeuvre de la manière indiquée par
 * l'auteur de l'oeuvre ou le titulaire des droits (mais pas d'une manière
 * qui suggérerait qu'ils vous soutiennent ou approuvent votre utilisation
 * de l'oeuvre).
 *
 * Pas d’Utilisation Commerciale : Vous n'avez pas le droit d'utiliser cette
 * oeuvre à des fins commerciales.
 *
 * Partage à l'Identique : Si vous modifiez, transformez ou adaptez cette
 * oeuvre, vous n'avez le droit de distribuer votre création que sous une
 * licence identique ou similaire à celle-ci.
 *
 * Remarque : A chaque réutilisation ou distribution de cette oeuvre, vous
 * devez faire apparaître clairement au public la licence selon laquelle elle
 * est mise à disposition. La meilleure manière de l'indiquer est un lien vers
 * cette page web.
 *
 */

/**
 * Query a DOMDocument searching for all newest deviations.
 *
 * @category  My.Deviant API
 * @package   Base
 * @copyright Copyright (c) 2005-2011 Inwebo (http://www.inwebo.net)
 * @author    Julien Hannotin
 * @license   http://creativecommons.org/licenses/by-nc-sa/2.0/fr/
 * @version   $Id:$
 * @link      https://github.com/inwebo/My.DeviantArtParser
 * @since     File available since Beta 01-02-2012
 *
 */

class DeviantParser extends DOMXPath {
    
    /**
     * Init Xpath
     *
     * @param DOMDocument $doc
     * @return void
     */
    public function  __construct( DOMDocument $doc ) {
        parent::__construct( $doc );
    }

    /**
     * Iterate a DOMNodeList and for each node call a callback function
     *
     * @param DOMDocument $doc
     * @return SplObjectStorage
     */
    public function iterate( DOMNodeList $nodelist, $callback ) {
        $SplObjectStorage = new SplObjectStorage();
        foreach( $nodelist as $item ) {
            $SplObjectStorage->attach( call_user_func( $callback, $item ) );
        }
        return $SplObjectStorage;
    }

    /**
     * Set default nodeValue to NULL if item doesn't have got a nodeValue
     *
     * @param DOMNodeList $nodeList to iterate
     * @param int $index
     * @return string if nodeValue is set else NULL
     */
    public function setDefault( DOMNodeList $nodeList, $index ) {
        if( @($nodeList->item($index)) ) {
            return $nodeList->item($index)->nodeValue;
        }
        else {
            return NULL;
        }
    }

    /**
     * Make deviation object from a DOMNode
     *
     * @param DOMNode $node a deviation't DOMNode
     * @return object Daviation
     */
    public static function factoryDeviation( DOMNode $node ) {
        return new Deviation( $node );
    }

    /**
     * Make gallery object from a DOMNode
     *
     * @param DOMNode $node a deviation't DOMNode
     * @return object stdClass $gallerie
     */
    public static function factoryGallery( DOMNode $node ) {
        $gallerie       = new stdClass();
        $gallerie->url  = $node->attributes->getNamedItem("href")->nodeValue;
        $gallerie->name = $node->nodeValue;

        return $gallerie;
    }

    /**
     * Convert a SplObjectStorage to array
     *
     * @param SplObjectStorage $collection 
     * @return array $buffer
     * @see http://php.net/manual/fr/function.get-object-vars.php
     */
    public static function toArray( SplObjectStorage $collection ) {
        $buffer = array();
        $collection->rewind();
        while( $collection->valid() ) {
            $buffer[] = get_object_vars( $collection->current() );
            $collection->next();
        }
        return $buffer;
    }

}

Un exemple d'utilisation se trouve dans l'index.php. Si vous avez des idées d'amélioration ou que vous voyez des aberrations, faites moi signe !

Fork me i'm famous
https://github.com/inwebo/My.DeviantArtParser

Re: My.DeviantArtApi

Posté : 15 févr. 2012, 23:10
par stealth35