3

如何检测链接上的默认头像,如下所示https://graph.facebook.com/'.$id.'/picture?type=large:这是从特殊准备的配置文件中获取化身(男性/女性)然后通过例如 md5() 进行比较的唯一方法吗?

很难相信这是唯一的方法。

4

4 回答 4

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/

于 2013-11-09T11:25:31.347 回答
6

您无法调用 API 来判断他们是否使用默认照片。您可以向该配置文件 URL 发出 HTTP HEAD 请求并查看Location标头并查看该 URL 是否是已知的默认配置文件图像之一,而不是下载整个图像并检查 MD5:

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

女性(达斯维德):https ://fbcdn-profile-a.akamaihd.net/static-ak/rsrc.php/v2/yp/r/yDnr5YfbJCH.gif

在此处输入图像描述

我想这些 URL 可能会改变,默认照片也会改变,但我还没有看到任何一种情况发生在我记得的情况下。

于 2012-05-25T16:52:46.723 回答
1

如果您已经在调用 Graph API 以获取用户数据(如头像),则只需在您第一次调用 Graph API 时包含picture字段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"
        }
    }
}
于 2016-08-04T01:37:25.460 回答
0

使用 iOS 版 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
}
于 2017-11-24T11:18:05.967 回答