8 mars 2008

importer les contacts avec ruby on rails

Il est toujours intéressant de proposer à l'utilisateur d'importer les contacts de ces différents réseaux, aussi bien pour lui que pour agrandir votre propre réseau.

Importer les contacts avec rails n'a pas été si facile la seule librairie disponible été contacts. Très facile d'utilisation mais les seuls comptes fonctionnant était les comptes gmail. Ceci étant dis cette librairie a été remise à jour récemment. Donc j'imagine qu'elle doit marcher normalement maintenant.

Il y a quelques mois de ça, est sortie la librairie Blackbook, simple et fiable. Pour importer les contacts pas besoin de selectionner le réseau (hotmail, gmail, yahoo etc...), simplement login et le mot de passe et la Blackbook se débrouille :
@contacts = Blackbook.get :username => params[:email], :password => params[:password]

Ceci retournera un Array de Hash. Le soucis c'est que selon le reseau les Hash renvoyés n'auront pas les mêmes clés.
sous gmail:
{:name=>"johnny", :email=> "johnny.h@fakemail.fr"}
sous hotmail/live:
{:name=>"johnny", :email=>"", :"Windows Live ID"=>"johnny.h@fakemail.fr"}
sous yahoo:
{:name=>"mail: johnny.h@fakemail.fr ", :email=>"@yahoo.com"}

Donc le seul moyen est de parser l'Array et d'en extraire nom et email:

@contacts = @contacts.collect do |contact|
email = nil # doit être initialiser
# initialalisation du nom du contact
name = contact[:name] if !contact[:name].include?('@')
# recherche de l'email dans toutes clés du hash
contact.each_value do |e|
# on regarde avec une expression regulière
# si on trouve qqchose qui ressemble a un email
# si on trouve on passe à l'élément suivant
(email = e.match(/([_\w\d-]+(\.[_\w\d-]+)*@[\w\d-]+(\.[\w\d-]{2,})+)|(^$)/i)[0] rescue nil) && break
end
{:name => name, :email => email} if !email.blank? && !current_user.email?(email)
end.compact


Voilà, le tour est joué on se retrouve avec un array de hash bien organisé, du style:
{:name=>"johnny", :email=> "johnny.h@fakemail.fr"}
quelque soit le compte sur lequel on se connecte.

à noter que les noms ne seront pas obligatoirement bon mais le principal est d'avoir les emails pour envoyer les invitations.

Aucun commentaire: