2010-11-14 8 views
3

J'ai une page avec une balise d'image Open Graph:Comment coder correctement l'URL de l'image avec le signe égal pour la balise graphique ouvert Facebook

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

L'image est un blob GAE et l'URL vient d'appeler get_serving_url. L'URL fonctionne normalement.

Maintenant, si quelqu'un aime cette page, l'image miniature affichée dans le fil d'actualité est cassée. Seule une image 1x1 vierge est renvoyée au navigateur.

inspectant la page FB, le code HTML généré est:

<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"> 

Lorsque vous affichez l'alimentation de l'utilisateur goût de nouvelles pour la première fois, je vois FB a frappé mon serveur pour l'image:

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 - 

Il est évident qu'il y a un problème d'encodage d'URL avec les signes égaux dans l'URL mais je n'ai aucune idée de qui est en faute ici.

  • Est-ce que FB doit déconnecter% 3D avant de rappeler l'image sur mon serveur?
  • GAE ne gère pas correctement une URL codée?
  • Devrais-je encoder l'URL dans la balise Open Graph d'une manière ou d'une autre? (J'ai essayé urllib.quote-ing avec les mêmes résultats.)

Pour rendre les choses plus confuses, le Facebook URL Linter récupère l'image correctement. En outre, si vous effectuez un partage FB sur la page, l'aperçu des vignettes s'affichera correctement. Cela m'amène à croire qu'il s'agit d'un bug avec le script safe_image.php FB est en train de primer/mettre en cache l'image.

+0

Au 29.03.11 Facebook bug résolu ce. http://bugs.developers.facebook.net/show_bug.cgi?id=13632 – cope360

Répondre

1

Si l'URL linter indique que tout fonctionne correctement, alors vous avez probablement raison de dire que c'est un bug avec Facebook. Je recommanderais de chercher parmi leurs bogues existants pour voir si vous pouvez en trouver un qui existe, et si ce n'est pas poster un nouveau bug. Il y a actuellement environ 4 300 bogues de plate-forme ouverts, il n'est donc pas rare que quelque chose soit cassé. Facebook Bugs: http://bugs.developers.facebook.net/

+0

Faites-en 4301 bogues ...;) Déposez ceci sur http://bugs.developers.facebook.net/show_bug.cgi?id = 13632 – cope360

3

Il est probable que Facebook ne devrait pas indiquer la valeur de sorte qu'elle corresponde à l'image og: originale que vous avez listée, et vous devriez écrire un bogue pour cela (comme Nathan l'a suggéré). Cependant, techniquement parlant, %3D et = ont la même signification dans la section chemin d'une URL et doivent être traités de manière égale, ce qui peut également être digne d'un bug sur le côté GAE des choses. Dans ce cas, vous voulez probablement urllib.unquote() le chemin lorsqu'il est géré sur GAE. (peut-être pourriez-vous simplement rediriger vers la version sans échappement)

+0

Malheureusement, je n'ai pas d'options sur le côté GAE. Il génère des URL comme http://lh4.ggpht.com/n6Tg_8uEu-nS_5ugZ4L5FpFwZ4koEozGfgpo3B84hjxcGRENdX31xzW_r7lD2u7lEd99hxn7jiRULxKA4D8=s400 qui vont directement au service de diffusion d'images Google. Je ne peux voir la demande réelle de FB lors de l'exécution sur le serveur de développement local. – cope360

+0

En ce qui concerne l'échappement, ma lecture de la section 2.2 RFC 3986 est le "=" est un caractère réservé et l'échappement n'est pas valide. – cope360

+0

@ cope360 escape est exactement ce que vous êtes censé faire avec les caractères réservés lorsqu'ils ne sont pas utilisés pour leur utilisation réservée (par exemple:? Query_param = data). Une interprétation stricte est que '=' est réservé seulement après un '?' dans une URL mais une interprétation générale est qu'il est réservé partout. La différence entre ces deux est là où vous rencontrez des problèmes. GAE s'attend à ce dernier, Facebook le premier. – Jehiah

0

Pour contourner le problème, n'utilisez pas le service de diffusion d'images Google. A la place, écrivez un gestionnaire pour extraire le blob du magasin de données, le transformer et le retransmettre au client. Cela vous permet de construire une URL plus simple qui ne sera pas utilisée par Facebook.

Example from GAE Docs:

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) 
Questions connexes