首先我要说的是,这是一款成熟的应用程序,拥有 51 项既定成就,这些成就在过去几年中一直有效,直到几天前。
我相信我是通过对 Facebook 成就系统抓取的页面进行一些小更改而造成了这个混乱。成就 url 本身没有更改,但我的错误日志提醒我 og:url 标记中存在拼写错误,因此我纠正了它以及相应的文件名。
挑剔似乎没有回报。
从那时起,每当系统尝试授予成就时,我都会收到错误:
E: (#3403) Achievement hasn't been registered for this application.
所以我尝试通过开放图对象调试器重新抓取成就 并通过像这样调用 API:
try{
$request = new FacebookRequest( $adminSession,
'POST',
"/?id=". FB_METRO_ACH_URL_BASE . $achievementId . '&scrape=true'
);
$response = $request->execute();
}catch .....
我预计在做出更改后无论如何都必须执行其中一种方法。
在对象调试器中,抓取进展顺利,没有任何警告。 API 重新抓取也顺利进行,并正确、完整地显示每个成就,并具有正确的应用程序 ID。
获取成就的唯一 ID 并在对象浏览器中查看它们看起来也不错。
一般 API 调用显示为此应用程序注册的所有成就,如下所示:
try{
$request = new FacebookRequest( $adminSession,
'GET',
"/" . APP_ID . "/achievements"
);
$response = $request->execute();
}catch .....
如预期返回完整列表,没有错误或警告,但问题仍然存在。
当然,我已经将所有相关文件从版本控制中取出并恢复了原始文件,一路上强制再次重新抓取,但没有骰子。
现在正在拔头发,所以非常感谢任何建议。
好的,我已经弄清楚了,基本上我有 2 个用于成就的动态 URL 成就描述.php 成就内容.php
achievementDescription.php 几年前被用来在 facebook 上注册所有成就。元标记中包含的是:
<meta property="og:url" content="http://example.com/achievementContent.php?aid=<?=$aid?>"/>
奇怪的是,achievementContent.php 实际上从未存在过,在创建时文件名中拼写错误。纠正这个问题让 Facebook 认为这是一个新的成就。
通过我尝试的“修复”,即拥有正确命名和定位的 AchievementContent.php,我采纳了 @Igy 的建议并尝试重新注册现有成就之一,发现它创建了链接到 AchievementContent.php URL 的新重复成就(所有预先存在的成就都链接到 AchievementDescription.php)
因此,我猜测 Facebook 端的抓取程序已在此期间进行了升级。原始注册系统一定尝试跟踪损坏的链接,然后将成就分配给 AchievementDescription.php URL。尝试在新系统中重新抓取成就,但没有有效的 og:url 目标,导致失败。
将 og:url 属性设置为自引用 AchievementDescription.php 即
<meta property="og:url" content="http://example.com/achievementDescription.php?aid=<?=$aid?>"/>
然后重新注册所有成就导致 Facebook 系统再次开始识别成就,我们能够将它们奖励给玩家,重要的是它已经做到了这一点,而没有为我的应用程序创建重复的成就。