Facebook图形API。从相册获取照片

11

请帮我制作一个正确的请求Facebook API的代码。现在我有以下代码:

https://graph.facebook.com/me/albums?fields=photos

我得到了一个非常庞大的Json,其中包含许多不必要的信息。我尝试做这样的事情:

https://graph.facebook.com/me/albums?fields=photos?fields=source,name,id

或者像这样:

https://graph.facebook.com/me/albums?fields=photos&fields=source,name,id

但是图形API浏览器返回了相同的大量响应,或者我捕捉到了一个错误。有什么想法可以只提取必要信息来缩小响应体积吗?


你究竟想获取什么?专辑封面照片吗? - IgorGanapolsky
12个回答

29

实际上,有一种更好的方法来实现这个目标,即嵌套请求。

将相册作为参数传递,然后从与其连接的照片中筛选出您想要的字段。例如,在这里,我只从相册和照片中获取了我需要的所有内容,而且这些结果可以被限制。

me?fields=albums.fields(id,name,cover_photo,photos.fields(name,picture,source))

这真的很棒..我一直在寻找它! - Karthick Kumar
1
如果您还想要封面照片的字段:me?fields=albums.fields(id,name,cover_photo.fields(id,name,source,picture),photos.fields(name,picture,source)) - Houcine
+1. Sergio,鉴于你在这里的回答,我敢打赌你也知道这个Facebook Graph嵌套问题的答案:https://stackoverflow.com/q/57454155/470749 - Ryan

10

你只能使用fields,这些属性存在于对象中。

通过向下面的URL发出GET请求,您将仅获取相册ID列表:

https://graph.facebook.com/me/albums?fields=id&access_token=...

可以通过在相册表上运行下一个FQL查询来实现相同的效果:

SELECT aid FROM album WHERE owner=me()
实际上,useralbums连接并不真正包含photo对象列表,而是album(其中有photos连接)。因此,要获取用户拥有的照片,您需要遍历他的所有对象,并为每个相册获取照片。同样,您可以使用fields参数以限制结果数据。如果使用批量请求,这样做会更快。
或者通过FQL,可以像这样完成(涉及两个表:photoalbum):
SELECT pid FROM photo WHERE aid IN (SELECT aid FROM album WHERE owner=me())

3
另一种可能的解决方案是先获得专辑ID,然后迭代这些ID进行API调用:
<ALBUM-ID>/photos?fields=name,source,id

我在图形浏览器中测试了这个功能,它检索到了一个合理(且易读)的JSON对象。

2
每个相册都像Facebook中的用户对象一样,要获取特定相册中的照片,您需要请求类似以下内容的东西。
http://graph.facebook.com/{ALBUM_ID}?fields=photos&access_token="xxxxx"

2

获取照片URL:

  1. 确保你是Facebook页面的管理员。

  2. 访问: http://developers.facebook.com/tools/explorer

  3. 在API导航器中,你可以看到“/me”会显示你自己的基本信息。

  4. 尝试输入“/me/accounts”来查看是否有任何内容。它应该会给你一个错误。

  5. 点击“获取访问令牌”

  6. 一个窗口将弹出。转到“扩展权限”

  7. 选择“管理页面”

  8. 点击“获取访问令牌”

  9. 现在再次尝试“/me/accounts”。你应该会在浏览窗口中看到一列组。

  10. 选择你想要的页面,并点击“id”字段

  11. 接下来,在左侧窗口,你可以看到“节点:”和一个加号。点击加号以查看你拥有哪些选项。

  12. 点击加号并向下滚动到“连接”,然后选择“相册”

  13. 子级别,选择“照片”

  14. “照片”子级别,选择“源”

  15. 现在在右侧点击“提交”。你将看到一个JSON返回,其中包含你Facebook页面中所有照片的URL。

  16. 复制URL-https://graph.facebook.com/?fields=albums.fields(photos.fields(source))并将其插入到浏览器中。你应该会看到所有照片的JSON。


1

要获取专辑列表,请键入:

me?fields=albums

然后键入:

album_id/photos?fields=source

以获取该特定专辑的照片。


1
request('GET', '/me/albums?fields=id,name,cover_photo,photos{images{source}},description')

它将展示带有描述和不同分辨率照片的相册。
这需要访问令牌

谢谢,这个可以用,但我有一个问题:我能只获取特定分辨率的图片吗?例如,我想查询相册中每张照片只有 600x600 的图片。 - bigfanjs

1

对于 Swift 5

首先获取相册的id,如下所示

func getAlbumsData()
{

        GraphRequest.init(graphPath: "me", parameters: ["fields":"id,name,albums{name,picture}"]).start(completionHandler: { (connection, userResult, error) in

            if error != nil {

                print("error occured \(String(describing: error?.localizedDescription))")
            }
            else if userResult != nil {
                print("Login with FB is success")
                print()



                let fbResult:[String:AnyObject] = userResult as! [String : AnyObject]

                self.albumsPhotos = (fbResult["albums"] as! [String:AnyObject])["data"] as? [[String:AnyObject]]
                self.tblFbAlbums.reloadData()




            }
        })
    }

然后使用这种方法获取相册图片。
func fetchalbumsPhotosWithID() {


        let graphRequest : GraphRequest  = GraphRequest(graphPath: "\(album_Id)/photos", parameters: ["fields": "source"] )

        graphRequest.start(completionHandler: { (connection, result, error) -> Void in

            if ((error) != nil)
            {
                // Process error
                print("Error: \(error)")
            }
            else
            {
                print("fetched user: \(result)")

                let data =  result as! [String:Any]


            }
        })

    }

album_Id是从getAlbumsData()获取的数字


1
获取专辑ID
    if((FBSDKAccessToken.current()) != nil)
    {
        FBSDKGraphRequest(graphPath: "me/albums", parameters: ["fields" : "id"], httpMethod: "GET").start(completionHandler: { (connection, result, error) -> Void in
            if (error == nil)
            {
                let data:[String:AnyObject] = result as! [String : AnyObject]
                self.arrdata = data["data"]?.value(forKey: "id") as! [String ]
            }
        })
    }

使用上述代码,您将获得相册ID,然后使用该ID可以获取图片,如下所示: 从相册ID获取图像
    FBSDKGraphRequest(graphPath: "\(album_Id)/photos", parameters: ["fields": "source"], httpMethod: "GET").start(completionHandler: { (connection, result1, error) -> Void in
       if (error == nil)
       {
           let data1:[String:AnyObject] = result1 as! [String : AnyObject]
           let arrdata:[String] = data1["data"]?.value(forKey: "source") as! [String ]
           for item in arrdata
           {
               let url = NSURL(string: item )
               let imageData = NSData(contentsOf: url! as URL)
               let image = UIImage(data: imageData! as Data)
               self.imgArr.append(image!)
           }
        }
     })

0

为什么这个数据是不必要的?它返回了类似这样的东西吗:

{
   "data": [
      {
         "id": "ID",
         "from": {
            "name": "Hadrian de Oliveira",
            "id": "100000238267321"
         },
         "name": "Cover Photos",
         "link": "https://www.facebook.com/album.php?fbid=FBID&id=ID&aid=AID",
         "cover_photo": "ID",
         "privacy": "everyone",
         "count": 2,
         "type": "normal",
         "created_time": "2011-10-06T01:31:24+0000",
         "updated_time": "2012-02-22T17:29:50+0000",
         "can_upload": false
      },

?


可能是的。我不需要所有这些字段,我只想要照片链接。 - Ivan Kozlov
你是怎么得出那个结果的,@JohnKozlov? - Ivo San

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接