kutombawewe.net

Facebook Graph API v2.0 + -/me/friends restituisce vuoto, o solo amici che prevedono anche la mia applicazione

Sto cercando di ottenere il nome e gli id ​​del mio amico con Graph API v2.0, ma i dati restituiti sono vuoti:

{
  "data": [
  ]
}

Quando stavo usando v1.0, tutto andava bene con la seguente richiesta:

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);
    }
}];

Ma ora non riesco ad avere amici!

363
KasliCo

Nella v2.0 dell'API Graph, chiamando /me/friends restituisce gli amici della persona che usano anche l'app.

Inoltre, nella versione 2.0, è necessario richiedere l'autorizzazione user_friends da ciascun utente. user_friends non è più incluso di default in ogni accesso. Ogni utente deve concedere l'autorizzazione user_friends per apparire nella risposta a /me/friends. Vedere la guida all'aggiornamento di Facebook per informazioni più dettagliate, o rivedere il riassunto di seguito.

Se desideri accedere a un elenco di amici che non utilizzano app, ci sono due opzioni:

  1. Se vuoi permettere ai tuoi amici di taggare i propri amicinelle storie che pubblicano su Facebook usando la tua app, puoi usare l'API /me/taggable_friends. L'uso di questo endpoint richiede la revisione da parte di Facebook e deve essere utilizzato solo nel caso in cui si sta visualizzando un elenco di amici per consentire all'utente di taggarlo in un post.

  2. Se la tua app è un gioco E il tuo gioco supporta Facebook Canvas, puoi usare l'endpoint /me/invitable_friends per rendere una finestra di dialogo di invito personalizzata , quindi passare i token restituiti da questa API a la finestra di dialogo Richieste standard.

In altri casi, le app non sono più in grado di recuperare l'elenco completo degli amici di un utente (solo quegli amici che hanno autorizzato in modo specifico la tua app utilizzando l'autorizzazione user_friends). Ciò è stato confermato da Facebook come "design".

Per le app che desiderano consentire alle persone di invitare gli amici a utilizzare un'app, puoi comunque utilizzare la finestra di dialogo Send su Web o la nuova Finestra di dialogo dei messaggi su iOS e Android .

AGGIORNAMENTO: Facebook ha pubblicato un FAQ su queste modifiche qui: https://developers.facebook.com/docs/apps/faq che spiega tutte le opzioni disponibili agli sviluppatori per invitare gli amici eccetera.

622
Simon Cross

Sebbene Simon Cross's answer sia accettato e corretto, ho pensato di rinforzarlo un po 'con un esempio (Android) di ciò che deve essere fatto. Lo terrò il più generale possibile e mi concentrerò solo sulla domanda. Personalmente ho finito per archiviare le cose in un database, quindi il caricamento era fluido ma ciò richiede un CursorAdapter e ContentProvider che è un po 'fuori portata qui.

Sono venuto qui io stesso e poi ho pensato, e adesso ?!

Il problema

Proprio come user3594351 , stavo notando che i dati degli amici erano vuoti. L'ho scoperto usando FriendPickerFragment. Ciò che ha funzionato tre mesi fa, non funziona più. Anche gli esempi di facebook si sono interrotti. Quindi il mio problema era "Come posso creare FriendPickerFragment a mano?

Cosa non ha funzionato

Opzione 1 da Simon Cross non era abbastanza forte da invitare gli amici all'app. Simon Cross ha anche raccomandato la finestra di dialogo Richieste, ma ciò consentirebbe solo 5 richieste alla volta. La finestra di dialogo Richieste ha mostrato gli stessi amici durante ogni sessione di accesso a Facebook. Inutile.

Cosa funzionava (riepilogo)

Opzione n. 2 con un po 'di fatica. Devi assicurarti di rispettare le nuove regole di Facebook: 1.) Sei un gioco 2.) Hai un'app Canvas (Web Presence) 3.) La tua app è registrata su Facebook. Tutto fatto sul sito web degli sviluppatori di Facebook sotto le impostazioni.

Per emulare il raccoglitore di amici a mano all'interno della mia app ho fatto quanto segue:

  1. Crea un'attività tab che mostra due frammenti. Ogni frammento mostra una lista. Un frammento per amico disponibile (/ io/amici) e un altro per amici invivili (/ me/amici invitable). Utilizzare lo stesso codice di frammento per eseguire il rendering di entrambe le schede.
  2. Crea un AsyncTask che otterrà i dati degli amici da Facebook. Una volta caricati i dati, passarli all'adattatore che renderà i valori sullo schermo.

Dettagli

Il 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);
            }
        }
    }

La classe FacebookFriend che ho creato

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 ha rivisto le loro politiche ora. Non puoi comunque ottenere l'intera lista dei tuoi amici se la tua app non ha un'implementazione su tela e se la tua app non è un gioco. Ovviamente ci sono anche taggable_friends, ma quello è solo per il tagging.

Sarai in grado di estrarre la lista di amici che hanno autorizzato solo l'app.

Le app che utilizzano Graph API 1.0 funzioneranno fino al 30 aprile 2015 e dopo saranno deprecate.

Vedi il collegamento qui sotto per ottenere maggiori dettagli su questo

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

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

Spero che questo ti aiuti

12
Jobins John

Come ha detto Simon, questo non è possibile nella nuova API di Facebook. Pure tecnicamente parlando puoi farlo tramite l'automazione del browser.

  • questo è contro la politica di Facebook, quindi a seconda del Paese in cui vivi potrebbe non essere legale
  • dovrai usare le tue credenziali/chiedere all'utente le credenziali e possibilmente memorizzarle (memorizzare password anche simmetricamente criptate non è una buona idea)
  • quando Facebook cambia la propria API, dovrai aggiornare anche il codice di automazione del browser (se non puoi forzare gli aggiornamenti della tua applicazione, dovresti mettere l'automazione del browser in evidenza come webservice)
  • questo sta bypassando il concetto di OAuth
  • d'altra parte la mia sensazione è che io possieda i miei dati incluso l'elenco dei miei amici e FB non dovrebbe impedirmi di accedere a quelli tramite API

Esempio di implementazione usando 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;
}

Prototipo con l'implementazione di questo approccio (usando C #/Watin) vedi https://github.com/svejdo1/ShadowApi Consente inoltre l'aggiornamento dinamico del connettore di Facebook che sta recuperando l'elenco dei tuoi contatti.

2
Ondrej Svejdar

In Swift 4.2 e Xcode 10.1

Se si desidera ottenere l'elenco di amici da FB, è necessario inviare la propria app per la revisione in FB. Vedi alcune delle autorizzazioni di accesso.

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

Ecco due passaggi

1) Prima il tuo stato dell'app deve essere in Live

2) Ottieni autorizzazioni richieste form FB.

1) Abilita il live status della nostra app:

  1. Vai pagina app e seleziona la tua app

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

  1. Seleziona lo stato in alto a destra in Dashboard .

 enter image description here

  1. Invia url informativa sulla privacy

 enter image description here

  1. Seleziona categoria

 enter image description here

  1. Ora la nostra app è in stato live.

 enter image description here

Al passo completato.

2) Invia la nostra app per la revisione:

  1. In primo luogo inviare richieste richieste.

Es .: user_friends, user_videos, user_posts ecc.

 enter image description here

  1. Secondo andare alla pagina Richiesta corrente

 enter image description here

Es .: user_events

  1. Invia tutti i dettagli

 enter image description here

  1. Come questo inviare per tutte le richieste (user_friends, user_events, user_videos, user_posts ecc.).

  2. Infine invia la tua app per la revisione.

Se la tua opinione è stata accettata da FB, ora sei idoneo a leggere i contatti e così via.

2
iOS

Prova/me/taggable_friends? Limit = 5000 utilizzando il tuo codice javascript

OR

prova l'API del grafico

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

Divertiti

2
Abhishek Sharma