成就重新抓取失败。错误 #3403 成就尚未注册

问题描述 投票:0回答:1

首先我要说的是,这是一款成熟的应用程序,拥有 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 .....

如预期返回完整列表,没有错误或警告,但问题仍然存在。

当然,我已经将所有相关文件从版本控制中取出并恢复了原始文件,一路上强制再次重新抓取,但没有骰子。

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

php facebook web-scraping facebook-php-sdk achievements
1个回答
0
投票

好的,我已经弄清楚了,基本上我有 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 系统再次开始识别成就,我们能够将它们奖励给玩家,重要的是它已经做到了这一点,而没有为我的应用程序创建重复的成就。

© www.soinside.com 2019 - 2024. All rights reserved.