How to detect default avatar on facebook?

前端 未结 4 784
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-14 07:17

How to detect default avatar on the link like this: https://graph.facebook.com/\'.$id.\'/picture?type=large? Is it the only way to get avatars (male/female) fr

相关标签:
4条回答
  • 2021-01-14 07:53

    If you are already making a call to the Graph API to get user data like the avatar, just include picture in the fields param when you make your first call to Graph API, then the response will include the is_silhouette offset, if it's set to true the user has the default avatar.

    Request:

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

    Response:

    {
        "id": "100103095474350",
        "name": "John Smith",
        "picture": {
            "data": {
                "is_silhouette": true,
                "url": "https://scontent.xx.fbcdn.net/v/...jpg"
            }
        }
    }
    
    0 讨论(0)
  • 2021-01-14 07:54

    There isn't an API you can call to tell if they are using the default photo or not. Instead of downloading the whole image and checking the MD5, you could issue an HTTP HEAD request to that profile URL and look at the Location header and see if the URL is one of the known default profile images:

    Male: 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

    Female (Darth Vader):https://fbcdn-profile-a.akamaihd.net/static-ak/rsrc.php/v2/yp/r/yDnr5YfbJCH.gif

    enter image description here

    These URL's could change I suppose, and so could the default photos, but I haven't seen either case happen that I can remember.

    0 讨论(0)
  • 2021-01-14 08:13

    Using Facebook SDK for iOS (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
    }
    
    0 讨论(0)
  • You can use the redirect=false parameter:

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

    Then facebook's responce is json and contains this data:

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

    You can use the is_silhouette option to detect if the photo is default one.

    You can read more at: https://developers.facebook.com/docs/reference/api/using-pictures/

    0 讨论(0)
提交回复
热议问题