6 Stimmen

Facebook FQL - Wie kann ich die Beiträge abrufen, die ich an die Pinnwand eines Freundes geschrieben habe?

Ich habe eine Facebook-Desktop-App mit einigen Testbenutzern, die alle die Berechtigungen stream_read & offline access erhalten haben. Ich kann ganz einfach Beiträge im Stream und im Profil der einzelnen Benutzer abrufen. Was ich nicht einfach tun kann, ist das Abrufen von Beiträgen, die ein Benutzer an die Pinnwand eines seiner Freunde geschrieben hat.

Tatsächlich hat dies früher mit einer ziemlich komplexen Multiquery funktioniert, aber jetzt funktioniert es nicht mehr oder nur noch sporadisch...

Ist jemand bereit, seine Methode mitzuteilen, wenn es eine gibt, oder zu erörtern, welche Einschränkungen es bei dieser Art von komplexen Abfragen geben könnte?

2voto

Justin Jenkins Punkte 25601

Ich habe das ausprobiert und bin auf das gleiche Problem gestoßen, aber vielleicht kann ich es ein wenig besser erklären.

Es könnte sich lohnen, dies auf der Facebook-Wiki-Talkseite zu posten und zu sehen, ob jemand von Facebook etwas Licht ins Dunkel bringen kann, es sei denn, ich übersehe hier etwas.

Überall, wo ich BENUTZER_ID muss mit dem Benutzer ausgefüllt werden, als der Sie suchen möchten, und F_ID1 , F_ID2 sind Freunde ...

FQL #1: sollte (theoretisch) funktionieren

  • Erstellen Sie zunächst eine Liste aller Ihrer Freunde
  • dann diese Liste in der IN-Klausel verwenden der nächsten Abfrage
  • nur Beiträge herausfiltern, die von der USER_ID
  • sicherstellen, dass die Nachricht nicht NULL ist

FQL #1: Es werden keine Beiträge zurückgegeben

{
"friends":"SELECT uid2 FROM friend WHERE uid1= USER_ID ",

"postsonfriendswall":"SELECT source_id, actor_id, target_id, message FROM stream WHERE source_id IN (SELECT uid2 FROM #friends) AND message != '' AND actor_id = USER_ID "

}

FQL #2: Beiträge werden zurückgegeben

Seltsamerweise aber, wenn Sie sich auf einen Freund (F_ID1) beschränken, Sie werden die Beiträge von USER_ID an die Pinnwand ihrer Freunde zurückholen!

{
"friends":"SELECT uid2 FROM friend WHERE uid1= USER_ID ",

"postsonfriendswall":"SELECT source_id, actor_id, target_id, message FROM stream WHERE source_id IN (SELECT uid2 FROM #friends WHERE uid2 = F_ID1) AND message != '' AND actor_id = USER_ID "

}

FQL #3: Es werden keine Beiträge zurückgegeben

Versuchen Sie jedoch, einen weiteren Freund zu den IN F_ID1 & F_ID2 hinzuzufügen ... wieder kein Ergebnis ...

{
"friends":"SELECT uid2 FROM friend WHERE uid1= USER_ID ",

"postsonfriendswall":"SELECT source_id, actor_id, target_id, message FROM stream WHERE source_id IN (F_ID1,F_ID2) AND message != '' AND actor_id = USER_ID "

}

0 Stimmen

Hey Justin - danke für die Eingabe - ich möchte in der Lage sein, eine einzelne Abfrage (verschachtelt oder Multiquery) pro Benutzer zu tun - sonst sprechen wir über N x N # Abfragen je nach avg. # von Freunden pro Benutzer. Ich werde mich auf der Facebook-Entwicklungsseite erkundigen und ein Update posten, wenn ich etwas erreiche.

0 Stimmen

Es würde mich sehr interessieren, warum ich nicht mehr als einen Beitrag eines Freundes auf einmal zurückbekomme ... also gib das bitte weiter, wenn du es herausfindest. Eine Bewertung dieser Antwort, wenn sie hilfreich ist, wäre ebenfalls willkommen :)

0 Stimmen

Hey Justin - sieh dir meine Antwort unten an und sag mir, ob das bei dir funktioniert hat.

0voto

simianarmy Punkte 1445

KORREKTUR: Nach weiteren Tests habe ich festgestellt, dass diese Lösung NICHT zu 100% funktioniert. Sie wird zurückkehren einige aber nicht alle Beiträge, die Sie auf anderen Wänden verfasst haben - ich weiß nicht, was der begrenzende Faktor ist - daher betrachte ich dies als eine offene Frage.

Die Teillösung: Dies ist also die FQL-Multiquery, die die Pinnwandeinträge eines Benutzers auf den Pinnwänden seiner Freunde generiert:

{"query1":"SELECT post_id FROM stream WHERE source_id IN (SELECT target_id FROM connection WHERE source_id = USER_ID)", 
 "query2":"SELECT actor_id, post_id, target_id, message FROM stream WHERE (actor_id = USER_ID) AND (post_id IN (SELECT post_id FROM #query1))"}

Die erste Abfrage führt ein verschachteltes Select für alle "Ziele" durch, die zu einem Benutzer gehören (Freunde & Apps?) und verwendet diese als source_id-Wert für eine Stream-Abfrage.
Die 2. Abfrage verwendet die von der 1. Abfrage zurückgegebenen post_id's, um den Stream erneut abzufragen, diesmal mit dem actor_id-Attribut, das auf die ID des Benutzers gesetzt ist.

Ich weiß nicht, ob ORDER- oder LIMIT-Klauseln helfen würden, aktuellere Abfragen zurückzugeben oder nicht - kann das jemand bestätigen?

0voto

Rob K. Punkte 467

Zumindest fand ich, dass ich mit php:

$facebook->api("/<friend_uid>/feed") 

um genau das zurückzubekommen, was auf der Wand eines Benutzers angezeigt wird. Und Sie können die Abfrage auslagern. Leider können Sie Ihre Abfrage nicht filtern, mit der Ausnahme, dass Sie die Pinnwand eines Freundes wie oben gezeigt auswählen können. Allerdings ist die API verdammt langsam und erfordert VIELE mehr API-Aufrufe als eine Multiquery. Traurig, aber dies scheint die einzige Option zu sein, wenn man in eine Situation gerät, in der man nicht alle Beiträge sieht, die man bei der Verwendung von FQL (entweder einer einzelnen FQL oder einer Multiquery) zu sehen erwartet.

Fehler auf Facebook protokolliert: Wenn Sie dieses Problem haben, senden Sie bitte Ihre Rückmeldung zu diesem Fehler! http://bugs.developers.facebook.net/show_bug.cgi?id=11247

0 Stimmen

Ich glaube nicht, dass es jetzt noch möglich ist, Multiquery zu verwenden, da dies einfach zu viele Daten sind, als dass Facebook sie in einer einzigen Anfrage zurückgeben könnte. Wie Sie habe auch ich meine Beiträge auf den Pinnwänden meiner Freunde abgefragt, einen nach dem anderen. Bei einer durchschnittlichen Freundeszahl von etwa 100 ist das in Ordnung, aber manche Leute haben mehr als 1.000 Freunde, was natürlich keine ideale Lösung ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X