使用区域设置刮掉的Facebook元标记无效

时间:2011-09-30 18:34:31

标签: facebook facebook-like locale scraper

我的网站是多语言的,我有一个类似FB的按钮。我想用不同的语言发帖。

根据Facebook文档,如果我使用元标记og:locale和og:locale:alternate,则刮刀会通过参数“locale”和标题“X-Facebook-Locale”获取我的网站信息,但它是不发送任何内容。(https://developers.facebook.com/docs/beta/opengraph/internationalization/)。所以帖子总是以en_US结尾。

有人遇到同样的问题吗?

5 个答案:

答案 0 :(得分:17)

我得到了这个工作。 The documentation不是很详细;这是细节。

以下是我的Open Graph语言环境标签:

<meta property="og:locale" content="en_US" />
<meta property="og:locale:alternate" content="en_US" />
<meta property="og:locale:alternate" content="fr_CA" />

非常重要: The documentation似乎og:locale应始终反映网页的“默认”区域设置。不是这种情况;这样做会阻止刮刀检索其他语言。 og_locale必须反映网页的当前区域设置。换句话说,如果抓手(或用户)请求fr_CA内容,请确保{{ 1}}在响应中设置为og_locale

使用fr_CA指定所有可能的区域设置。这样,无论是刮刀要求og:locale:alternate还是en_US,它仍然知道两者都存在。

这是我要求Facebook刮刀重新处理我的页面:

fr_CA

以下是回复:

curl -d "id=https://apps.facebook.com/everydaybarilla/&scrape=true" https://graph.facebook.com

刮刀正确返回默认语言环境的数据,但根据the documentation,刮板似乎也应该刮掉备用语言环境;不是这种情况。显然,从上面的响应中可以看到备用语言环境,但它不会处理它们。

所以,这是我特意要求Facebook刮刀处理我的页面enfrançais

{
   "url": "http://apps.facebook.com/everydaybarilla/",
   "type": "website",
   "title": "Barilla\u2019s Every Day, Every Way Contest",
   "locale": {
      "locale": "en_us",
      "alternate": [
         "fr_ca"
      ]
   },
   "image": [
      {
         "url": "http://everydaybarilla.ssl.spidermarketing.ca/assets/img/thumbnails/5.png"
      },
      {
         "url": "http://everydaybarilla.ssl.spidermarketing.ca/assets/img/thumbnails/4.png"
      },
      {
         "url": "http://everydaybarilla.ssl.spidermarketing.ca/assets/img/thumbnails/3.png"
      },
      {
         "url": "http://everydaybarilla.ssl.spidermarketing.ca/assets/img/thumbnails/en-2.png"
      },
      {
         "url": "http://everydaybarilla.ssl.spidermarketing.ca/assets/img/thumbnails/en-1.png"
      }
   ],
   "description": "Barilla Canada is whisking one lucky winner and a guest off to Italy on an 8-day Italian culinary adventure for 2 in the Barilla Every Day, Every Way Contest!",
   "site_name": "Barilla\u2019s Every Day, Every Way Contest",
   "updated_time": "2012-04-16T17:59:38+0000",
   "id": "10150594698421968",
   "application": {
      "id": "317271281656427",
      "name": "Barilla\u2019s Every Day, Every Way Contest",
      "url": "http://www.facebook.com/apps/application.php?id=317271281656427"
   }
}

这一次,我正确地从刮刀中看到了对我的服务器的两个请求。第二个请求将curl -d "id=https://apps.facebook.com/everydaybarilla/&scrape=true&locale=fr_CA" https://graph.facebook.com 标头和X-Facebook-Locale网址参数正确设置为fb_locale。 POST正确返回法语响应:

fr_CA

成功!

当然,经过所有这些努力,当我访问法国Facebook.com并发布此URL时,状态框将填充...包含英文数据。似乎Facebook自己的接口未配置为请求正确的区域设置。

所以即使付出了这些努力,似乎也没有任何成就(通过Facebook翻译应用程序翻译我的字符串也不起作用,所以我想我不应该感到惊讶)。

但它确实回答了这个问题。也许其他人可以确定为什么Facebook.com界面似乎没有请求正确的区域设置。

答案 1 :(得分:3)

Facebook的语言环境处理完全不一致

在打开图形区域设置几周后,我设法根据用户的区域设置发布更改文本的内容。但是对于链接,我仍然无法获得预期的结果。

以下是我的观察:

og:调试器中的语言环境默认显示我的实际facebook语言环境。单击og:locale:alternate链接可更改对象属性以及界面语言。我认为这是设计的。

“原始打开图形文档信息”部分,未将fb_locale附加到输入URL,显示默认数据。如果设置了fb_locale并且是大小写混合,则根据参数更改Raw Open Graph Document Information部分。 “对象属性”部分仍显示基于实际/选定区域设置的数据。 如果fb_locale是小写的,则返回'解析输入URL时出错,没有数据被删除。'

对于附加到调试器(而不是输入)URL的'locale'参数,情况也是如此。如果是大小写混合格式,则会更改“对象属性”部分和界面语言。但是,当我以小写形式传递它时,它什么都不做(返回默认/当前语言环境)

令人惊讶的是,图表api反向运行:

  1. 当我请求使用php sdk进行重新扫描时

    1. 仅当locale以小写形式传递时才更新内容,但是(!)在这种情况下,返回的响应没有locale:locale参数,如果是X-Facebook区域设置标头或fb_locale,则设置该参数参数存在。

      响应中的所有数据都是默认语言环境。但是,更新了墙贴,并根据我的facebook区域设置正确显示文本。

    2. 如果语言环境以大小写混合格式传递 - 如文档所定义 - 请求返回'不支持的帖子请求'错误。 当使用php CURL函数而不是Facebook php SDK的api调用时,en_GB是一个例外,其中响应包含fb_locale和本地化(英语)内容,但是,对象属性/墙上的帖子不会更新,也不会更新en_GB。对于其他语言,将返回“不支持的帖子请求”。

  2. 当我使用对象的id(调试器页面底部的id - 通过查询'link_stat'表中的'comments_fbid'字段)而不是URL时:

    1. 对于大小写混合语言环境,响应包含所有语言环境的正确文本和fb_locale,但不会更新任何语言环境。 og:updated_time在调试器中没有变化,但它已在https://graph.facebook.com/[object ID]上更新

    2. 使用小写语言环境,结果与1.1中描述的相同。

  3. 在图表查询中,行为再次与上述相反: 当我尝试查询https://graph.facebook.com/[object ID]?locale = en_GB时, 使用混合大小写语言环境,它返回预期结果, 使用小写语言环境,它返回默认版本,不设置语言环境(仅限locale:alternate)标记。 :-o

  4. 图形api端点和调试器是否可能以不同方式处理区域设置,从而无法从两者获得相同的响应?

    btw使用小写区域设置,我设法在Feed上设置了本地化的帖子,其中的文本根据用户的区域设置显示。

    现在我的问题是所有链接都指向相同的规范URL而没有任何特定于语言环境的信息,因为 - 正如萨尔瓦多所说 - 这样会产生不同的对象。在这里看我的帖子: how to get the locale of a facebook user clicking on a localised object's link?

答案 2 :(得分:1)

我有同样的问题,直到最后通过设置元标记中的所有区域设置值(og:locale和og:locale:alternate)以小写形式来实现它。

检查一下: http://developers.facebook.com/bugs/309825175774568?browse=search_5033cc14f42016961266549

执行此操作并重新抓取后,转到Facebook并将语言设置更改为支持的区域设置将正确发送X-Facebook-Locale和fb_locale,并为我触发所需的结果。

顺便说一句:将用户区域设置设置为og:locale:alternate中未列出的用户区域设置不会发送header / get参数。

答案 3 :(得分:0)

加载Javascript SDK时,您指定了哪种语言?很容易忽视那一个。'

默认值为en_US,请参阅js.src行

<div id="fb-root"></div>
<script>(function(d, s, id) {
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) return;
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.net/en_US/all.js#xfbml=1&appId=127211380649475";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));</script>

答案 4 :(得分:0)

我有同样的问题。

Like按钮仅向Facebook发送他自己的属性data-href="www.example.com/yourpage",而不是og元标记值。然后Fb将og meta标签刮到你的页面,然后从这些标签创建Wall帖子 所以实际上帖子总是以你的页面默认语言。

在用户语言中发布帖子的一个解决方案是:

  • ?lang=userlanguage添加到Like按钮
  • 的data-href网址
  • 为您的网页提供获取userlanguage的功能,并在相应的翻译中显示元标记og:title和og:description (例如用php $ _GET)

所以Fb会在用户语言中抓取你的页面并创建一个区域设置帖子。

很遗憾 Fb为每个不同的网址?lang=userlanguage1userlanguage2创建一个对象...并且每个对象都有自己的粉丝列表。
因此,您网页的每个翻译都会有他的地方粉丝 : - (


类似的问题:Open Graph Localization