Как правильно кодировать URL-адрес изображения со знаком равенства для тега открытого графика Facebook - PullRequest
3 голосов
/ 15 ноября 2010

У меня есть страница с тегом изображения Open Graph:

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

Изображение представляет собой BLOB-объект GAE, а URL-адрес исходит от вызова get_serving_url. URL работает нормально нормально.

Теперь, если кому-то нравится эта страница, уменьшенное изображение, отображаемое в ленте новостей, не работает. Только пустое изображение 1x1 возвращается в браузер.

При просмотре страницы FB сгенерированный 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">

При первом просмотре новостной ленты понравившегося пользователя я вижу, что FB ударил по моему серверу для изображения:

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 -

Очевидно, что существует проблема кодирования URL со знаком равенства в URL, но я не знаю, кто здесь виноват.

  • Должен ли FB быть эскалацией% 3D перед тем, как перезвонить на мой сервер для изображения?
  • GAE неправильно обрабатывает закодированный URL?
  • Должен ли я как-то кодировать URL в теге Open Graph? (Я пробовал urllib.quote-с его же результатами.)

Чтобы сделать вещи более запутанными, Facebook URL Linter правильно извлекает изображение. Также, если вы делите FB на странице, предварительный просмотр будет отображаться правильно. Это наводит меня на мысль, что это ошибка скрипта safe_image.php, с которым FB передает / кэширует изображение.

Ответы [ 3 ]

3 голосов
/ 15 ноября 2010

Вероятно, это тот случай, когда Facebook должен снять кавычки со значением, чтобы оно совпадало с оригинальным изображением og:, которое вы перечислили, и вы должны написать для этого ошибку (как предложил Натан).

Однако, технически говоря, %3D и = имеют одинаковое значение в разделе пути URL-адреса и должны обрабатываться одинаково, так что это может привести к ошибкам на стороне GAE. В этом случае вы, вероятно, захотите urllib.unquote() путь при обработке в GAE. (возможно, вы могли бы просто перенаправить на неэкранированную версию)

1 голос
/ 15 ноября 2010

Если линтер URL говорит, что все работает правильно, то вы, скорее всего, правы, что это ошибка в Facebook. Я бы порекомендовал поискать их существующие ошибки, чтобы увидеть, можете ли вы найти ту, которая существует, и если нет, то опубликуйте новую ошибку. В настоящее время открыто около 4300 ошибок платформы, так что, безусловно, что-то не так. Ошибки Facebook: http://bugs.developers.facebook.net/

0 голосов
/ 17 ноября 2010

В качестве обходного пути, не используйте сервис обслуживания изображений Google. Вместо этого напишите обработчик, чтобы получить большой двоичный объект из хранилища данных, преобразовать его и передать обратно клиенту. Это позволяет вам создать более простой URL, который не будет разглашен 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...