Skip to content

Disséminer la bibliothèque avec Chrome (2/2)

22/02/2011

Plus d’un mois s’est écoulé depuis le premier billet de cette série, mais il y a quelques jours @akaReup m’a relancé sur le sujet alors je vais revenir sur le fonctionnement des extensions chrome avec le même exemple. Le but est toujours de signaler dans les résultats de recherche de Google que la bibliothèque possède des ouvrages qui correspondent à la requête.

Avertissement : je ne suis toujours pas expert du développement d’extensions chrome, loin s’en faut, et cette extension est le résultat d’expérimentations, certaines opérations sont peut-être réalisables de manière plus simple, si vous pensez que c’est le cas, les commentaires sont là, n’hésitez pas !

Dans tous les cas et pour aller plus loin, Google propose un espace de documentation sur la manière de développer les extensions pour chrome, proposant entre autres quelques tutoriels sur la manière de construire une extension basique.

Principe de fonctionnement

L’extension dont nous avions parlé la dernière fois fonctionne selon les étapes suivantes :

  • identifier que l’on est sur une page de résultats de Google
  • récupérer la requête tapée par l’internaute
  • envoyer cette requête à un serveur afin de connaître le nombre de résultats dans le Sudoc (via le script nb_res_sudoc.php)
  • afficher le nombre de réponses dans le sudoc à côté de la liste de résultats, s’il est différent de zéro.
Schéma des flux dans l'extension

Schéma des flux dans l'extension

Les fichiers de l’extension

Si vous n’aviez pas téléchargé l’extension lors du dernier billet je vous invite à le faire pour voir de quoi se compose réellement une extension, l’archive se trouve ici, la manière de l’installer dans Chrome dans le billet précédent.

manifest.json

Ce fichier suit un cadre défini par Google, sous la forme d’une structure arborescente présentée au format JSON. Dans notre extension test, on retrouve les éléments suivants :

  • name, version, description : comme leur nom l’indique !
  • logo : l’image que l’on souhaite voir apparaître dans la liste des extensions, en différentes tailles éventuellement.
  • background_page : le nom de la page de background, élément central de toute extension (détaillé plus bas)
  • content_script : la liste des content_script, qui permettent d’interagir avec le contenu des pages web consultées (détaillé plus bas)
  • permissions : les domaines avec lesquels l’extension peut échanger. Dans notre cas étant donné qu’on doit faire appel à du contenu sur un site distant (le sudoc par l’intermédiaire d’un script sur le serveur geobib.fr), on doit indiquer à l’application d’autoriser le domaine geobib.fr

background.html

Ce fichier est une background page, c’est à dire la page centrale de notre extension Chrome. L’interêt principal dans le cas qui nous intéresse est que les scripts exécutés dans cette page peuvent faire des requêtes de type cross domain (ce que ne permettent pas les content_scripts). On a donc créé dans ce fichier une fonction fetch_nb_occ qui sera appelée par notre script sudoc_in_google.js. Ce fichier background.html est inspiré de celui de cette extension chrome / twitter. On va ajouter dans cette page background.html ce que l’on appelle un listener, c’est à dire une fonction définie par Chrome (chrome.extension.onRequest.addListener(onRequest);) qui va se mettre en attente et qui dès qu’elle sera appelée par notre content_script (sudoc_in_google.js) passera les arguments à la fonction onrequest, qui en fonction de l’action demandée appellera les sous-fonctions souhaitées.

Pour le moment la seule action possible est get_nb_occ mais on pourrait imaginer étendre le principe à d’autres fonctionnalités qui feraient appel à d’autres ressources distantes.

sudoc_in_google.js

Ce fichier est le script central de notre extension, c’est ce que l’on appelle un content_script, autrement dit un fichier javascript qui va s’exécuter sur le contenu d’une page web. L’exécution de ce script est conditionnée par la clause matches du fichier manifest.json. Dans notre exemple, tout ce qui se trouve à une adresse qui commence par http://www.google.fr/* est considéré comme une page de résultat, et conduira à l’exécution du script. Si l’on regarde la clause content_scripts du fichier manifest.json, on voit qu’en plus de la clause matches, on trouve avant l’appel à notre script sudoc_in_google.js un appel à la bibliothèque Jquery. L’intérêt est de pouvoir bénéficier des facilités fournies par cette librairie dans l’écriture de notre script.

Dans le script en tant que tel, on va commencer par identifier la requête lancée par l’usager. Pour cela, on va chercher directement dans l’url à l’aide de la fonction suivante :

var q = href.match(/[&?]q=([^&]*)(?:&|$)/)[1];

Cette fonction a pour finalité de récupérer dans l’url tout ce qui se trouve après q= et avant un signe &, en utilisant le principe des expressions régulières. Étienne avait fait un court billet à ce sujet dans le cadre de sa série sur Yahoo Pipes. Il y aurait certainement matière à dire plus sur ces fonctionnalités qui permettent de faire de nombreux traitements sur les chaînes de caractères, peut-être l’occasion d’une future série de  billets.

À partir de là, on sait ce que l’usager a recherché, on va donc demander au script nb_res_sudoc.php le nombre de résultats (exemple d’interrogation de ce script). Comme on a l’a vu plus haut on ne peut lancer directement la requête depuis ce content_script, on va donc appeler le listener que l’on avait mis en attente dans le fichier background.html à l’aide de la ligne suivante :

chrome.extension.sendRequest({'action' : 'get_nb_occ', 'q' : q}, addToGoogle);

Si l’on détaille cet appel, il envoie une requête à notre extension qui contient :

  • des paramètres entre { et }. On a ici une action, ‘get_nb_occ’ et la requête de l’utilisateur, passée dans la variable q.
  • le nom d’une fonction, addToGoogle, qui est la fonction qui devra être exécutée une fois que le listener de background.html aura terminé son action. C’est ce qu’on appelle une fonction callback. Cette fonction ne sera pas décrite ici mais son fonctionnement est relativement simple, elle se contente d’aller ajouter à droite de la liste des résultats un lien vers le sudoc.

nb_res_sudoc.php

Puisque c’est là dessus qu’@akaReup m’a relancé je vais quand même présenter le fonctionnement de cette page. Ce script que j’ai stocké sur un serveur intermédiaire a pour but de faciliter la tâche de l’extension, en déléguant l’analyse de la page de résultats du sudoc à un script PHP. Plusieurs avantages à ce fonctionnement :

  • j’ai déja fait plusieurs scripts d’analyse pour le sudoc dans le cadre du projet GM/sudoc+, ça m’évite de refaire en javascript ce que j’ai déjà fait en PHP.
  • si jamais le sudoc change sa mise en forme je n’ai qu’à modifier une fois ce script sur mon serveur pour que toutes les extensions installées fonctionnent à nouveau.
  • comme on délègue ces traitements au serveur l’extension est réduite à sa plus simple expression, et c’est donc plus simple à comprendre !

Si l’on regarde l’exemple d’interrogation indiqué plus haut, on voit que ce script renvoie le strict minimum, à savoir pour une requête le nombre de résultats, tout cela au format JSON. Je ne vais pas rentrer ici dans le détail du fonctionnement de script mais sachez qu’il fait moins de 25 lignes et est disponible ici donc pour ceux que ça intéresse n’hésitez pas à l’analyser et à me poser des questions à son sujet.

La suite

Finalement la série s’arrêtera à deux billets, que j’espère assez denses pour fournir pas mal de pistes de développements. Si l’on en croit les chiffres centralisés sur Wikipédia, Chrome tourne autour de 10% de part de marché, il est encore loin derrière Internet Explorer et Firefox mais cela reste est une piste à suivre parmi d’autres pour proposer des outils à nos usagers …

N’hésitez pas à nous signaler vos réalisations en commentaire de ce billet !

About these ads
8 commentaires
  1. 22/02/2011 10:53

    Merci beaucoup pour ces explications détaillées !
    Maintenant, en terme de besoins immédiats, si j’ai envie d’adapter ton extension pour mon catalogue, je dois
    1. récupérer ton fichier pour le dezipper et l’adapter (image, nom, etc.)
    2. installer sur un serveur un script similaire à ton nb_res_sudoc.php. C’est lui qui va interroger le Sudoc pour en rapatrier le nombre de résultats (et générer le fichier JSON qui va contenir ce nombre).
    3. dans le fichier background.js, modifier la « permission » pour autoriser l’extension à accéder à mon serveur (et non plus à Geobib.fr)
    4. dans le fichier background.html, modifier la variable « url » pour interroger non plus geobib.fr mais mon script à moi.
    5. rezipper tous les fichiers de l’extension, et modifier l’extension [sic] en .crx

    Si j’ai tout bon dans ces étapes, pour ma part là où je bloque c’est l’adaptation du script nb_res_sudoc.php.
    Il te serait possible d’y rajouter des commentaires pour expliciter à quoi sert chaque ligne ?
    (ou éventuellement un billet complet sur ce blog ;-))
    Pour être plus clair : j’y comprends tout jusqu’à la ligne définissant la variable $ch (autrement dit, j’y comprends tout jusqu’à ce que ça commence vraiment à devenir intéressant…).

  2. symac permalink
    22/02/2011 12:38

    Tu as tout juste dans ton analyse de ce qui est nécessaire pour adapter cette solution.

    Je suis conscient que ça manque de commentaires dans le code source de nb_res_sudoc.php, j’envisage donc de faire un nouveau billet à cette série qui serait « comment screen scraper son opac ? », j’essaie de préparer ça rapidement !

Trackbacks

  1. Tweets that mention Disséminer la bibliothèque avec Chrome (2/2) « Bibliothèques [reloaded] -- Topsy.com
  2. Disséminer la bibliothèque avec Chrome (1/X) « Bibliothèques [reloaded]
  3. Capturer les données d’écran d’un opac « Bibliothèques [reloaded]
  4. Disséminer la bibliothèque avec Chrome (2/2) | docnews
  5. Ta BU dans Chrome (le kit Just Do It) « Bibliothèques [reloaded]
  6. Ta BU dans Chrome (le kit Just Do It) « Bibliothèques [reloaded]

Les commentaires sont fermés.

Suivre

Recevez les nouvelles publications par mail.

Rejoignez 115 autres abonnés

%d blogueurs aiment cette page :