Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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

script a écrit :

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 wink

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é wink

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 wink

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 wink

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 wink)

#!/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 ! big_smile

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. wink

Hors ligne