Bonjour !

Dans cet article nous allons réaliser notre premier bot. Cela nous permettra de découvrir plus en profondeur les packages pour les bots.

Le thème  : Un bot Facebook !

Problématique

A chaque fois qu’un de vos amis Facebook mentionne votre nom dans un commentaire, vous recevez une notification du type :

Après avoir ricaner devant le post, la politesse exige dans la grande majorité des cas de devoir apposer la mention “J’aime” sur ledit commentaire. Sauf que dans certains cas, vous oubliez de poser votre “J’aime” et cela pourrait vexer la personne qui vous a mentionné.

Nous allons donc faire un bot qui devra :

  • Se connecter sur votre compte Facebook
  • Identifier les notifications relatives à la mention de votre nom dans un commentaire
  • Les liker

Inutile me dites-vous ? Je vous rappelle que c’est votre premier bot, vous vous attendiez à quoi ?! Vous allez voir ça va être amusant, et je suis sûr que ça peut vous donner des idées. 🙂

Se connecter sur son compte Facebook

C’est la partie la plus facile. Avec Selenium, c’est du gâteau !

C’est parti !

Chargement de la page d’accueil

# on importe le package magique
from selenium import webdriver

# on charge le navigateur
driver=webdriver.Chrome("Chemin vers Chromedriver.exe") 

# la fonction get permet d'accéder à une URL
driver.get("https://www.facebook.com/")

# on passe en plein écran (pas obligatoire mais on veut en profiter pleinement)
driver.maximize_window()

Avec ce petit bout de code, vous devriez sur la page d’accueil du site. On note la présence très agréable du petit bandeau “Chrome est contrôlé par un logiciel de test automatisé ” qui flatte l’ego du hacker qui sommeil en vous. 😉

Remarque : Tu n’aurais pas quelques astuces à nous mettre sous la dents ?

Astuce n°1 (pour Windows) : Il est souvent très laborieux d’écrire un chemin dans son code, vous avez probablement été confronté à cela pour indiquer à Selenium où se trouvait le fichier chromedriver.exe. Pour récupérer très rapidement le chemin d’un fichier, maintenez la touche majuscule appuyée et clic droit sur le fichier. Vous pourrez alors choisir l’option “Copier en tant que chemin d’accès” et coller le chemin directement dans votre code. Si python vous renvoit une erreur, pensez à mettre la lettre ‘r’ devant le chemin. Dans mon cas, cela donne

driver=webdriver.Chrome(r"C:\WinPython\python-3.6.1.amd64\selenium\webdriver\Chrome\chromedriver_win32\chromedriver.exe")

Dans certains cas, cette astuce sauve la vie ! Et ne se limite pas à Python.

Connexion à votre compte Facebook

Maintenant que la page d’accueil a été chargée, on doit rentrer son identifiant et mot de passe. Mais comment indiquer à Selenium où se trouve les cases à remplir ?

Là encore, la magie de Selenium va opérer. Nous allons utiliser la fonction find_element_by_xpath qui nous permettra de sélectionner un élément (ou une liste d’éléments avec find_elements_by_xpath).

Concrètement, on clique droit sur l’élément et on choisit “Inspecter l’élément ” comme ceci :

Après cela, la console de Chrome va s’ouvrir à droite et vous aurez accès au code source de la page. N’ayez aucune crainte, pas besoin de connaissance.

En inspectant le champ où vous devez entrer votre adresse mail, vous arrivez sur la balise suivante :

Le xpath suivant suiffira à son identification : //*[@name=’email’]. Vous voulez en savoir plus sur les xpaths ? Je vous conseille ce tutoriel très complet (et de toute façon je suis là pour vous aider).

On doit maintenant indiquer à Selenium que c’est cet élément qui nous intéresse. On a donc

champ_email=driver.find_element_by_xpath('//*[@name="email"]')

On fait la même chose avec le champ pour le mot de passe :

Cela donne :

champ_mot_de_passe=driver.find_element_by_xpath('//*[@name="pass"]')

Puis avec le bouton de connexion :

bouton_connexion=driver.find_element_by_xpath('//*[@data-testid="royal_login_button"]')

Attention : Les xpaths que nous avons indiqués à Selenium peuvent événtuellement désigner plusieurs éléments différents. Par exemple, nos deux premiers éléments possèdent l’attribut class=’inputtext’ et nous n’aurions pas pu les différencier avec un xpath du type //*[@class=’inputtext’] (par défaut, Selenium aurait pris le premier)… Pour vérifier si votre xpath est correct et désigne un élément unique sur la page, ouvrez la barre de recherche de la console Chrome (Ctrl + F) et entrez le xpath que vous comptez fournir à Selenium. Vous verrez le nombre d’éléments détectés. Voyez par vous même :

Il nous reste maintenant à rentrer le login et le mot de passe dans les bonnes cases et cliquer sur le bouton de connexion. C’est très simple :

from selenium import webdriver
driver=webdriver.Chrome("Chemin vers Chromedriver.exe")
driver.get("https://www.facebook.com/")
driver.maximize_window()
# On détermine nos éléments
# Champ email
champ_email=driver.find_element_by_xpath('//*[@name="email"]')

# Champ mot de passe
champ_mot_de_passe=driver.find_element_by_xpath('//*[@name="pass"]')

# Bouton de connexion
bouton_connexion=driver.find_element_by_xpath('//*[@data-testid="royal_login_button"]')

# On remplit les cases
# Mail
champ_email.send_keys("jefflefoufou@free.fr")
# Mot de passe
champ_mot_de_passe.send_keys("le pouvoir")

# On clique sur le bouton
bouton_connexion.click()

Alors, c’était pas la mer à boire hein ? 🙂

Un dernier problème se pose, lorsque la page apparaît, une pop-up apparait demandant si l’on autorise les notifications Facebook comme ceci :

Cette pop-up nous empêche d’accéder à la page. Pour s’en débarrasser, il faut revenir un peu en arrière dans le code et changer les options de chrome :

 

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options=Options()
options.add_argument("--disable-notifications")
driver=webdriver.Chrome("Chemin vers Chromedriver.exe", chrome_options=options)

Cela devrait lui régler son compte.

Analyse des notifications

Nous voilà arriver sur la page. On veut ensuite accéder à l’ensemble des notifications.

Nous avons deux possibilités pour ça :

  1. On clique sur  et sur “Voir tout”
  2. On remarque que “Voir tout” nous conduit sur le lien “https://www.facebook.com/notifications”

Je vais vous faire les deux versions, ça vous entraînera :

# 1ère méthode

notifications=driver.find_element_by_xpath('//*[@class="_2n_9 f_click"]') #drôle de nom hein ?

notifications.click()

voir_tout=driver.find_element_by_xpath('//*[@href="https://www.facebook.com/notifications"]')

voir_tout.click()

# Deuxième méthode

driver.get("https://www.facebook.com/notifications")

Vous avez certainement compris que la deuxième méthode était la bonne.

On aurait pu également faire

driver.get("https://www.facebook.com/notifications")

Dès le début du programme (et on aurait juste eu à se loguer), mais ça aurait été moins drôle.

Détermination des mentions de votre nom dans un commentaire

Il faut maintenant qu’on ne récupère que les notifications qui vont nous être utiles avant de distribuer des likes en masse.

On commence par chercher un xpath commun à toutes les notifications. En cherchant un peu, on trouve rapidement qu’il faut et il suffit que le lien vers lequel pointe les mentions de commentaire contient toujours “comment_mention”. On vérifie dans la barre de recherche de la console que c’est bien le facteur discriminant et banco !

ma_liste=driver.find_elements_by_xpath('//*[contains(@href,"comment_mention")]')
liste_de_lien=[]
for element in ma_liste:
    liste_de_lien=liste_de_lien + [element.get_attribute("href")] 

Notez bien la présence du “s” à “elements” car à priori on en aura plusieurs (enfin j’espère pour vous). La fonction get_attribute permet de récupérer la valeur d’un attribut, ici le lien.

Et voilà ! Nous n’avons plus qu’à parcourir les pages et déposer les likes !

Liker le commentaire

Par défaut, le premier commentaire qui s’affiche sera celui où vous êtes cité. Ça nous arrange bien, car on trouve facilement le bouton “J’aime” à l’aide du xpath //*[@class=’UFILikeLink UFIReactionLink’] . Ce xpath n’est pas unique, mais comme on sait que le notre serra premier de la liste, il sera l’affaire.

On a plus qu’à vérifier si le bouton a déjà été pressé. Pour cela, on compare le code html du bouton non pressé et une fois pressé :

Like déposé

Like non attribué

La différence est flagrante : lorsqu’on a liké, ça change le nom de la class.

Il suffit de vérifier ça à l’aide de Selenium et cliquer dessus ou non.

# On parcourt tous les liens qu'on a précédemment déterminés.
for lien in liste_de_lien: 
   # On affiche la page
   driver.get(lien)
   # On identifie le pouce de like
   try:
      # On vérifie si le like n'a pas déjà été enfoncé
      like=driver.find_element_by_xpath('//*[@class="UFILikeLink UFIReactionLink"]')
      # Puis on claque son like
      like.click()
   except:
      # Sinon on passe au lien suivant
      pass

Voici le code complet :

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
options=Options() options.add_argument("--disable-notifications")
driver=webdriver.Chrome("Chemin vers Chromedriver.exe", chrome_options=options)

driver.get("https://www.facebook.com/")
driver.maximize_window()
# On détermine nos éléments
# Champ email
champ_email=driver.find_element_by_xpath('//*[@name="email"]')
# Champ mot de passe
champ_mot_de_passe=driver.find_element_by_xpath('//*[@name="pass"]')
# Bouton de connexion
bouton_connexion=driver.find_element_by_xpath('//*[@data-testid="royal_login_button"]')
# On remplit les cases
# Mail
champ_email.send_keys("jefflefoufou@free.fr")
# Mot de passe
champ_mot_de_passe.send_keys("le pouvoir")
# On clique sur le bouton
bouton_connexion.click()

driver.get("https://www.facebook.com/notifications")
# On tempère un peu le temps qu'il charge les notifications
time.sleep(3)


ma_liste=driver.find_elements_by_xpath('//*[contains(@href,"comment_mention")]')
liste_de_lien=[]
for element in ma_liste:
    liste_de_lien=liste_de_lien + [element.get_attribute("href")] 

# On parcours tous les liens qu'on a précédemment déterminés.
for lien in liste_de_lien:
    # On affiche la page
    driver.get(lien)
    # On identifie le pouce de like
    try:
        # On vérifie si le like n'a pas déjà été enfoncé
        like=driver.find_element_by_xpath('//*[@class="UFILikeLink UFIReactionLink"]')
        # Puis on claque son like
        like.click()
    except:
        # Sinon on passe au lien suivant
        pass
 
# On ferme Selenium
driver.close()

 

Et voilà c’est terminé ! Dans un prochain article, je vous apprendrais à lancer ce robot de manière planifiée et invisible ! Mais pour ça, il faudra revenir sur le blog. 🙂

Si vous avez des remarques, des questions ou des demandes, les commentaires sont là pour ça !

Jeff

 

Categories: Les bots

Leave a Reply

Your email address will not be published. Required fields are marked *