it-swarm-tr.com

Facebook Graph API v2.0 + -/me/friends boş veya yalnızca uygulamamı kullanan arkadaşlar

Arkadaşımın adını ve kimliklerini Graph API v2.0 ile almaya çalışıyorum, ancak veriler boş dönüyor:

{
  "data": [
  ]
}

V1.0 kullanırken, aşağıdaki istekle her şey yolundaydı:

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

Ama şimdi arkadaş bulamıyorum!

363
KasliCo

Graph API'sinin v2.0 sürümünde, /me/friends öğesini çağırmak, aynı zamanda uygulamayı kullanan kişinin arkadaşlarını da verir.

Ek olarak, v2.0'da her kullanıcıdan user_friends iznini istemeniz gerekir. user_friends artık her oturum açmada varsayılan olarak bulunmuyor. Her kullanıcının user_friends yanıtında görünmesi için /me/friends iznini vermesi gerekir. Bkz. (Facebook yükseltme kılavuzu daha ayrıntılı bilgi için veya aşağıdaki özeti inceleyin.

Uygulama kullanmayan arkadaşların listesine erişmek istiyorsanız, iki seçenek vardır:

  1. Çalışanlarınızın arkadaşlarınızı etiketlemesine izin vermek istiyorsanız, Uygulamanızı kullanarak Facebook'ta yayınladıkları öykülerde, /me/taggable_friends API'sini kullanabilirsiniz. Bu bitiş noktasının kullanımı Facebook tarafından incelenmeyi gerektirir ve kullanıcının bir yayında etiketlemesine izin vermek için yalnızca bir arkadaş listesi oluşturduğunuz durumda kullanılmalıdır.

  2. Uygulamanız bir Oyunsa ve Oyununuz Facebook Canvas'ı destekliyorsa, özel bir davet iletişim kutusu oluşturmak için /me/invitable_friends uç noktasını kullanabilirsiniz - ve bu API tarafından döndürülen belirteçleri standart İstekler İletişim Kutusu

Diğer durumlarda, uygulamalar artık bir kullanıcının arkadaşlarının tam listesini elde edemezler (yalnızca user_friends iznini kullanarak uygulamanızı özel olarak yetkilendiren arkadaşlar). Bu, Facebook tarafından 'tasarım tarafından' olarak onaylanmıştır.

Kullanıcıların bir uygulamayı kullanmaya davet etmesine izin veren uygulamalar için, Web'de İletişim Kutusu Gönder veya yeni iOS'ta Mesaj İletişim Kutusu ve Android seçeneklerini kullanabilirsiniz.

GÜNCELLEME: Facebook burada bu değişikliklerle ilgili bir FAQ yayınladı: https://developers.facebook.com/docs/apps/faq geliştiricilere arkadaşları davet etmek için mevcut tüm seçenekleri açıklayan vb.

622
Simon Cross

Her ne kadar Simon Cross'un cevabı kabul edilmiş ve doğru olsa da, yapılması gerekenleri bir örnekle (Android) biraz daha kızdıracağımı düşündüm. Olabildiğince genel tutacağım ve sadece soruya odaklanacağım. Şahsen ben bir şeyleri bir veritabanında depolayarak yaralandım, bu yüzden yükleme düzgündü ancak bu biraz kapsam dışı olan bir CursorAdapter ve ContentProvider gerektiriyor.

Buraya kendim geldim ve düşündüm, şimdi ne ?!

Sorun

Tıpkı user3594351 gibi, arkadaş verilerinin boş olduğunu fark ettim. FriendPickerFragment kullanarak bunu öğrendim. Üç ay önce işe yarayanlar, artık işe yaramazlar. Facebook bile örnekleri kırdı. Yani benim sorunum 'Elle FriendPickerFragment'i nasıl oluşturabilirim?

Ne işe yaramadı

Seçenek # 1 Simon Cross arkadaşlarınızı uygulamaya davet edecek kadar güçlü değildi. Simon Cross ayrıca İstekler İletişim Kutusu'nu da önerdi, ancak bu bir seferde yalnızca 5 isteğe izin verecek. İstekler iletişim kutusu, oturum açmış herhangi bir Facebook'ta aynı arkadaşları gösterdi. Yararlı değil.

Ne Çalıştı (Özet)

Bazı sıkı çalışma ile Seçenek # 2. Facebook'un yeni kurallarını yerine getirdiğinizden emin olmalısınız: 1.) Siz bir oyundur 2.) Bir Canvas uygulamanız var (Web Varlığı) 3.) Uygulamanız Facebook'a kayıtlı. Tüm ayarlar Facebook geliştirici web sitesinde yapıldı.

Arkadaşım seçiciyi uygulamamın içinde el ile taklit etmek için şunları yaptım:

  1. İki parçayı gösteren bir sekme etkinliği oluşturun. Her parça bir liste gösterir. Mevcut arkadaş (/ me/arkadaş) ve bir tanesi davetli arkadaş (/ me/invitable_friends) için bir parça. Her iki sekmeyi de oluşturmak için aynı parça kodunu kullanın.
  2. Arkadaş verilerini Facebook'tan alacak bir AsyncTask oluşturun. Bu veri yüklendikten sonra, değerleri ekranda gösterecek olan adaptöre atın.

Ayrıntılar

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

Oluşturduğum FacebookFriend sınıfı

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 politikalarını şimdi revize etti. Uygulamanızın bir Tuval uygulaması yoksa ve Uygulamanız bir oyun değilse, arkadaş listesinin tamamını alamazsınız. Tabii ki etiketlenebilir arkadaşlar da var, ama bu sadece etiketlemek için.

Yalnızca uygulamayı yetkilendirmiş olan arkadaşların listesini çıkarabileceksiniz.

Graph API 1.0 kullanan uygulamalar 30 Nisan 2015'e kadar çalışacak ve bundan sonra kullanımdan kaldırılacaktır.

Bu konuda daha fazla bilgi almak için aşağıdaki bağlantıya bakın.

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

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

Bu yardımcı olur umarım

12
Jobins John

Simon'un söylediği gibi, bu yeni facebook API'sinde mümkün değildir. Teknik olarak saf konuşma tarayıcı otomasyonu üzerinden yapabilirsiniz.

  • bu Facebook politikasına aykırı olduğundan, yaşadığınız ülkeye bağlı olarak bu yasal olmayabilir
  • kimlik bilgilerinizi kullanmanız/kullanıcıdan kimlik bilgileri istemeniz ve bunları saklamanız gerekir (simetrik olarak şifrelenmiş şifreleri saklamak iyi bir fikir değildir)
  • facebook kendi api'sini değiştirdiğinde, tarayıcı otomasyon kodunu da güncellemeniz gerekir (uygulamanızın güncellemelerini zorlayamazsanız, tarayıcı otomasyonu parçasını web servisi olarak kullanmalısınız)
  • bu OAuth kavramını atlıyor
  • Öte yandan, arkadaşlarımın listesi de dahil olmak üzere verilerime sahip olduğum ve FB’nin API üzerinden erişmemi engellememesi gerektiği yönünde hissediyorum.

WatiN kullanarak örnek uygulama

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

Bu yaklaşımın uygulanması ile prototip (C #/Watin kullanarak) bakınız https://github.com/svejdo1/ShadowApi Ayrıca, kişilerinizin listesini alan facebook konektörünün dinamik olarak güncellenmesine de izin veriyor.

2
Ondrej Svejdar

Swift 4.2 ve Xcode 10.1’de

FB'den arkadaş listesi almak istiyorsanız, başvurunuzu FB'de incelenmek üzere göndermeniz gerekir. Giriş İzinlerinin bazılarına bakın.

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

İşte iki adım

1) İlk önce uygulamanızın durumu Live'da olmalıdır

2) Alın gerekli izinler form FB.

1) Uygulama durumumuzu canlı olarak etkinleştirin:

  1. Git uygulamalar sayfası ve uygulamanızı seçin

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

  1. Dashboard 'de sağ üstteki durumu seçin.

 enter image description here

  1. Gönder gizlilik politikası url

 enter image description here

  1. Seçin kategori

 enter image description here

  1. Şimdi bizim app canlı durumu.

 enter image description here

Adımda tamamlandı.

2) İnceleme için uygulamamızı gönderin:

  1. İlk önce gerekli istekleri gönderin.

Ör .: user_friends, user_videos, user_posts vb.

 enter image description here

  1. İkincisi Mevcut İstek sayfasına git

 enter image description here

Örn: user_events

  1. Tüm detayları gönder

 enter image description here

  1. Tüm istekler için bu gönderme gibi (user_friends, user_events, user_videos, user_posts vb.).

  2. Sonunda başvurunuzu incelenmek üzere gönderin.

İncelemeniz FB formunu kabul ettiğinde, şimdi siz ve kişileri vb. Okumak için hakkınız vardır.

2
iOS

Javascript kodunuzu kullanarak/me/taggable_friends? Limit = 5000'i deneyin

OR

grafik API’sini deneyin

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

İyi eğlenceler

2
Abhishek Sharma