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!
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:
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.
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.
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:
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());
}
}
}
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
Wie Simon sagte, ist dies in der neuen Facebook-API nicht möglich. Technisch gesehen können Sie dies über eine Browser-Automatisierung tun.
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.
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.
https://developers.facebook.com/apps/
Auf Schritt abgeschlossen.
Bsp .: user_friends, user_videos, user_posts etc.
Beispiel: user_events
Übermitteln Sie auf diese Weise alle Anfragen (user_friends, user_events, user_videos, user_posts usw.).
Schließlich senden Sie Ihre App zur Überprüfung.
Wenn Ihre Bewertung von FB akzeptiert wurde, sind Sie jetzt berechtigt, Kontakte usw. zu lesen.
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ß