it-swarm.com.de

Facebook Graph API v2.0 + - / me / friends gibt leer zurück oder nur Freunde, die auch meine Anwendung verwenden

Ich versuche, mit der Graph API v2.0 den Namen und die ID meines Freundes abzurufen, aber die Daten werden leer zurückgegeben:

{
  "data": [
  ]
}

Als ich v1.0 verwendete, war alles in Ordnung mit der folgenden Anfrage:

FBRequest* friendsRequest = [FBRequest requestForMyFriends];
[friendsRequest startWithCompletionHandler: ^(FBRequestConnection *connection,
                                              NSDictionary* result,
                                              NSError *error) {
    NSArray* friends = [result objectForKey:@"data"];
    NSLog(@"Found: %i friends", friends.count);
    for (NSDictionary<FBGraphUser>* friend in friends) {
        NSLog(@"I have a friend named %@ with id %@", friend.name, friend.id);
    }
}];

Aber jetzt kann ich keine Freunde finden!

365
Kaslico

In Version 2.0 der Graph-API gibt der Aufruf von /me/friends die Freunde der Person zurück, die auch die App verwenden.

In Version 2.0 müssen Sie außerdem die Berechtigung user_friends von jedem Benutzer anfordern. user_friends ist nicht mehr standardmäßig in jedem Login enthalten. Jeder Benutzer muss die Berechtigung user_friends erteilen, um in der Antwort auf /me/friends angezeigt zu werden. Weitere Informationen finden Sie im Facebook-Upgrade-Handbuch oder in der nachstehenden Zusammenfassung.

Wenn Sie auf eine Liste von Freunden zugreifen möchten, die keine App verwenden, gibt es zwei Möglichkeiten:

  1. Wenn Sie möchten, dass Ihre Leute ihre Freunde in Geschichten markieren, die sie mit Ihrer App auf Facebook veröffentlichen, können Sie die API /me/taggable_friends verwenden. Die Verwendung dieses Endpunkts erfordert eine Überprüfung durch Facebook und sollte nur für den Fall verwendet werden, dass Sie eine Liste von Freunden rendern, damit der Benutzer sie in einem Beitrag markieren kann.

  2. Wenn Ihre App ein Spiel ist UND Ihr Spiel Facebook Canvas unterstützt, können Sie den Endpunkt /me/invitable_friends verwenden, um eine benutzerdefinierte Einladung zu rendern dialog , und übergeben Sie dann die von dieser API zurückgegebenen Token an den Standard-Anforderungsdialog.

In anderen Fällen können Apps nicht mehr die vollständige Liste der Freunde eines Benutzers abrufen (nur die Freunde, die Ihre App speziell mit der Berechtigung user_friends autorisiert haben). Dies wurde von Facebook als "von Design" bestätigt.

Für Apps, die es Nutzern ermöglichen sollen, Freunde zur Nutzung einer App einzuladen, können Sie weiterhin das Dialogfeld "Senden" im Web oder das neue Dialogfeld "Nachricht" unter iOS und Android verwenden.

UPDATE: Facebook hat hier ein FAQ zu diesen Änderungen veröffentlicht: https://developers.facebook.com/docs/apps/faq , in dem alle Optionen erläutert werden, die Entwicklern zur Verfügung stehen, um Freunde einzuladen usw.

625
Simon Cross

Obwohl die Antwort von Simon Cross akzeptiert und korrekt ist, dachte ich, ich würde sie ein wenig mit einem Beispiel (Android) aufpeppen, was getan werden muss. Ich werde es so allgemein wie möglich halten und mich nur auf die Frage konzentrieren. Persönlich habe ich Dinge in einer Datenbank gespeichert, damit das Laden reibungslos verlief, aber dazu sind ein CursorAdapter und ein ContentProvider erforderlich, die hier etwas außerhalb des Bereichs liegen.

Ich bin selbst hergekommen und habe dann gedacht, was jetzt ?!

The Issue

Genau wie bei user3594351 bemerkte ich, dass die Freundesdaten leer waren. Das habe ich mit dem FriendPickerFragment herausgefunden. Was vor drei Monaten funktionierte, funktioniert nicht mehr. Sogar Facebooks Beispiele sind gebrochen. Mein Problem war also: Wie erstelle ich FriendPickerFragment von Hand?

Was hat nicht funktioniert

Option 1 von Simon Cross war nicht stark genug, um Freunde zur App einzuladen. Simon Cross empfahl ebenfalls den Anforderungsdialog, der jedoch nur 5 Anforderungen gleichzeitig zuließ. Der Anforderungsdialog zeigte während einer angemeldeten Facebook-Sitzung dieselben Freunde an. Nicht nützlich.

Was hat funktioniert (Zusammenfassung)

Option 2 mit etwas harter Arbeit. Sie müssen sicherstellen, dass Sie die neuen Facebook-Regeln erfüllen: 1.) Sie sind ein Spiel 2.) Sie haben eine Canvas-App (Webpräsenz) 3.) Ihre App ist bei Facebook registriert. Alles erledigt auf der Facebook-Entwickler-Website unter Einstellungen.

Um die Freundesauswahl von Hand in meiner App zu emulieren, habe ich Folgendes getan:

  1. Erstellen Sie eine Registerkartenaktivität, die zwei Fragmente anzeigt. Jedes Fragment zeigt eine Liste. Ein Fragment für verfügbare Freunde (/ me/friends) und ein anderes für einladbare Freunde (/ me/invitable_friends). Verwenden Sie denselben Fragmentcode, um beide Registerkarten zu rendern.
  2. Erstellen Sie eine AsyncTask, die die Freundesdaten von Facebook abruft. Sobald diese Daten geladen sind, werfen Sie sie in den Adapter, der die Werte auf dem Bildschirm darstellt.

Details

Die AsynchTask

private class DownloadFacebookFriendsTask extends AsyncTask<FacebookFriend.Type, Boolean, Boolean> {
        private final String TAG = DownloadFacebookFriendsTask.class.getSimpleName();
        GraphObject graphObject;
        ArrayList<FacebookFriend> myList = new ArrayList<FacebookFriend>();

        @Override
        protected Boolean doInBackground(FacebookFriend.Type... pickType) {
            //
            //Determine Type
            //
            String facebookRequest;
            if (pickType[0] == FacebookFriend.Type.AVAILABLE) {
                facebookRequest = "/me/friends";
            } else {
                facebookRequest = "/me/invitable_friends";
            }

            //
            //Launch Facebook request and WAIT.
            //
            new Request(
                    Session.getActiveSession(),
                    facebookRequest,
                    null,
                    HttpMethod.GET,
                    new Request.Callback() {
                        public void onCompleted(Response response) {
                            FacebookRequestError error = response.getError();
                            if (error != null && response != null) {
                                Log.e(TAG, error.toString());
                            } else {
                                graphObject = response.getGraphObject();
                            }
                        }
                    }
            ).executeAndWait();

            //
            //Process Facebook response
            //
            //
            if (graphObject == null) {
                return false;
            }

            int numberOfRecords = 0;
            JSONArray dataArray = (JSONArray) graphObject.getProperty("data");
            if (dataArray.length() > 0) {

                // Ensure the user has at least one friend ...
                for (int i = 0; i < dataArray.length(); i++) {

                    JSONObject jsonObject = dataArray.optJSONObject(i);
                    FacebookFriend facebookFriend = new FacebookFriend(jsonObject, pickType[0]);

                    if (facebookFriend.isValid()) {
                        numberOfRecords++;

                        myList.add(facebookFriend);
                    }
                }
            }

            //make sure there are records to process
            if (numberOfRecords > 0){
                return true;
            } else {
                return false;
            }
        }

        @Override
        protected void onProgressUpdate(Boolean... booleans) {
            //no need to update this, wait until the whole thread finishes.
        }

        @Override
        protected void onPostExecute(Boolean result) {
            if (result) {
                /*
                User the array "myList" to create the adapter which will control showing items in the list.
                 */

            } else {
                Log.i(TAG, "Facebook Thread unable to Get/Parse friend data. Type = " + pickType);
            }
        }
    }

Die FacebookFriend-Klasse, die ich erstellt habe

public class FacebookFriend {
    String facebookId;
    String name;
    String pictureUrl;
    boolean invitable;
    boolean available;
    boolean isValid;
    public enum Type {AVAILABLE, INVITABLE};

    public FacebookFriend(JSONObject jsonObject, Type type) {
        //
        //Parse the Facebook Data from the JSON object.
        //
        try {
            if (type == Type.INVITABLE) {
                //parse /me/invitable_friend
                this.facebookId =  jsonObject.getString("id");
                this.name = jsonObject.getString("name");

                //Handle the picture data.
                JSONObject pictureJsonObject = jsonObject.getJSONObject("picture").getJSONObject("data");
                boolean isSilhouette = pictureJsonObject.getBoolean("is_silhouette");
                if (!isSilhouette) {
                    this.pictureUrl = pictureJsonObject.getString("url");

                } else {
                    this.pictureUrl = "";
                }

                this.invitable = true;
            } else {
                //parse /me/friends
                this.facebookId =  jsonObject.getString("id");
                this.name = jsonObject.getString("name");
                this.available = true;
                this.pictureUrl = "";
            }

            isValid = true;
        } catch (JSONException e) {
            Log.w("#", "Warnings - unable to process FB JSON: " + e.getLocalizedMessage());
        }
    }
}
17
LEO

Facebook hat seine Richtlinien jetzt überarbeitet. Du kannst sowieso nicht die ganze Freundesliste bekommen, wenn deine App keine Canvas-Implementierung hat und deine App kein Spiel ist. Natürlich gibt es auch taggable_friends, aber das ist nur zum Markieren gedacht.

Sie können die Liste der Freunde abrufen, die nur die App autorisiert haben.

Die Apps, die Graph API 1.0 verwenden, funktionieren bis zum 30. April 2015 und werden danach nicht mehr unterstützt.

Weitere Informationen hierzu finden Sie unter dem folgenden Link

https://developers.facebook.com/docs/graph-api/reference/v2.2/user/friends

https://developers.facebook.com/docs/apps/faq#invite_to_app

Hoffe das hilft

12
Jobins John

Wie Simon sagte, ist dies in der neuen Facebook-API nicht möglich. Technisch gesehen können Sie dies über eine Browser-Automatisierung tun.

  • dies verstößt gegen die Facebook-Richtlinien. Je nach Land, in dem Sie leben, ist dies möglicherweise nicht legal
  • sie müssen Ihre Anmeldeinformationen verwenden/Benutzer nach Anmeldeinformationen fragen und diese möglicherweise speichern (das Speichern von Passwörtern, die auch symmetrisch verschlüsselt sind, ist keine gute Idee).
  • wenn Facebook seine API ändert, musst du auch den Code für die Browser-Automatisierung aktualisieren. (Wenn du keine Updates für deine Anwendung erzwingen kannst, solltest du das Stück für die Browser-Automatisierung als Webservice ausgeben.)
  • dies umgeht das Konzept OAuth
  • andererseits habe ich das Gefühl, dass ich meine Daten, einschließlich der Liste meiner Freunde und der FB, besitze und nicht daran gehindert werden sollte, über die API auf diese zuzugreifen

Beispielimplementierung mit WatiN

class FacebookUser
{
  public string Name { get; set; }
  public long Id { get; set; }
}

public IList<FacebookUser> GetFacebookFriends(string email, string password, int? maxTimeoutInMilliseconds)
{
  var users = new List<FacebookUser>();
  Settings.Instance.MakeNewIeInstanceVisible = false;
  using (var browser = new IE("https://www.facebook.com"))
  {
    try
    {
      browser.TextField(Find.ByName("email")).Value = email;
      browser.TextField(Find.ByName("pass")).Value = password;
      browser.Form(Find.ById("login_form")).Submit();
      browser.WaitForComplete();
    }
    catch (ElementNotFoundException)
    {
      // we're already logged in
    }
    browser.GoTo("https://www.facebook.com/friends");
    var watch = new Stopwatch();
    watch.Start();

    Link previousLastLink = null;
    while (maxTimeoutInMilliseconds.HasValue && watch.Elapsed.TotalMilliseconds < maxTimeoutInMilliseconds.Value)
    {
      var lastLink = browser.Links.Where(l => l.GetAttributeValue("data-hovercard") != null
&& l.GetAttributeValue("data-hovercard").Contains("user.php")
&& l.Text != null
).LastOrDefault();
      if (lastLink == null || previousLastLink == lastLink)
      {
        break;
      }

      var ieElement = lastLink.NativeElement as IEElement;
      if (ieElement != null)
      {
        var htmlElement = ieElement.AsHtmlElement;
        htmlElement.scrollIntoView();
        browser.WaitForComplete();
      }

      previousLastLink = lastLink;
    }

    var links = browser.Links.Where(l => l.GetAttributeValue("data-hovercard") != null
      && l.GetAttributeValue("data-hovercard").Contains("user.php")
      && l.Text != null
    ).ToList();

    var idRegex = new Regex("id=(?<id>([0-9]+))");
    foreach (var link in links)
    {
      string hovercard = link.GetAttributeValue("data-hovercard");
      var match = idRegex.Match(hovercard);
      long id = 0;
      if (match.Success)
      {
        id = long.Parse(match.Groups["id"].Value);
      }
      users.Add(new FacebookUser
      {
        Name = link.Text,
        Id = id
      });
    }
  }
  return users;
}

Prototyp mit Implementierung dieses Ansatzes (unter Verwendung von C #/Watin) siehe https://github.com/svejdo1/ShadowApi Ermöglicht auch die dynamische Aktualisierung des Facebook-Connectors, der die Liste Ihrer Kontakte abruft.

2
Ondrej Svejdar

In Swift 4.2 und Xcode 10.1

Wenn Sie eine Freundesliste von FB erhalten möchten, müssen Sie Ihre App zur Überprüfung in FB einreichen. Sehen Sie sich einige der Anmeldeberechtigungen an.

https://developers.facebook.com/docs/apps/review/login-permissions

Hier zwei Schritte

1) Zuerst muss Ihr App-Status in Live sein

2) Holen Sie sich die erforderlichen Berechtigungen von FB.

1) Aktiviere unseren App Status live:

  1. Gehen Sie zur Seite Apps und wählen Sie Ihre App aus

https://developers.facebook.com/apps/

  1. Wählen Sie den Status oben rechts im Dashboard .

enter image description here

  1. Absenden der Datenschutzrichtlinie url

enter image description here

  1. Kategorie auswählen

enter image description here

  1. Jetzt befindet sich unsere App im Live-Status.

enter image description here

Auf Schritt abgeschlossen.

2) Senden Sie unsere App zur Überprüfung:

  1. Senden Sie zuerst die erforderlichen Anfragen.

Bsp .: user_friends, user_videos, user_posts etc.

enter image description here

  1. Wechseln Sie anschließend zur Seite Aktuelle Anforderung

enter image description here

Beispiel: user_events

  1. Senden Sie alle Details

enter image description here

  1. Übermitteln Sie auf diese Weise alle Anfragen (user_friends, user_events, user_videos, user_posts usw.).

  2. Schließlich senden Sie Ihre App zur Überprüfung.

Wenn Ihre Bewertung von FB akzeptiert wurde, sind Sie jetzt berechtigt, Kontakte usw. zu lesen.

2
iOS

Versuchen Sie/me/taggable_friends? Limit = 5000 mit Ihrem Javascript-Code

OR

probieren Sie die Graph-API aus

https://graph.facebook.com/v2.3/user_id_here/taggable_friends?access_token=

Habe Spaß

2
Abhishek Sharma