2012-05-25 3 views
3

Как определить аватар по умолчанию, как это: https://graph.facebook.com/'.$id.'/picture?type=large? Это единственный способ получить аватары (мужские/женские) из специальных подготовленных профилей, а затем сравнить их, например. md5()?Как определить аватар по умолчанию на facebook?

Трудно поверить, что это единственный способ.

+1

Там же изображение профиля пользователя, который вы уже знаете url для, что именно вам нужно, кроме этого? –

ответ

5

Существует нет API, с помощью которого вы можете позвонить, если они используют фотографию по умолчанию или нет. Вместо загрузки всего изображения и проверки MD5, вы можете оформить запрос HTTP HEAD, для этого профиля URL и посмотрите на заголовок Location и посмотреть, если URL является одним из известных изображений профилей по умолчанию:

Мужчина: https://fbcdn-profile-a.akamaihd.net/static-ak/rsrc.php/v2/yL/r/HsTZSDw4avx.gif https://fbcdn-profile-a.akamaihd.net/static-ak/rsrc.php/v2/yL/r/HsTZSDw4avx.gif

Женский (Darth Vader): https://fbcdn-profile-a.akamaihd.net/static-ak/rsrc.php/v2/yp/r/yDnr5YfbJCH.gif

enter image description here

Эти URL может измениться, я полагаю, и так мог фотографии по умолчанию, но я не видел ни случай случиться так, что I C помните.

+6

Я поддержал эту цитату комментария Дарта Вейдера. Отлично сработано! – threejeez

+3

просто использовать is_silhouette – Fattie

+0

darth vader комментарий камень! – Prozi

20

Вы можете использовать redirect=false параметр:

https://graph.facebook.com/naitik/picture?redirect=false

Тогда Быстродействие Facebook является json и содержит такие данные:

{ 
    "data": { 
     "url": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-prn1/157337_5526183_369516251_q.jpg", 
     "is_silhouette": false 
    } 
} 

Вы можете использовать опцию is_silhouette, чтобы обнаружить, если фото по умолчанию один.

Вы можете прочитать по адресу: https://developers.facebook.com/docs/reference/api/using-pictures/

0

Если вы уже делаете вызов к API Graph, чтобы получить данные пользователя, как аватар, просто включить picture в fields пар, когда вы сделаете свой первый вызов Graph API , тогда ответ будет включать смещение is_silhouette, если оно установлено в true, пользователь имеет аватар по умолчанию.

Запрос:

https://graph.facebook.com/v2.7/me?access_token=[token]&fields=name,picture 

Ответ:

{ 
    "id": "100103095474350", 
    "name": "John Smith", 
    "picture": { 
     "data": { 
      "is_silhouette": true, 
      "url": "https://scontent.xx.fbcdn.net/v/...jpg" 
     } 
    } 
} 
0

Использование Facebook SDK для прошивки (Swift 4):

class FacebookSignIn { 

    enum Error: Swift.Error { 
     case unableToInitializeGraphRequest 
     case unexpectedGraphResponse 
    } 

    func profileImageURL(size: CGSize, completion: @escaping Result<URL?>.Completion) { 
     guard let userID = FBSDKAccessToken.current()?.userID else { 
      completion(.failure(Error.unableToInitializeGraphRequest)) 
      return 
     } 
     let params: [String: Any] = ["redirect": 0, 
            "type": size.width == size.height ? "square" : "normal", 
            "height": Int(size.height), 
            "width": Int(size.width), 
            "fields": "is_silhouette, url"] 

     guard let request = FBSDKGraphRequest(graphPath: "/\(userID)/picture", parameters: params) else { 
      completion(.failure(Error.unableToInitializeGraphRequest)) 
      return 
     } 

     _ = request.start { _, result, error in 
      if let e = error { 
      completion(.failure(e)) 
      } else if let result = result as? [String: Any], let data = result["data"] as? [String: Any] { 
      if let isSilhouette = data["is_silhouette"] as? Bool, let urlString = data["url"] as? String { 
       if isSilhouette { 
        completion(.success(nil)) 
       } else { 
        if let url = URL(string: urlString) { 
         completion(.success(url)) 
        } else { 
         completion(.failure(Error.unexpectedGraphResponse)) 
        } 
       } 
      } else { 
       completion(.failure(Error.unexpectedGraphResponse)) 
      } 
      } else { 
      completion(.failure(Error.unexpectedGraphResponse)) 
      } 
     } 
    } 
} 


public enum Result<T> { 

    case success(T) 
    case failure(Swift.Error) 

    public typealias Completion = (Result<T>) -> Void 
}