it-swarm-id.com

API Grafik Facebook v2.0 + - / me / friends menghasilkan kosong, atau hanya teman yang juga menggunakan aplikasi saya

Saya mencoba mendapatkan nama dan id teman saya dengan Graph API v2.0, tetapi data kembali kosong:

{
  "data": [
  ]
}

Ketika saya menggunakan v1.0, semuanya baik-baik saja dengan permintaan berikut:

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

Tapi sekarang saya tidak bisa mendapatkan teman!

364
KasliCo

Di v2.0 dari Graph API, memanggil /me/friends mengembalikan teman orang yang juga menggunakan aplikasi.

Selain itu, dalam v2.0, Anda harus meminta izin user_friends dari setiap pengguna. user_friends tidak lagi disertakan secara default di setiap login. Setiap pengguna harus memberikan izin user_friends agar muncul dalam respons terhadap /me/friends. Lihat panduan peningkatan Facebook untuk informasi lebih rinci, atau tinjau ringkasan di bawah ini.

Jika Anda ingin mengakses daftar teman yang tidak menggunakan aplikasi, ada dua opsi:

  1. Jika Anda ingin orang Anda memberi tag teman mereka dalam cerita yang mereka terbitkan ke Facebook menggunakan Aplikasi Anda, Anda dapat menggunakan /me/taggable_friends API. Penggunaan titik akhir ini membutuhkan ulasan oleh Facebook dan hanya boleh digunakan untuk kasus di mana Anda merender daftar teman untuk membiarkan pengguna memberi tag mereka pada sebuah posting.

  2. Jika Aplikasi Anda adalah Game DAN Game Anda mendukung Facebook Canvas, Anda dapat menggunakan titik akhir /me/invitable_friends untuk membuat - dialog undangan khusus , lalu berikan token yang dikembalikan oleh API ini ke Dialog Permintaan standar.

Dalam kasus lain, aplikasi tidak lagi dapat mengambil daftar lengkap teman-teman pengguna (hanya teman-teman yang secara khusus mengizinkan aplikasi Anda menggunakan izin user_friends). Ini telah dikonfirmasi oleh Facebook sebagai 'oleh desain'.

Untuk aplikasi yang ingin memungkinkan orang mengundang teman untuk menggunakan aplikasi, Anda masih dapat menggunakan Kirim Dialog di Web atau yang baru Dialog Pesan di iOS dan Android .

UPDATE: Facebook telah menerbitkan FAQ tentang perubahan ini di sini: https://developers.facebook.com/docs/apps/faq yang menjelaskan semua opsi yang tersedia untuk pengembang agar untuk mengundang teman dll.

623
Simon Cross

Meskipun jawaban Simon Cross diterima dan benar, saya pikir saya akan menambahkan sedikit dengan contoh (Android) tentang apa yang perlu dilakukan. Saya akan menjaganya sedapat mungkin dan fokus hanya pada pertanyaan. Secara pribadi saya akhirnya menyimpan hal-hal dalam database sehingga pemuatannya lancar tapi itu membutuhkan CursorAdapter dan ContentProvider yang sedikit keluar dari ruang lingkup di sini.

Saya datang ke sini sendiri dan kemudian berpikir, sekarang apa ?!

Masalah

Sama seperti user3594351 , saya memperhatikan bahwa data teman itu kosong. Saya menemukan ini dengan menggunakan FriendPickerFragment. Apa yang berhasil tiga bulan lalu, tidak lagi berhasil. Bahkan contoh-contoh facebook rusak. Jadi masalah saya adalah 'Bagaimana Saya membuat FriendPickerFragment dengan tangan?

Apa Tidak Berhasil

Opsi # 1 dari Simon Cross tidak cukup kuat untuk mengundang teman ke aplikasi. Simon Cross juga merekomendasikan Dialog Permintaan tetapi itu hanya akan memungkinkan 5 permintaan sekaligus. Dialog permintaan juga menunjukkan teman yang sama selama sesi login Facebook yang diberikan. Tidak berguna.

Apa yang Berhasil (Ringkasan)

Opsi # 2 dengan kerja keras. Anda harus memastikan bahwa Anda memenuhi aturan baru Facebook: 1.) Anda adalah game 2.) Anda memiliki aplikasi Canvas (Web Presence) 3.) Aplikasi Anda terdaftar di Facebook. Semua dilakukan di situs web pengembang Facebook di bawah pengaturan.

Untuk meniru pemetik teman dengan tangan di dalam aplikasi saya, saya melakukan hal berikut:

  1. Buat aktivitas tab yang menampilkan dua fragmen. Setiap fragmen menunjukkan daftar. Satu fragmen untuk teman yang tersedia (/ saya/teman) dan lainnya untuk teman yang invitable (/ me/invitable_friends). Gunakan kode fragmen yang sama untuk merender kedua tab.
  2. Buat AsyncTask yang akan mendapatkan data teman dari Facebook. Setelah data dimuat, lemparkan ke adaptor yang akan memberikan nilai ke layar.

Detail

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

Kelas FacebookFriend yang saya buat

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 telah merevisi kebijakan mereka sekarang. Anda tidak bisa mendapatkan seluruh daftar teman jika Aplikasi Anda tidak memiliki implementasi Canvas dan jika Aplikasi Anda bukan game. Tentu saja ada juga taggable_friends, tetapi itu hanya untuk pemberian tag.

Anda dapat menarik daftar teman yang telah mengotorisasi aplikasi saja.

Aplikasi yang menggunakan Graph API 1.0 akan bekerja hingga 30 April 2015 dan setelah itu akan dihentikan.

Lihat tautan di bawah untuk mendapatkan detail lebih lanjut tentang ini

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

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

Semoga ini membantu

12
Jobins John

Seperti yang Simon katakan, ini tidak mungkin di API facebook baru. Murni secara teknis Anda dapat melakukannya melalui otomatisasi browser.

  • ini melanggar kebijakan Facebook, jadi tergantung pada negara tempat Anda tinggal, ini mungkin tidak sah
  • anda harus menggunakan kredensial Anda/meminta kredensial pengguna dan mungkin menyimpannya (menyimpan kata sandi yang bahkan dienkripsi secara simetris bukanlah ide yang baik)
  • ketika facebook mengubah api mereka, Anda juga harus memperbarui kode otomatisasi browser (jika Anda tidak dapat memaksa pembaruan aplikasi Anda, Anda harus mengesampingkan otomatisasi browser sebagai layanan web)
  • ini melewati konsep OAuth
  • di sisi lain perasaan saya adalah bahwa saya memiliki data saya termasuk daftar teman-teman saya dan FB seharusnya tidak membatasi saya mengaksesnya melalui API

Implementasi sampel menggunakan 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;
}

Prototipe dengan penerapan pendekatan ini (menggunakan C #/Watin) lihat https://github.com/svejdo1/ShadowApi Hal ini juga memungkinkan pembaruan dinamis dari konektor facebook yang mengambil daftar kontak Anda.

2
Ondrej Svejdar

Di Swift 4.2 dan Xcode 10.1

Jika Anda ingin mendapatkan daftar teman dari FB, Anda harus mengirimkan aplikasi Anda untuk ditinjau di FB. Lihat beberapa Izin Masuk.

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

Ini dua langkah

1) Pertama-tama status aplikasi Anda harus dalam Live

2) Dapatkan izin yang diperlukan dari FB.

1) Aktifkan status aplikasi kami secara langsung:

  1. Buka halaman aplikasi dan pilih aplikasi Anda

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

  1. Pilih status di kanan atas dalam Dasbor .

enter image description here

  1. Kirim url kebijakan privasi

enter image description here

  1. Pilih kategori

enter image description here

  1. Sekarang aplikasi kita dalam status live .

enter image description here

Pada langkah selesai.

2) Kirim aplikasi kami untuk ditinjau:

  1. Pertama kirim permintaan yang diminta.

Mis: user_friends, user_videos, user_posts dll.

enter image description here

  1. Pergi ke halaman Permintaan Saat Ini

enter image description here

Contoh: user_events

  1. Kirim semua detail

enter image description here

  1. Seperti kiriman ini untuk semua permintaan (user_friends, user_events, user_videos, user_posts dll).

  2. Akhirnya kirimkan aplikasi Anda untuk ditinjau.

Jika ulasan Anda menerima formulir FB, sekarang Anda berhak untuk membaca kontak, dll.

2
iOS

Coba/saya/taggable_friends? Limit = 5000 menggunakan kode javascript Anda

OR

coba grafik API

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

Selamat bersenang-senang

2
Abhishek Sharma