Ios 如何检测facebook上的默认化身?

Ios 如何检测facebook上的默认化身?,ios,facebook,facebook-graph-api,avatar,avatars,Ios,Facebook,Facebook Graph Api,Avatar,Avatars,如何检测链接上的默认化身,如下所示:https://graph.facebook.com/“.$id.”/picture?type=large? 这是从特别准备的个人资料中获取化身(男性/女性)并通过例如md5()进行比较的唯一方法吗 很难相信这是唯一的方法。没有可以调用的API来判断他们是否使用默认照片。不必下载整个图像并检查MD5,您可以向该配置文件URL发出HTTP HEAD请求,并查看位置标头,查看URL是否为已知的默认配置文件图像之一: 男: 女性(达斯维德): 我想这些URL可能

如何检测链接上的默认化身,如下所示:
https://graph.facebook.com/“.$id.”/picture?type=large
? 这是从特别准备的个人资料中获取化身(男性/女性)并通过例如md5()进行比较的唯一方法吗


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

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

男:

女性(达斯维德):


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

您可以使用
redirect=false
参数:

然后facebook的响应是
json
,包含以下数据:

{
   "data": {
      "url": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-prn1/157337_5526183_369516251_q.jpg",
      "is_silhouette": false
   }
}
您可以使用
is_剪影
选项检测照片是否为默认照片


您可以在以下位置阅读更多内容:

如果您已经在调用Graph API来获取用户数据,如头像,那么在您第一次调用Graph API时,只需在参数中包含
图片
,然后响应将包含
is_剪影
偏移量,如果设置为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"
        }
    }
}

使用Facebook SDK for iOS(Swift 4):

class FacebookSignIn{
枚举错误:Swift.Error{
案例无法初始化请求
个案意外反应
}
func profileImageURL(大小:CGSize,完成:@escaping Result.completion){
guard let userID=FBSDKAccessToken.current()?.userID else{
完成(.failure(错误。无法初始化请求))
返回
}
let params:[String:Any]=[“重定向”:0,
“类型”:size.width==size.height?“正方形”:“普通”,
“高度”:Int(尺寸高度),
“宽度”:Int(尺寸宽度),
“字段”:“is_剪影,url”]
guard let request=FBSDKGraphRequest(图形路径:“/\(用户ID)/picture”),参数:params)else{
完成(.failure(错误。无法初始化请求))
返回
}
_=request.start{},结果,错误在
如果让e=错误{
完成(.e))
}否则,如果让结果=结果为?[String:Any],让数据=结果[“data”]为?[String:Any]{
如果让isSilhouette=data[“is_剪影”]as?Bool,那么让urlString=data[“url”]as?String{
如果是伊瑟霍伊特{
完成(.success(nil))
}否则{
如果let url=url(字符串:urlString){
完成(.success(url))
}否则{
完成(.failure(错误。意外响应))
}
}
}否则{
完成(.failure(错误。意外响应))
}
}否则{
完成(.failure(错误。意外响应))
}
}
}
}
公共枚举结果{
成功案例(T)
案例失败(Swift.错误)
公共类型别名完成=(结果)->Void
}

这是用户的个人资料图片,您已经知道其url,除此之外您还需要什么?只需使用is_剪影Darth vader comment rocks!
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
}