Facebook Beiträge holen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
trublu
User
Beiträge: 18
Registriert: Montag 20. Juni 2016, 20:05

Hallo,

ich würde mir gerne alle Beiträge von einer öffentlichen Facebook Seite und die dann z.B. nach Stichwörtern durchsuchen oder mit regex matchen. Einen echten Sinn hat das ganze zunächst eigentlich nicht, das ist eher nur eine Spielerei. Ich habe dazu 2 Möglichkeiten gefunden, leider funktionieren allerdings beide nicht.

Variante 1 nach http://simplebeautifuldata.com/2014/08/ ... er-part-1/
Zunächst der Code (zumindest der erste Zwischenschritt). Wenn ich den ausführe bekomme ich aber den HTTP Error 400: Bad Request

Code: Alles auswählen

import urllib2
import json

def main():
	#to find username go to  FB page, copy the end of URL 
	#e.g. http://facebook.com/walmart, walmart is the username
    list_companies = ["Walmart"]
    graph_url = "http://graph.facebook.com/"
	
    for company in list_companies:
        #make graph api url with company username
        current_page = graph_url + company
        
        #open public page in facebook graph api
        web_response = urllib2.urlopen(current_page)
        readable_page = web_response.read()
        json_fbpage = json.loads(readable_page)
 
        #print page data to console
        print company + " page"
        print json_fbpage["id"]
        print json_fbpage["likes"]
        print json_fbpage["talking_about_count"]
        print json_fbpage["username"]
        print "            "
	
if __name__ == '__main__':
    main()

Code: Alles auswählen

Traceback (most recent call last):
  File "fb.py", line 29, in <module>
    main()
  File "fb.py", line 15, in main
    web_response = urllib2.urlopen(current_page)
  File "/usr/lib/python2.7/urllib2.py", line 154, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib/python2.7/urllib2.py", line 435, in open
    response = meth(req, response)
  File "/usr/lib/python2.7/urllib2.py", line 548, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python2.7/urllib2.py", line 473, in error
    return self._call_chain(*args)
  File "/usr/lib/python2.7/urllib2.py", line 407, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 556, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 400: Bad Request
Variante 2 kommt von http://stackoverflow.com/questions/3283 ... 4#32896364
Ich glaube allerdings nicht dass das das richtige für mich ist. In den Kommentaren wird erwähnt dass man seine app bei facebook anmelden muss aber ich will ja nur ein lokales Skript. Trotzdem der Code

Code: Alles auswählen

from django.conf import settings
import facebook
import requests

class FacebookFeed:
    #settings.configure()
    token_url = 'https://graph.facebook.com/oauth/access_token'
    params = dict(client_id=settings.SOCIAL_AUTH_FACEBOOK_KEY, client_secret=settings.SOCIAL_AUTH_FACEBOOK_SECRET,                  grant_type='client_credentials')

    @classmethod
    def get_posts(cls, user, count=6):
        #try:
        token_response = requests.get(url=cls.token_url, params=cls.params)
        access_token = token_response.text.split('=')[1]
        graph = facebook.GraphAPI(access_token)
        profile = graph.get_object(user)
        query_string = 'posts?limit={0}'.format(count)
        posts = graph.get_connections(profile['id'], query_string)
        return posts
        #except facebook.GraphAPIError:
        #    return None

if __name__ == "__main__":
    posts = FacebookFeed.get_posts(user="Pepsi")
Ohne das settings.configure() meckert er an

Code: Alles auswählen

django.core.exceptions.ImproperlyConfigured: Requested setting SOCIAL_AUTH_FACEBOOK_KEY, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.
mit

Code: Alles auswählen

Traceback (most recent call last):
  File "facebook.py", line 2, in <module>
    import facebook
  File "/home/marvin/facebook.py", line 5, in <module>
    class FacebookFeed:
  File "/home/marvin/facebook.py", line 8, in FacebookFeed
    params = dict(client_id=settings.SOCIAL_AUTH_FACEBOOK_KEY, client_secret=settings.SOCIAL_AUTH_FACEBOOK_SECRET,                  grant_type='client_credentials')
  File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 54, in __getattr__
    return getattr(self._wrapped, name)
  File "/usr/local/lib/python2.7/dist-packages/django/conf/__init__.py", line 159, in __getattr__
    return getattr(self.default_settings, name)
AttributeError: 'module' object has no attribute 'SOCIAL_AUTH_FACEBOOK_KEY'
Wie bekomme ich alle Posts einer Facebook Seite in eine geeignete Datenstruktur um dann z.B. nach Beiträgen die das Wort "Foobar" enthalten zu filtern?
Zuletzt geändert von Anonymous am Mittwoch 28. Dezember 2016, 19:18, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@trublu: Soweit ich das sehe brauchst Du für die Graph-API ein Access-Token. Also eine Anmeldung von Dir oder Deiner App. Facebook möchte nicht das da jeder einfach so unkontrolliert mit der API operiert. Näheres wird sich in der API-Dokumentation bei Facebook finden lassen.
trublu
User
Beiträge: 18
Registriert: Montag 20. Juni 2016, 20:05

ich kapiere es nicht, sorry. In der Doku schreiben die immer so toll von einer App oder einer Website, aber ich will ja nur ein doofes Skript. Ich hab jetzt wieder von Stack overflow einen einfachen Code übernommen der mir meine Freunde listen soll. Hab mir dann auch meinen token besorgt, krieg aber trotzdem "facebook.GraphAPIError: Invalid OAuth access token."

Code: Alles auswählen

import facebook

def main():
    token = 'my_token'

    graph = facebook.GraphAPI(access_token=token)
    profile = graph.get_object("me")
    friends = graph.get_connections("me", "friends")

    friend_list = [friend['name'] for friend in friends['data']]

    print friend_list

if __name__ == '__main__':
    main()
Zuletzt geändert von Anonymous am Donnerstag 29. Dezember 2016, 20:21, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Auch dein doofes Skript wird sich online mit Facebook verbinden um die gewünschten Daten einzusammeln. Dazu braucht es ein Token.

Es ist eine denkbar schlechte Idee, einfach Code von irgendwoher zusammenkopieren und hoffen, dass würde dann schon funktionieren.

Wie sollen wir da helfen? Hast du den Code mal durchgelesen und versucht zu verstehen, was da so Schritt für Schritt passieren könnte?
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
trublu
User
Beiträge: 18
Registriert: Montag 20. Juni 2016, 20:05

Kebap hat geschrieben:Auch dein doofes Skript wird sich online mit Facebook verbinden um die gewünschten Daten einzusammeln. Dazu braucht es ein Token.
Das ist natürlich richtig, aber es gibt da für mich doch einen Unterschied ob das scheitert weil der Nutzer seiner App auf dem Smartphone nicht den Zugriff auf bestimmte Ressourcen erlaubt oder der Token das intern verhindert. Deswegen finde ich da die Dokumentation etwas verwirrend.
Kebap hat geschrieben:Es ist eine denkbar schlechte Idee, einfach Code von irgendwoher zusammenkopieren und hoffen, dass würde dann schon funktionieren.

Wie sollen wir da helfen? Hast du den Code mal durchgelesen und versucht zu verstehen, was da so Schritt für Schritt passieren könnte?
In diesem Fall halte ich es auch für keine schlechte Idee Code der nur wenige einfache Zeilen umfasst und angeblich funktioniert als MWE und Ausgangspunkt zu benutzen. Nachdem es mir durch diesen Code jetzt nämlich doch möglich war herrauszufinden dass ich nur einen völlig falschen token genommen habe (wo auch immer ich den jetzt her hatte) bin ich meinem eigentlichem Ziel jetzt schon deutlich näher gekommen. Von daher hätte eine geeignete Hilfe sein können "der Code funktioniert so, wahrscheinlich ist also der token falsch".

Trotzdem danke für die Unterstützung euch beiden.
Antworten