Facebook Marketing Api - 循环运行抛出“AuthorizationException 发生未知错误”。 (第二次)

Posted

技术标签:

【中文标题】Facebook Marketing Api - 循环运行抛出“AuthorizationException 发生未知错误”。 (第二次)【英文标题】:Facebook Marketing Api - running on loop throws "AuthorizationException An unknown error has occurred." (on 2nd time) 【发布时间】:2020-04-03 22:46:41 【问题描述】:

我正在使用 Facebook 广告 SDK 并尝试将用户添加到自定义受众列表。因为有一个10000 data limit at a time,为了将来的证明,我正在尝试在循环中添加数据。

但是,当它第二次命中时,它会抛出错误。

1.

public function test($audienceId, $data)
    Api::init($appId, $appSecret, $token);

    $audience = new CustomAudience($audienceId);

    $schema = [
       CustomAudienceMultikeySchemaFields::EMAIL,
       CustomAudienceMultikeySchemaFields::PHONE,
       //...
    ];

    foreach (array_chunk($data, 500) as $chunk) 
        $audience->addUsersMultiKey($chunk, $schema, true);
    


// And run as

$class = new FbTestClass();
$class->test($audienceId, $data);

如果addUsersMultiKey() 运行 1 次,它可以正常工作,但是如果它运行 2 次,则会引发错误

FacebookAds\Http\Exception\AuthorizationException - 发生未知错误。


2 然后我尝试将App:init() 部分移动到__construct(),但问题仍然存在。

public function __construct() 
   Api::init($appId, $appSecret, $token);


public function test($audienceId) 
   $audience = new CustomAudience($audienceId);

   $schema = [
       CustomAudienceMultikeySchemaFields::EMAIL, //...
   ];

   $audience->addUsersMultiKey($chunk, $schema, true);


// And run as:

$class = new FbTestClass();

foreach (array_chunk($data, 500) as $chunk) 
   $class->test($audienceId, $chunk);


3。我尝试在test() 函数之外循环,并将App::init() 保留在test() 函数内,因此App::init() 被多次调用。还是同样的问题。


This answers 说要单独处理请求,但怎么可能这样做呢?但是,我没有尝试所有可能的情况吗?

错误似乎与批处理请求有关 - 我们的解决方案是更改代码以单独执行请求。


我相信这与运行时有关,因为当我刷新时,它工作正常;所以我不认为这是限制问题(我也尝试过sleep(10),实际上它在刷新时有效)。

我该如何解决这个问题?

也许有办法销毁App 实例?或者有没有办法创建一个新的App 实例来覆盖之前的实例?

我看到了batch request in the facebook docs,但不知道如何在我的用例中使用它(自定义受众和 addUsersMultiKey())。


堆栈跟踪:

An unknown error has occurred. "userId":1,"exception":"[object] (FacebookAds\\Http\\Exception\\AuthorizationException(code: 1): An unknown error has occurred. at /home/vagrant/Code/myApp/vendor/facebook/php-ads-sdk/src/FacebookAds/Http/Exception/RequestException.php:165)    
[stacktrace]
#0 /home/vagrant/Code/myApp/vendor/facebook/php-ads-sdk/src/FacebookAds/Http/Client.php(215): FacebookAds\\Http\\Exception\\RequestException::create()
#1 /home/vagrant/Code/myApp/vendor/facebook/php-ads-sdk/src/FacebookAds/Http/Request.php(286): FacebookAds\\Http\\Client->sendRequest()
#2 /home/vagrant/Code/myApp/vendor/facebook/php-ads-sdk/src/FacebookAds/Api.php(165): FacebookAds\\Http\\Request->execute()
#3 /home/vagrant/Code/myApp/vendor/facebook/php-ads-sdk/src/FacebookAds/Api.php(214): FacebookAds\\Api->executeRequest()
#4 /home/vagrant/Code/myApp/vendor/facebook/php-ads-sdk/src/FacebookAds/Object/CustomAudience.php(537): FacebookAds\\Api->call()

#5 is where I execute the code:
$audience->addUsersMultiKey($chunk, $schema, true);

更新:4 我也用 graph-sdk 尝试过同样的事情

$fb = new Facebook([
      'app_id' => env("FB_APP_ID"),
      'app_secret' => env("FB_APP_SECRET"),
      'default_graph_version' => 'v6.0',
      'default_access_token' => env("FB_ACCESS_TOKEN")
]);

foreach ($chunks as $chunk) 
      $payload = [
          'schema' => $schema,
          'data' => $chunk->toArray()
      ];
      
      $requests[] = $fb->request("POST", "/$customAudienceId/users", ['payload' => $payload]);


$batchResponse = $fb->sendBatchRequest($requests);

这里,响应数组有两个请求。第一个成功了,第二个同样的问题。

$batchResponse contains:

responses: array:2 [▼
    0 => Facebook\FacebookResponse ▼
        body => // successful data returned...
    1 => Facebook\FacebookResponse ▼
        body => ""error":"message":"An unknown error has occurred.","type":"OAuthException","code":1,"fbtrace_id":"A5...464cGc22gi28Kb""

【问题讨论】:

请包含异常跟踪,我这里有一个SDK的副本,这样更容易知道异常是在哪里引发的。 另外,尝试捕获异常,并使用.. catch (\FacebookAds\Http\Exception\AuthorizationException $e) var_dump($e->getResponse); 从中获取实际响应 @DanielCosta 我已添加到问题中 我看了看SDK,跟踪。找不到太多,可能是graph api或sdk本身的错误。我本来打算建议你在 facebook 上提交错误报告,但刚刚看到你已经这样做了。 :) 是的,非常奇怪的问题。如果我刷新,它可以工作,但如果我在同一个运行时使用它,它就不起作用。你认为有办法销毁 Api 实例并重新创建它吗?或者你有什么我可以尝试的理论吗?我的实验理论是:$session = new $api = new Session(env("APP_ID"), env("APP_SECRET"), env("TOKEN")); $api = new Api(new Client(), $session); // do stuff // unset($api) 但到目前为止还没有运气????‍♂️ 【参考方案1】:

我发现了这个bug,它实际上是我的结果。

当我进行分块时,我的分块索引保留了实际数组的索引,并且由于它没有给出 [0,1,2],因此导致 api 调用失败。

array_values($chunk); 应该可以解决这个问题。

Laravel 的收藏$chunk->values()->toArray();

【讨论】:

无论如何,API 应该返回更好的错误信息。很高兴你明白了。 @DanielCosta 谢谢 - 是的,可以节省我一天的时间。 AuthorizationException 远非描述性【参考方案2】:

我已将此作为评论发布,但格式没有帮助。

$raw_response = $this->getCurl()->exec(); 之前添加以下行到FacebookAds/Http/Adapter/CurlAdapter.php

$fp = fopen("/temp/log_" . uniqid() . ".txt", "w"); // change this to any file, but make sure it changes between requests
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_STDERR, $fp);

通过这种方式,您可以检查所发出请求的实际内容。如果请求相同,那肯定是 facebook 的 bug。

编辑:要放在$raw_response上方的确切代码

curl_setopt($this->getCurl()->getHandle(), CURLOPT_VERBOSE, 1);
curl_setopt($this->getCurl()->getHandle(), CURLOPT_STDERR, $fp);

【讨论】:

我试图运行它,除了第一行之外,请求似乎相同:第一行(成功)一个:Hostname in DNS cache was stale, zapped;第二(失败)一:Hostname graph.facebook.com was found in DNS cache。另一个区别是,第一个请求的最后一行显示Connection #0 to host graph.facebook.com left intact。编辑:在底部我看到HTTP error before end of send, stop sending 请求失败。我不太清楚要查看和诊断哪个部分。你有什么建议吗?

以上是关于Facebook Marketing Api - 循环运行抛出“AuthorizationException 发生未知错误”。 (第二次)的主要内容,如果未能解决你的问题,请参考以下文章

Facebook Marketing Api - 循环运行抛出“AuthorizationException 发生未知错误”。 (第二次)

在 Facebook Marketing api 中创建 geo_locations 定位规范时获取无效的参数响应

如何获得Facebook广告UTM

Facebook api用于创建业务经理导致权限错误

如何通过API获取Facebook跟踪网址参数

如何通过业务经理请求访问用户的Facebook页面?