web-dev-qa-db-ja.com

1回のAPI呼び出しで大きな写真のURLを取得する方法は?

Facebookアプリのフィードビューに大きな写真をすぐに表示したい。 1つのAPI呼び出しを使用してストリーム/フィードから大きな写真のsrc URLを取得することは可能ですか?写真IDはストリーム/フィードで返され、もちろんこの写真IDを追加のFQLまたはグラフAPI呼び出しで提供して、その写真に関するすべての情報を取得できます。しかし、マルチクエリまたはバッチ呼び出しを使用して、1つのAPIラウンドトリップを使用してより大きな写真src URLを取得する方法はありますか?

39
John Wright

ストリーム/フィードの写真でこれを試したことはありませんが、一般的に受け入れられている方法は次のとおりです。

http://graph.facebook.com/{ID of object}/picture

「大」バージョンが必要な場合は、次のようにします。

http://graph.facebook.com/{ID of object}/picture?type=large

これが実際の写真(ユーザープロフィール写真やページプロフィール写真ではなく)で機能するかどうかは100%確信はありませんが、私はそれがうまくいくと思います-唯一の注意点は、明らかにログインユーザーが必要だということです(公開されていない限り)写真を閲覧する権限があります。

85
streetlogics

誰かがこれを探していて、大きな文字を入力するだけでは十分でない場合、他の解決策を見つけました。

タイプlargeはとにかく小さなものです(200pxに近い)。 ?width=1000または?height=1000を追加すると、より大きな画像を取得できます。 Facebookは指定された寸法に最も近い画像を返し、アスペクト比を保持します。 ?width=1000&height=1000などの両方の寸法を渡すと、facebookは指定された寸法(この場合は正方形)に画像を切り取ります。

31
Lucas

Facebook UserId(オブジェクトID)を使用して写真を取得します。

https://graph.facebook.com/173xxxx8635/picture?type=large&redirect=false

画像のURLを含むJSONデータを返します。

{
   "data": {
      "is_silhouette": false,
      "url": "https://fbcdn-profile-a.akamaihd.net/xxx/xyz/1cc066a2cae3f301d"
   }
}
2
Madan Sapkota

この問題を抱えていたとき、設定したサイズではなく、ダウンロードした画像であることがわかりました。

たとえば、次のリクエストですべての写真をダウンロードした場合

[FBRequestConnection startWithGraphPath:@"/me/photos?fields=created_time,name,picture&type=tagged" parameters:nil HTTPMethod:@"GET" completionHandler:^(FBRequestConnection * connection, id result, NSError *error) {

    NSDictionary * userData = (NSDictionary *)result;
    NSMutableArray * array = [[NSMutableArray alloc] initWithArray:userData[@"data"]];

    for (NSDictionary * dict in eventsToAdd) {

        UIImage * image = dict[@"picture"] 
    }
}];

写真が欲しいので、辞書キー検索「写真」を使用しています。

これは、この検索で​​「ソース」を検索した場合よりも低品質の画像を取得します:

[FBRequestConnection startWithGraphPath:@"/me/photos?fields=created_time,name,source&type=tagged" parameters:nil HTTPMethod:@"GET" completionHandler:^(FBRequestConnection * connection, id result, NSError *error) {

    NSDictionary * userData = (NSDictionary *)result;
    NSMutableArray * array = [[NSMutableArray alloc] initWithArray:userData[@"data"]];

    for (NSDictionary * dict in eventsToAdd) {

        UIImage * image = dict[@"source"] 
    }
}];

Facebook API Explorerで写真を検索し、写真とソースjpgリンクをクリックすると、サイズと品質の違いがわかります。

このメソッドを変更してから、型パラメーターの使用をやめることができました。違いはないようです。

注:私はiPadや大きな画面ではなくiPhoneを使用しているため、これがどのように大きな画面に影響するかわかりません。

1
simon_smiley

新しいAPIを使用する良い方法は、イベントテーブルからpic_coverフィールドを取得し、使用するサイズに応じて処理することです。

1
user1445685

@streetlogicsの答えは問題なく機能しますが、{object_id}が含まれる写真でのみ有効です。

http://graph.facebook.com/{object_id}/picture

しかし、フィードの共有リンク用に大きな写真が必要でした。この写真には{object_id}がない場合があります。 {picture}サムネイルURLには、元のサイトの大きな画像のエンコードされたURLが含まれていることがようやくわかりました。

https://external.xx.fbcdn.net/safe_image.php?d=AQBe9UvGd0vPbAHP&w=130&h=130&url=http%3A%2F%2Fskift.com%2Fwp-content%2Fuploads%2F2015%2F12%2Fpollution.jpg&cfs=1

->含む->

http://skift.com/wp-content/uploads/2015/12/pollution.jpg

そこで、{object_id}をチェックするループを作成し、存在しない場合は{picture}からURLを抽出します。

if(isset($post['object_id'])) {
    echo "http://graph.facebook.com/".$post['object_id']."/picture";
    }
    elseif(isset($post['picture'])) {
        echo urldecode(preg_replace('/&cfs.*/', '', preg_replace('/.*url=/', '', $post['picture'])));
    } 
    else {
        echo "no_large_image";
}
0
williamtx