Remarque de François aujourd’hui : “Ca serait cool de pouvoir connaître les followers qu’on a en commun avec quelqu’un.” Hey, un challenge! J’avais justement vu un post la veille pour voir les gens que tu follow mais qui ne te followent pas. C’est en Ruby aussi et ça utilise la gem twitter.

Allez, c’est parti, ça doit pas être compliqué.

Solution à l’arrache pour comparer 2 comptes Twitter

J’ai d’abord essayer de faire marcher le truc avant de chercher à l’optimiser. J’ai eu ça :

require 'rubygems'
gem 'twitter'
require 'twitter'
 
base01= Twitter.follower_ids('iamstark')
base02= Twitter.follower_ids('bbx')
mutual = base01 & base02
puts mutual.count.to_s + " mutual friends:"
mutual.each { |id| puts Twitter.user(id).screen_name}
# 18 mutual friends:
# puis la liste des followers en commun

J’utilise la gem twitter. Je récupère deux tableaux avec tous les id des followers, puis avec base01 & base02, j’ai l’intersection des deux tableaux, c’est à dire, les valeurs qui existent dans les deux tableaux. Puis j’affiche le nombre des followers communs et j’affiche tour à tour leur nom.

Et si je veux comparer un 3e compte ?

J’ai tout de suite remarqué que j’écrivais deux fois la même chose : Twitter.follower_ids. C’est un peu redondant, surtout si on veut comparer un 3e compte :

base01= Twitter.follower_ids('iamstark')
base02= Twitter.follower_ids('bbx')
base03= Twitter.follower_ids('xuoan')
mutual = base01 & base02 & base03
puts mutual.count.to_s + " mutual friends:"
mutual.each { |id| puts Twitter.user(id).screen_name}
# 13 mutual friends:
# puis la liste des followers en commun aux 3 comptes

Ouh la. Ca marche, ok, mais pour rajouter un compte, je dois :

  • copier-coller la ligne Twitter.follower_ids
  • ajouter le tableau à mutual

C’est long, c’est répétitif, et ça peut engendrer des erreurs. Je suis sûr que je peux faire mieux!

Solution optimale

Je me suis dit que je voulais tout simplement avoir à rentrer les noms des comptes dans un tableau. A partir de là, si je voulais ajouter un compte, j’ajoutais juste une entrée dans le tableau. Il fallait donc que je dynamise le tout. Avec l’aide de Julien, j’arrive à ça (j’ai mis des commentaires en plus) :

require 'rubygems'
gem 'twitter'
require 'twitter'
 
# tableau des twitterers à comparer
t = ['iamstark', 'bbx', 'xuoan', 'mrboo']
 
# tableau des followers en commun
m = Twitter.follower_ids(t[0])
 
t.each { |e| m &= Twitter.follower_ids(e)}
puts m.count.to_s + " mutual friends:"
m.each { |id| puts Twitter.user(id).screen_name}

J’ai mon tableau “t” où je peux mettre autant de comptes que je veux, et en retirer/rajouter très facilement. C’est la seule variable de mon code (dans le sens où c’est la seule ligne que je vais modifier pour les tests suivants).
La ligne importante est celle où j’initialise le tableau “m”. Il faut que ce tableau ne soit pas vide au départ parce que je vais comparer de façon itérative les valeurs qui vont y être ajoutées (avec &=). Donc au départ, il faut qu’il y ait quelque chose, sinon, au final, il restera vide. Je mets donc la valeur du premier tableau.
Puis le reste est pareil.

Les 4 comptes ont 11 followers en communs.

EDIT : un peu mieux. Je ne compare plus le 1er élément avec lui-même.

require 'rubygems'
gem 'twitter'
require 'twitter'
 
# tableau des twitterers à comparer
t = ['iamstark', 'bbx', 'xuoan', 'mrboo']
 
# tableau des followers en commun
m = Twitter.follower_ids(t[0])
 
t.each_with_index { |e,i| m &= Twitter.follower_ids(e) unless i==0}
puts m.length.to_s + " mutual friends:"
m.each { |id| puts Twitter.user(id).screen_name}