Ecriture dans Blogmarks faite !

après pas mal de lutte, j’arrive finalement à écrire mes marks dans Blogmarks, à un ou deux bugs de date prés. J’ai pour ça appris pas mal de trucs, comme ce que pouvait être l’authentification web-services WSSE, ou les ruses dans la gestion des encodages MD5, SHA1 et Base64 (sachant que, pour ce dernier, Ruby rajoute à la fin de la chaîne un caractère n qui pète toute la gestion des headers HTTP envoyés au site.

Connexion à del.icio.us sécurisée !

Après avoir galéré avec mon bout de code, je me suis demandé si, finallement, ça ne vallait pas le coup d’essayer ce que préconise la doc Ruby. J’ai donc modifié mon code comme ça

Et j’ai essayé de me connecter à del.icio.us en connexion simple. Et ça marche ! Je récupère mes 896 liens ! La suite, c’est

  • Balancer tout ça à Blogmarks d’une façon compréhensible (mais j’ai une bonne idée de la manière d’y parvenir)
  • Récupérer tous mes favoris Blogmarks (il doit y avoir une URL analogue au http://del.icio.us/api/posts/all), mais ça, c’est encore François qui va me le dire 🙂
  • Générer à partir de ces folksonomies des dossiers, pour éviter que IE ne m’affiche une liste déroulante avec les petites flèches, et pour ça j’ai quelques idées, comme par exemple récupérer la liste des topics, et les organiser en arbre.

Donc voilà, ça avance. J’ai encore quelques soucis, comme par exemple la définition d’un format de configuration me permettant l’activation à la demande dans le fichier YAML.

HTTP Auth et ruby

Je suis en train d’esssayer de me connecter en Ruby à delicious et Blogmarks (leurs pages privées, en fait). Voici donc un petit bout de code (copié du code PHP fourni par SXX … pardon, François) qui génère le contenu de l’entête X-WSSE nécessaire à une authentification correcte :

https://gist.github.com/266065

C’est assez peu élégant, et ça marche pour l’instant difficilement. Mais je ne perds pas courage.

Connexion à Blogmarks

Bon, j’ai encore un ou deux problèmes avec les signets de mon disque dur (notamment IE qui n’en fait qu’à sa tête). Donc, pour changer, je commence la connexion en écriture à {BlogMarks} (parce que la lecture, ça fait longtemps que c’est fait). Donc, d’après la doc de l’API Atom associé, je dois envoyer un document XML après m’être authentifié (ça, c’est pas gagné). Naturellement, générer le document XML est de la rigolade avec la syntaxe HEREDOC. Mais que mettre dedans. Voici par exemple un document XML généré à partir de l’un de mes delicieux :

Comme vous le voyez, le titre et le lien sont bien gérés. C’est pour d’autres éléments que je me pose des questions :

  • les ?
  • L’ID utilisé envoyé à BlogMarks présente quel genre d’intérêt ?
  • Les différents tags (dans dc:subject) sont-ils réellement envoyés à ce format ? Et que faire si l’un d’entre eux n’existe pas encore ?

Bref, pas mal de questions auxquelles, j’espère, Stéphane pourra répondre …

Etat du projet

A l’heure actuelle voici ce que sait faire boo.km.arcs :

  • Lire et écrire les favoris d’IE
  • Lire et écrire les bookmarks Opera
  • Lire les liens delicious – par le biais du fichier RSS public, on n’a donc que les 30 derniers
  • Lire les liens blogmarks – par le biais du fichier RSS public

Et donc, voici ce qu’il me reste à faire avant d’en avoir fini avec ce projet rigolo :

  • Lire et écrire les favoris de Firefox
  • Ecrire les liens delicious (ça nécessite une authentification HTTP)
  • Ecrire les liens blogmarks (ça nécessite une authentification HTTP)
  • Réussir à s’authentifier en HTTP avec du Ruby. Et ça, ça ne m’a pas l’air évident : je dois récupérer le code réponse du Net::HTTP#get, vérifier qu’il s’agit du bon, soumettre le couple login/pwd encodé sous la bonne forme, et récupérer ma réponse.
  • Finir la déduplication qui plante un peu (une sombre histoire de références que j’utilise mal, à mon avis).

Une petite découverte à propos de Ruby

Je codais tranquillement hier soir (la lecture des bookmarks Opera, pour être précis. D’ailleurs, je lis aussi les favoris d’IE), quand j’ai commencé à subir un angoissant problème : j’ai une classe Bookmark qui contient ça :

def to_s(_deepness = 0)
    "t"*_deepness+attributes.inspect
end

et une classe Folder, qui hérite de Bookmark, qui contient ça

def to_s(_deepness = 0)
     returned = super.to_s(_deepness) # cette ligne plante
     @bookmarks.each do |bookmark|
             returned += "n"+bookmark.to_s(_deepness+1)
     end
     returned
end

Alors, pourquoi le super.to_s plante ? Parce qu’en Ruby, tout est objet. Y compris une méthode. Donc, d’après ce que je comprend, super ne se réfère pas à l’objet courant vu comme un Bookmark, mais à la méthode courante vue comme une méthode de Bookmark. Du coup, si je remplace la ligne incriminée par returned = super(_deepness) Ca marche. C’est fou, non ?

Quelques liens

Avant de commencer, et en guise de préambule, voici quelques liens qui vont me permettre de démarrer ce synchroniseur de bookmarks dans la joie :

  • L’API de Blogmarks, qui implique pas mal d’envoi de documents XML, et donc la consultation de la doc Ruby à ce sujet.
  • L’API de del.icio.us un peu plus facile (encore heureux).
  • Le format de fichier .url (pour IE)
  • Pour Opera, pas vraiment de soucis majeurs : j’ai écrit il y a bien longtemps un opera2html assez médiocre, mais dans lequel je parsais déjà le fichier opera6.adr
  • En revanche, pour le fichiers bookmarks.html de Mozilla/Firefox et tant d’autres, aucune info.