【问题标题】:Facebook Graph API: Uploading Photo to specific albumFacebook Graph API:将照片上传到特定相册
【发布时间】:2013-12-15 20:50:13
【问题描述】:

我正在尝试将照片上传到经过身份验证的 Facebook 用户的特定相册。但是这张照片没有出现在相册中。它出现在名为“appname”Photos 的新相册中。我将尝试尽可能完整地描述我的方式 - 也许这可以帮助您找到我的错误。

我没有使用任何 Facebook 或第三方 SDK。项目编程语言是 C#(如果重要的话)。

首先,我通过将用户发送到以下 URL 来获取访问令牌:

https://www.facebook.com/dialog/oauth?client_id={0}&redirect_uri={1}&response_type={2}&scope={3}
  • {0}:客户端 ID:我的应用程序 ID,由 Facebook 提供
  • {1}:重定向 URI,设置为“https://www.facebook.com/connect/login_success.html”,因为我正在处理桌面应用程序
  • {2}:响应类型:'token'
  • {3}:范围 - 我请求的所有权限。这是以下项目的逗号分隔列表:
    • manage_pages
    • 电子邮件
    • user_about_me
    • user_photos
    • user_videos
    • publish_actions
    • publish_stream
    • user_likes
    • user_activities
    • user_groups
    • 照片上传
    • 视频上传

权限列表不仅适用于照片上传。

登录及其实现工作得很好,所以我在答案中得到了一个“access_token”和一个“expires_in”字段。

如果我还没有保存它,我将获取由访问令牌表示的经过身份验证的用户的用户 ID。这是通过一个简单的请求来完成的:

https://graph.facebook.com/me?access_token={0}
  • {0} 是获取的访问令牌

这也很有效,我得到了带有姓名、电子邮件等和用户 ID 的积极响应。

下一个任务,获取与获取的访问令牌和用户 ID 关联的用户的专辑列表。这是通过 FQL 查询完成的:

SELECT aid,can_upload,created,name,description FROM album WHERE owner={0}
  • {0} 是用户 ID

通过调用此 URL 执行 FQL 查询:

https://graph.facebook.com/fql?q={0}&access_token={1}
  • {0} 上面的查询
  • {1} 访问令牌

同样,这很好用——我得到了请求的字段。 'aid' 值稍后用作专辑 ID,格式为 99999999_999999999(中间有下划线的数字)。我只使用 can_upload 标志为“true”的专辑。

现在,我希望我拥有发布照片所需的所有信息。

我为此 URL 创建了一个 POST 请求,multipart/form-data:

https://graph.facebook.com/{0}/photos?access_token={1}
  • {0} 是 9999999_999999 专辑 ID
  • {1} 是来自登录的访问令牌

请求包含两个字段:“source”包含照片的二进制数据,“message”包含标题。

请求成功。我没有发现任何问题。

但是当我现在访问 Facebook 用户页面时,照片不在所选相册中,它们在名为“appname”照片的额外相册中。标题设置正确。

我必须进行哪些更改才能将照片直接带到所需的相册?

【问题讨论】:

    标签: facebook facebook-graph-api facebook-opengraph


    【解决方案1】:

    重定向 URI,设置为 'https://www.facebook.com/connect/login_success.html',因为我正在工作 在桌面应用程序上

    我不清楚在这种情况下您是如何获得 USER 的访问令牌的。对我来说,您似乎没有得到它,而是您正在使用您的 APP 令牌 - 这就是奇怪的专辑名称的原因。您能否再次检查Token Debugger 您确实使用了用户的令牌?

    我的一个 Windows 窗体应用程序有类似的工作流程 - 但我确实将用户重定向到本地主机 - 这是我的 WCF 服务正在侦听和获取用户访问令牌的地方。

    【讨论】:

    • 令牌没问题。从桌面应用程序的角度来看,您正在观看嵌入式浏览器的导航事件。当它到达上面的 URL 时,解析添加到 URL 中的令牌,如页内引用令牌 https://www.facebook.com/connect/login_success.html#access_token=12345ABCED....&expires_in=12345
    【解决方案2】:

    aid 不是您在上传时应该使用的 ID。这在 Facebook 文档中并不明显 - 但您应该使用 object_id 列,因为它表示 Graph API 上的一个对象。

    因此,将您的 FQL 查询更改为:

    SELECT object_id,can_upload,created,name,description FROM album WHERE owner={0}
    

    object_id 只是一个数字 - 不是用下划线分隔的两个数字。所以把你的帖子发到:

    https://graph.facebook.com/{0}/photos?access_token={1}
    
    • {0} 是 9999999 对象 ID
    • {1} 是来自登录的访问令牌

    请注意,您只需要 user_photos 权限即可上传照片。但是如果没有 publish_stream 权限,它们不会立即出现在用户的相册中 - 相反,当用户浏览相册时,他们会看到:

    一旦他们点击批准,他们就会出现在相册中。如果您的应用程序有 publish_stream,那么它们将直接进入相册,用户无需批准它们。

    你的其余代码应该是正确的。

    【讨论】:

    • 对象 ID 确定了缺失的链接。它现在就像一个魅力。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多