Facebook Marketing Api - при l oop выдает «AuthorizationException Произошла неизвестная ошибка». (во второй раз) - PullRequest
0 голосов
/ 04 апреля 2020

Я использую Facebook Ads SDK и пытаюсь добавить пользователей в пользовательский список аудитории. Поскольку существует предел 10000 данных одновременно , для будущего использования я пытаюсь добавить данные в al oop.

Однако, когда он попадает во второй раз, он выдает ошибку.

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() вызывается несколько раз. Все та же проблема.


В этом ответе говорится, что нужно выполнять запросы индивидуально, но как это можно сделать? Но разве я не пробовал все возможные сценарии ios?

Ошибка, похоже, связана с пакетными запросами. Для нас было принято решение изменить код для выполнения запросов по отдельности.


Я полагаю, что речь идет о времени выполнения, потому что когда я обновляю sh, все работает нормально; так что я не думаю, что это проблема удушения (я также пытался sleep(10), на самом деле это работает на refre sh).

Как я могу преодолеть эту проблему?

  • Может быть, есть способ уничтожить App экземпляр? Или есть способ создать новый App экземпляр для перезаписи предыдущего?

  • Я видел пакетный запрос в документах Facebook , но не смог понять как использовать его в моем сценарии использования (пользовательская аудитория & 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);

Здесь массив ответов имеет оба запроса. 1-й успешен, второй - тот же вопрос.

$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"}}"

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Я нашел ошибку, на самом деле она была от моего конца.

Когда я работал на чанки, мои индексы в чанках сохраняли свои индексы фактического массива, и поскольку он не давал [0,1, 2], это вызывало сбой вызова API.

array_values($chunk); должен решить эту проблему.

для коллекции Laravel $chunk->values()->toArray();

0 голосов
/ 04 апреля 2020

Я разместил это как комментарий, но форматирование не помогло.

Добавьте следующие строки в FacebookAds/Http/Adapter/CurlAdapter.php непосредственно перед $raw_response = $this->getCurl()->exec();.

$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.

Редактировать: Точный код, который нужно поставить выше $raw_response

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