Rselenium et procédure automatique de login pour facebook

En essayant d’évaluer le flux généré depuis ma Page Facebook professionnelle vers mon site Web, j’ai essayé de comprendre comment exécuter les mises à jour régulières d’un tableau de contrôle. Je ne parlerai pas du tableau de contrôle en soi mais je me contentrerai ici de montrer comment on peut obtenir les données des posts sur Facebook. Il y a beaucoup d’informations que vous pourriez trouver sur internet expliquant comment le faire. Mais à mon avis pour un vrai débutant avec R, ce n’est pas suffisant à cause du manque de détail sur certaines étapes. Donc ce poste vise à vous donner les outils pour accomplir cette tâche avec à priori tout les détails requis. Toutefois, je pré-suppose que vous connaissez un peu R (particulièrement comment installer des packages), et pour tout ce dont vous auriez besoin hors de l’environnement R, vous pouvez trouver des informations supplémentaires ici.

Tout d’abord nous avons besoin d’un script R qui traitera les pages Facebook  ainsi que, pour mon but ici, une façon d’automatiser le lancement du serveur de Rselenium nécessaire pour le script R.

Accéder aux données Facebook

Notre démarche pour obtenir les données Facebook passera par l’utilisation de l’API Graph de Facebook, qui dépend d’un code d’utilisateur pour vous accorder l’accès. Pour automatiser l’accès au code, voici la procédure, que j’utilise:

  • automatiser la connexion à Facebook
  • allez à l’API Graph de Facebook et obtenir le code d’accès
  • récupérer les données à ma page professionnelle Facebook.

Ceci n’est pas une tâche difficile, Rselenium fonctionne bien pour se connecter à une page Facebook personnelle.

Le script R qui récolte les données Facebook

Comme le but de ce post est de montrer la façon de se connecter sur un site et spécifiquement sur Facebook ,vous aurez besoin d’informations sur la page ciblée, ici pour l’exemple ma page professionnelle. Vous avez besoin de l’ID numérique de la page. Ceci est accompli en utilisant ce site par exemple. Pour ma page l’ID est: 1939114249654307.

Si vous voulez essayer cette méthode par vous même sur votre page Facebook par exemple, cette ID va être utilisé dans le script R à deux emplacements (assurez-vous que les changements sont faits selon vos besoins) :

paste0("https://graph.facebook.com/v2.10/1939114249654307/feed?fields=shares&access_token=", Token)
# AND
paste0("https://graph.facebook.com/v2.10/1939114249654307/feed?fields=shares&access_token=", Token)

Voici le script R (nommé script_updater.R):

rm(list=ls())
YourLogIN <- 'email_address'
YourPassword <- "password"


library(RSelenium)
library(stringr)
library(RCurl)
library(rjson)

remDr <- remoteDriver(browserName = "phantomjs")
remDr$open()

remDr$navigate("https://fr-fr.facebook.com/login/")

#send username
remDr$findElement("id", "email")$sendKeysToElement(list(YourLogIN))
remDr$findElement("id", "pass")$sendKeysToElement(list(YourPassword))
remDr$findElement("id", "loginbutton")$clickElement()

#then we go to the API page
remDr$navigate("https://developers.facebook.com/tools/explorer")
df<-remDr$getPageSource()

TXT <- unlist(df)
Splitted <- unlist(str_split(TXT, "\\\\"))
Splitted2 <- Splitted[grep("value=", Splitted)]
Splitted3 <- unlist(str_split(Splitted2 , '\\"'))
To_test <- Splitted3[grep("^[a-zA-Z0-9]{30,}$", Splitted3)]
if(length(To_test)<1){stop("token not retrieved")}
Token <- Splitted3[grep("^[a-zA-Z0-9]{30,}$", Splitted3)]

# for posts data
Posts <- paste0("https://graph.facebook.com/v2.10/1939114249654307/feed?access_token=", Token)

Posts_data <- getURL(Posts)
Posts_data <- do.call(rbind, fromJSON(Posts_data)$data)
Posts_data <- data.frame(Posts_data, stringsAsFactors=F)

# for shares data
Shares <- paste0("https://graph.facebook.com/v2.10/1939114249654307/feed?fields=shares&access_token=", Token)

Shares_data<- getURL(Shares)
Shares_data <- do.call(rbind, fromJSON(Shares_data)$data)
invisible(sapply(1:length(Shares_data[, 1]), function(i){
	Shares_data[i, 1] <<- unlist(Shares_data[i, 1])
		}))

Si vous voulez essayer ce script par vous-même, assurez-vous que vous avez précédemment installé tous les packages nécessaires.

Automatiser l’utilisation de Rselenium

Maintenant que nous avons un script R fonctionnel, nous allons voir comment automatiser son utilisation. En tant qu’utilisateur de Mac, j’utilise la procédure suivante pour faire exécuter le script R tout seul :

  • il faut un Applescript pour lancer d’abord le serveur de sélénium et ensuite le script R
  • enfin il faut définir un cron (pour prévoir le lancement de la mise à jour du tableau de bord)

Je suis sûr les utilisateurs Windows et  linux trouveront leur propre façon de faire!

L’ Applescript pour automatiser le lancement de toute la procédure

Un Applescript  tel que ci-dessous va lancer automatiquement le serveur sélénium (si c’est votre première utilisation de sélénium avec R, vous pourriez trouver ceci utile). L’Applescript contient deux instructions, la première c’est pour le changement de répertoire, pour aller là où le fichier selenium-server-standalone-2.53.1.jar se trouve, et enfin exécuter le fichier.

tell application "Terminal"
	activate 
	do script "cd /Users/admin/Desktop 
	java -jar selenium-server-standalone-2.53.1.jar" 
end tell

Quand le serveur est lancé l’Applescript appelle le script R précédemment décrit.

tell application "R"
	activate 
	cmd "source('/Users/admin/Desktop/script_updater.R', chdir = TRUE)" 
end tell

Voici l’Applescript complet (nommé MyScript.scpt ):

tell application "Terminal"
	activate 
	do script "cd /Users/admin/Desktop 
	java -jar selenium-server-standalone-2.53.1.jar" 
end tell
delay 30
tell application "R"
	activate 
	cmd "source('/Users/admin/Desktop/script_updater.R', chdir = TRUE)" 
end tell

NB: delay est ajouté (30 secondes) pour donner le temps au serveur sélénium d’être lancé complètement.

Le cron pour lancer automatiquement l’Applescript

Le cron est défini pour lancer l’Applescript chaque lundi à 12:20 pour l’exemple, il pourrait être lancé tout les jours, toute les heures, etc:

20 12 * * 1 osascript /Users/admin/Desktop/MyScript.scpt

Si vous ne connaissez rien aux crons, vous pouvez consulter ce site. On définit un cron de la manière suivante: on tape « crontab -e » en ligne de commande dans Terminal (sur Mac), ensuite “a” pour ajouter ou modifier, “esc” suivit de :wq pour sauver votre création ou changement

Et voilà!

Maintenant, je vous laisse imaginer ce que vous pouvez faire de vos données. Vous les trouverez dans R en tapant « Post_data » et/ou « Shares_data ».

G.