#1 Le 06/03/2012, à 18:39
- Levi59
Récupérer commentaires facebook
Bonjour!
Je voudrais savoir si quelqu'un sait comment importer dans un fichier texte les commentaires d'une page facebook (ex : http://www.facebook.com/photo.php?fbid= … 91&type=1), sachant que les commentaires doivent être affiché grâce à un bouton qui affiche les commentaires par tranches de 50 (il laisse les plus récent mais il faut cliquer pour en voir de plus anciens) et que lorsque le commentaire est trop long, il est tronqué (lien "Afficher la suite").
Mon but est en fait de récupérer les liens déposés par les autres joueurs. Malheureusement, wget ne fonctionne pas dans ce cas de figure...
Hors ligne
#2 Le 07/03/2012, à 01:32
- sputnick
Re : Récupérer commentaires facebook
Un début de script :
#!/usr/bin/python2
# access facebook :
email = ""
passw = ""
import cookielib, urllib2, urllib
class FB:
jar = cookielib.CookieJar()
cookie = urllib2.HTTPCookieProcessor(jar)
opener = urllib2.build_opener(cookie)
headers = {
"User-Agent" : "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.1.14) Gecko/20080609 Firefox/2.0.0.14",
"Accept" : "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,text/png,*/*;q=0.5",
"Accept-Language" : "en-us,en;q=0.5",
"Accept-Charset" : "ISO-8859-1",
"Content-type": "application/x-www-form-urlencoded",
"Host": "m.facebook.com"
}
def login(self):
try:
params = urllib.urlencode({'email':email,'pass':passw,'login':'Log+In'})
req = urllib2.Request('http://m.facebook.com/login.php?m=m&refsrc=m.facebook.com%2F', params, self.headers)
res = self.opener.open(req)
html = res.read()
#print res.getheader('location').split('/')[3]
except urllib2.HTTPError, e:
print e.msg
except urllib2.URLError, e:
print e.reason[1]
return False
def fetch(self,url):
req = urllib2.Request(url,None,self.headers)
res = self.opener.open(req)
return res.read()
a = FB()
a.login()
print a.fetch("https://www.facebook.com")
Légèrement modifié d'après une recherche sur stackoverflow : http://stackoverflow.com/questions/2030 … ith-python
Ca utilise la version mobile de facebook, c'est un peu plus facile.
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#3 Le 07/03/2012, à 06:20
- sputnick
Re : Récupérer commentaires facebook
Une nouvelle version plus complète, dit moi si ça marche chez toi ( remplacer
facebook_email = "XXXXXXXXX@XXXXXX.XX"
facebook_passw = "XXXXXXXXXXXXXXXXXXXXXXXXX"
)
#!/usr/bin/python -u
# -*- coding: utf8 -*-
facebook_email = "XXXXXXXXX@XXXXXX.XX"
facebook_passw = "XXXXXXXXXXXXXXXXXXXXXXXXX"
DEBUG = 0
import cookielib, urllib2, urllib, time, sys
from lxml import etree
class FB:
jar = cookielib.CookieJar()
cookie = urllib2.HTTPCookieProcessor(jar)
opener = urllib2.build_opener(cookie)
headers = {
"User-Agent" : "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7",
"Accept" : "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,text/png,*/*;q=0.5",
"Accept-Language" : "en-us,en;q=0.5",
"Accept-Charset" : "utf-8",
"Content-type": "application/x-www-form-urlencoded",
"Host": "m.facebook.com"
}
def login(self):
try:
params = urllib.urlencode({'email':facebook_email,'pass':facebook_passw,'login':'Log+In'})
req = urllib2.Request('http://m.facebook.com/login.php?m=m&refsrc=m.facebook.com%2F', params, self.headers)
self.opener = urllib2.build_opener(urllib2.HTTPHandler(debuglevel=DEBUG))
res = self.opener.open(req)
html = res.read()
except urllib2.HTTPError, e:
print e.msg
except urllib2.URLError, e:
print e.reason[1]
return False
def fetch(self,url):
req = urllib2.Request(url,None,self.headers)
res = self.opener.open(req)
return res.read()
def die(arg):
print arg+"\n", sys.stderr
sys.exit(1)
def xpathor(xml):
tree = etree.HTML(xml)
return str(tree.xpath('//a/@href')[1])
if facebook_email == "XXXXXXXXX@XXXXXX.XX" and facebook_passw == "XXXXXXXXXXXXXXXXXXXXXXXXX":
die("You have to change default value of variables 'facebook_email' & 'facebook_passw' in the beginning of this script.")
a = FB()
a.login()
time.sleep(2)
body = a.fetch("http://www.facebook.com/photo.php?fbid=404284859586659&set=a.355112834503862.104278.354259211255891&type=1")
if "You must log in first" in body:
die("login error")
time.sleep(2)
follow = xpathor(body)
nexturl = follow
while nexturl == follow:
print "enter while loop"
url = "http://www.facebook.com/"+follow
print "DEBUG "+url
body2 = a.fetch(url)
nexturl = xpathor(body2)
time.sleep(0.5)
Copie colle la sortie ici stp.
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#4 Le 07/03/2012, à 22:10
- Levi59
Re : Récupérer commentaires facebook
Merci de ton aide! Je suis un peu surbouqué cette semaine (salon à paris, puis lille puis noeud les mines...)
Je teste ça dès que possible et je fais un rapport! Encore merci!
Hors ligne
#5 Le 07/03/2012, à 22:24
- sputnick
Re : Récupérer commentaires facebook
Si quelqu'un d'autre l'a essayé, avez vous des problèmes de login ?
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#6 Le 08/03/2012, à 20:32
- Levi59
Re : Récupérer commentaires facebook
Je viens de tester et j'ai une erreur :
akira@virtualcrunchbang:~/urls$ ./import_comm.py
login error
<open file '<stderr>', mode 'w' at 0x7fee9701c1e0>
J'ai aussi du installer python-lxml mais ça c'était pas un problème
Hors ligne
#7 Le 11/03/2012, à 16:16
- sputnick
Re : Récupérer commentaires facebook
Ok, celui là est fonctionnel et complet, ya même la gestion du keyring pour les passwords.
Pour lire (coloration) http://www.sputnick-area.net/scripts/fa … rl.py.html
Pour télécharger : http://www.sputnick-area.net/scripts/fa … rom_url.py
Les fichiers sources html seront copiés dans /tmp/facebook_coms*.html
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#8 Le 11/03/2012, à 20:00
- Levi59
Re : Récupérer commentaires facebook
Pas le temps de réessayer mais pour répondre à tes questions (mail) c'est un jeu ou on entretient un jardin et on rempli des missions (cultiver X parcelles de sucre d'orge, de tacos ou autres). les commentaires contiennent des liens qui rapportent des points (monnaie ou exp) si on clic dessus et mon but est de récupérer le maximum de lien (Tous si le script marche) et de lancer des routines d'ouverture de ces liens sur une VM avec chromium (ça je sais déjà faire même si c'est vraiment barbare).
Bref tout ça c'est pour faire plaisir à ma petit femme XD
Et passer le temps accessoirement car le script pour chromium m'as pris 2-3 jour à optimiser pour réduire les erreurs.
En tout cas merci de ton aide. Je ferais un rapport après l'avoir testé
Hors ligne
#9 Le 11/03/2012, à 20:26
- sputnick
Re : Récupérer commentaires facebook
monnaie ou exp
tu peux etre plus precis ?
monnaie, on parle d'€ ?
exp ???
Poste ton script chromium
Dernière modification par sputnick (Le 11/03/2012, à 20:27)
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#10 Le 11/03/2012, à 21:31
- Levi59
Re : Récupérer commentaires facebook
Non de l'argent virtuel et d’expérience dans le jeu. rien à y gagner XD
Pour le script chromium, il est sur mon autre pc, j'edite d'ici 1h pour le rajouter
Hors ligne
#11 Le 11/03/2012, à 23:30
- Levi59
Re : Récupérer commentaires facebook
J'ai lancé le script il y a 20 minutes et il n'est toujours pas terminé... (970 pages récupérées)
Pour le script d'ouverture, le voici :
(Je sais que la méthode est foireuse mais comme je ne connaissais pas le javascript [pas possible d'écrire un addon] et que seul google chrome permet un processus/onglet [limité à 20-22 chez moi], j'ai donc écrit en bash en cherchant à gérer les onglets )
#!/bin/bash
Url_Faites="urls_faites.txt"
Fichier_Urls="/media/Partage_VB/urls.txt"
Copie_Fichier_Urls="Orig_urls.txt"
Urls_Uniques="urls.txt"
TIMER=1
Log="ERROR.log"
##########{{{{{{{{{{}}}}}}}}}}##########
>$Log
exec 2>$Log
function __usageCPU() {
read cpu user nice system reste < <(grep "^cpu " /proc/stat);
echo "$user+$nice+$system" | bc
}
function __calculUsageCpu() {
NB_CPU=$(grep "^processor" /proc/cpuinfo | wc -l)
MESURE_1=$(__usageCPU)
sleep $TIMER
MESURE_2=$(__usageCPU)
CPU_USAGE=$(echo "scale=0; ($MESURE_2-$MESURE_1)/($TIMER*$NB_CPU)" | bc)
echo $CPU_USAGE
}
function __test_Processus(){
pgrep -c chromium >/dev/null || {
(nohup chromium-browser --process-per-tab &> /dev/null &) &
echo "Lancement de chromium"
# while [[ $(pgrep -fl chromium | grep "renderer" | wc -l) -lt 1 ]]
# do
# sleep 1
# done
}
}
function __reload(){
echo "Reload dans $1 secondes"
sleep $1
j=0
k=0
OngletsOld=0
Pids=()
Pids=( $(pgrep -fl chromium | grep renderer | cut -d" " -f1) )
kill -9 ${Pids[@]}
# killall -g chromium-browse
Pids=( $(pgrep -fl chromium | cut -d" " -f1) )
for Pid in ${Pids[@]}
do
[[ -f /proc/$Pid/exe ]] && kill -9 ${Pid}
done
until [[ $(pgrep -fl chromium | wc -l) -eq 0 ]]; do sleep 1;done
__test_Processus
}
[[ -f $Fichier_Urls ]] && __test_Processus || exit
[[ -f ${Copie_Fichier_Urls} ]] && {
cmp ${Fichier_Urls} ${Copie_Fichier_Urls} && {
##Identiques
echo " Liste d'urls identiques :
-Pas de purge de ${Url_Faites}"
} || {
##Differents
echo " Liste d'urls différentes :
-Copie du fichier D'origine
-Purge de ${Url_Faites}"
cp ${Fichier_Urls} ${Copie_Fichier_Urls}
>${Url_Faites}
}
} || {
cp ${Fichier_Urls} ${Copie_Fichier_Urls}
>${Url_Faites}
}
cat ${Copie_Fichier_Urls} ${Url_Faites} | sort | uniq -u > ${Urls_Uniques}
lignes=$(wc -l ${Urls_Uniques})
i=0
k=0
while read
do
echo ${REPLY} >>${Url_Faites}
sed -i '1d' ${Urls_Uniques}
REPLY=${REPLY/https:/http:}
REPLY=${REPLY%% *}
chromium-browser ${REPLY} 2>&1 >/dev/null & #--process-per-tab
((i++))
((j++))
OngletsOld=$Onglets
sleep 2
Onglets=$(pgrep -fl chromium | grep "renderer" | wc -l)
[[ $Onglets -eq 0 && $j -gt 3 ]] && {
while (($(__calculUsageCpu)>=50))
do
__reload 1 #20
done
}
[[ ${OngletsOld} -eq ${Onglets} ]] && {
((k++))
}
[[ $Onglets -eq $OngletsOld && $k -gt 3 && $Onglets -gt 0 ]] && {
__reload 30 #5
}
printf "%05d/%05d --- %02d onglets ouverts\n" "${i}" "${lignes}" "$Onglets"
[[ $Onglets -ge 20 ]] && {
__reload 40 #5
}
# [[ $i -eq 20 ]] && exit
done < ${Urls_Uniques}
__reload 40 #5
echo "Terminé! ^^"
exit
Il faut s'identifier sur facebook avant et maintenir la connexion entre 2 redémarrage.
Dernière modification par Levi59 (Le 11/03/2012, à 23:40)
Hors ligne
#12 Le 11/03/2012, à 23:41
- sputnick
Re : Récupérer commentaires facebook
Peux tu expliquer ce qu'est censé faire ton script ? Je pensait pas qu'il était aussi long.
Ya sûrement mieux à faire effectivement, comme de lancer chromium direct depuis python et en utilisant le même cookie, idéalement. Mais avant ça, que fais tu des URLs dans chromium, c'est pour les voir de visu ou juste avoir cliqué sur un lien ?
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#13 Le 11/03/2012, à 23:55
- Levi59
Re : Récupérer commentaires facebook
Pour l'instant je récupère les liens sur facebook que je stocke en liste. Comme il arrive que le script plante ou que je doive arrêter, je compare cette liste à une liste d'url déjà effectuées pour ne pas recommencer du début.
A partir de là, j'ouvre lien par lien jusqu'à avoir 20 onglets dans chromium et j'attends 30s~. Les autres test sont là pour les cas où chromium plante (par exemple, il ne créé pas les onglets et la mémoire s'emballe, les onglets s'ouvrents dans des processus déjà utilisés... etc).
J'ai essayé de supprimer au mieux les erreurs ou de réduire leur impact.
Edit :
le script s'est terminé :
akira@virtualcrunchbang:~/urls$ ./import_comm.py
Your facebook password >>>
Please set a password for your new keyring
Password:
Password (again):
Error: blank passwords aren't allowed.
Password:
Password (again):
Please input your password for the keyring
Password:
fetching login url...
fetching main url...
writing /tmp/facebook_coms1.html
fetch url https://m.facebook.com/photo.php?fbid=404284859586659&id=354259211255891&p=1&refid=13...
writing /tmp/facebook_coms1.html
fetch url https://m.facebook.com/photo.php?fbid=404284859586659&id=354259211255891&p=2&refid=13...
writing /tmp/facebook_coms2.html
[...]
fetch url https://m.facebook.com/photo.php?fbid=404284859586659&id=354259211255891&p=1454&refid=13...
No more URLs...
<open file '<stderr>', mode 'w' at 0x7ff6470651e0>
akira@virtualcrunchbang:~/urls$
Dernière modification par Levi59 (Le 12/03/2012, à 00:06)
Hors ligne
#14 Le 12/03/2012, à 00:27
- sputnick
Re : Récupérer commentaires facebook
Tu réponds pas précisément à mes questions précises :°
Ben dit donc, ça en fait des pages !
Ya moyens de récupérer les liens super facilement en shell :
mech-dump --links /tmp/facebook*html | grep monster-world > links_a_comparer_avec_les_anciens
Si t'a pas cette commande, installe là :
sudo apt-get install libwww-mechanize-perl
Note: a vos risques et périls : https://www.facebook.com/apps/site_scra … _terms.php
Dernière modification par sputnick (Le 12/03/2012, à 00:30)
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#15 Le 12/03/2012, à 00:44
- Levi59
Re : Récupérer commentaires facebook
Je vais commenter mon code pour mieux le comprendre mais pas ce soir (il se fait tard ^^).
Pour ce qui est du robot, je pense qu'il n'y a pas trop de risque car cette facon de faire d'ouvrir des liens collectés, je le faisais déjà à la main avant.
Hors ligne