如何正确编码包含等号的图像URL以用于Facebook开放图谱标签

4 投票
3 回答
4014 浏览
提问于 2025-04-16 07:04

我有一个页面上有一个Open Graph图片标签:

<meta property="og:image" content="http://childhumor2.homeip.net:9009/_ah/img/RYCF7Ty7wODp9R-N_QIWYA===s200"/>

这个图片是一个GAE的二进制文件,网址是通过调用get_serving_url得到的。这个网址在正常情况下是可以正常工作的。

但是,如果有人点赞这个页面,新闻推送中显示的缩略图就坏掉了。浏览器只返回了一个空的1x1像素的图片。

查看Facebook页面时,生成的HTML是:

<img src="http://external.ak.fbcdn.net/safe_image.php?d=6b635a7f80252e93c6b28e2dbe4ad440&amp;w=90&amp;h=90&amp;url=http%3A%2F%2Fchildhumor2.homeip.net%3A9009%2F_ah%2Fimg%2FRYCF7Ty7wODp9R-N_QIWYA%3D%3D%3Ds200" class="img">

当我第一次查看点赞用户的新闻推送时,我看到Facebook访问了我的服务器来获取图片:

INFO     2010-11-14 21:33:17,701 dev_appserver.py:3283] "GET /_ah/img/RYCF7Ty7wODp9R-N_QIWYA%3D%3D%3Ds200 HTTP/1.1" 500 -

很明显,网址中的等号有编码问题,但我不知道是谁的问题。

  • Facebook在回调我的服务器获取图片之前,应该先解码%3D吗?
  • GAE没有正确处理编码的网址吗?
  • 我应该以某种方式对Open Graph标签中的网址进行编码吗?(我尝试过用urllib.quote编码,但结果还是一样。)

更让人困惑的是,Facebook网址检查工具能够正确获取图片。而且如果在这个页面上分享Facebook,缩略图预览也会正确显示。这让我觉得可能是Facebook在代理/缓存图片时的safe_image.php脚本有bug。

3 个回答

0

作为一种解决方法,不要使用谷歌的图片服务。你可以自己写一个处理程序,从数据存储中获取图片,然后进行转换,再把它传回给客户端。这样,你就可以构建一个更简单的链接,这样 Facebook 就不会对它进行修改。

这是来自 GAE 文档的例子:

class Thumbnailer(webapp.RequestHandler):
    def get(self):
        blob_key = self.request.get("blob_key")
        if blob_key:
            blob_info = blobstore.get(blob_key)

            if blob_info:
                img = images.Image(blob_key=blob_key)
                img.resize(width=80, height=100)
                img.im_feeling_lucky()
                thumbnail = img.execute_transforms(output_encoding=images.JPEG)

                self.response.headers['Content-Type'] = 'image/jpeg'
                self.response.out.write(thumbnail)
                return

      # Either "blob_key" wasn't provided, or there was no value with that ID
      # in the Blobstore.
      self.error(404)
3

可能是因为Facebook应该把这个值进行解码,这样才能和你列出的原始og:image匹配。你可以按照Nathan的建议,写个bug报告。

不过,从技术上讲,%3D=在网址的路径部分是一样的意思,应该被视为相同的东西,所以这在GAE那边也可能是个bug。在这种情况下,你可能需要在GAE处理时使用urllib.unquote()来解码这个路径。(也许你可以直接重定向到未转义的版本)

1

如果网址检查工具显示一切正常,那么你很可能是对的,这可能是Facebook的一个错误。我建议你先看看他们已经存在的错误,看看能不能找到类似的问题。如果找不到,就可以提交一个新的错误报告。目前大约有4300个平台错误在处理,所以出现问题并不是不常见的。你可以在这里查看Facebook的错误列表:http://bugs.developers.facebook.net/

撰写回答