成就rescrape失败。 Error #3403 成就尚未注册

Achievements rescrape fail. Error #3403 Achievement hasn't been Registered

首先我要说的是,这是一款成熟的应用程序,拥有 51 项既定成就,这些成就在过去几年中一直有效,直到几天前。

我相信我对 Facebook 成就系统抓取的页面做了一些小改动,造成了这个混乱。成就 url 本身没有改变,但我的错误日志提醒我 og:url 标签中的拼写错误,所以我更正了它,以及相应的文件名。

看来挑剔是没有用的。

从那时起,每当系统尝试授予成就时,我都会收到错误消息:

E: (#3403) Achievement hasn't been registered for this application.

所以我尝试通过 Open Graph Object Debugger 重新抓取成就 并通过调用 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 .....

Return 符合预期的完整列表,没有错误或警告,但问题仍然存在。

自然地,我已经将所有相关文件从版本控制中移除并恢复了原始文件,在此过程中强制再次重新抓取,但没有骰子。

现在正在拔头发,非常感谢任何建议。

好的,我已经弄明白了,基本上我有 2 个动态 URLS 成就 achievementDescription.php achievementContent.php

achievementDescription.php几年前用facebook注册所有成就。包含在元标记中的是:

<meta property="og:url" content="http://example.com/achievementContent.php?aid=<?=$aid?>"/>

奇怪的是 achievementContent.php 实际上从未存在过,在创建时在文件名中被拼错了。纠正这个问题让 Facebook 把这看作是一个新的成就。

通过我的尝试 'fix',即正确命名和定位 achievementContent.php,我采纳了@Igy 的建议并尝试重新注册现有成就之一,但发现它创建了一个新的副本成就 linked 到 achievementContent.php URL(所有先前存在的成就都 linked 到 achievementDescription.php)

因此,我猜测 Facebook 端的抓取程序已在此期间升级。原来的注册系统一定是想跟着坏掉的link然后才把成就分配给了achievementDescription.phpURL。试图在较新的系统中重新抓取成就,但没有 og:url 的有效目的地,导致它失败。

将 og:url 属性 设置为自引用 achievementDescription.php 即

<meta property="og:url" content="http://example.com/achievementDescription.php?aid=<?=$aid?>"/>

然后重新注册所有成就导致 Facebook 系统再次开始识别成就,我们能够将它们奖励给玩家,重要的是它没有为我的应用程序创建重复的成就。