Как определить аватар по умолчанию на фейсбуке?

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

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

4 ответа

Вы можете использовать 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/

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

Мужчина: https://fbcdn-profile-a.akamaihd.net/static-ak/rsrc.php/v2/yL/r/HsTZSDw4avx.gifhttps://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-адреса могут измениться, как и фотографии по умолчанию, но я не видел ни одного случая, который мог бы вспомнить.

Если вы уже звоните в Graph API для получения пользовательских данных, таких как аватар, просто включите picture в параметрах полей при первом вызове 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"
        }
    }
}

Использование Facebook SDK для 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
}
Другие вопросы по тегам