@Freerade

Как массово выводить сущности в amocrm?

Мне надо пройтись по компаниям, компаний 30000 где-то (они тестовые разумеется), если в компании есть 2 тега, то надо создать задачу, что у компании 2 тега и надо убрать один. Проблема в том, что аккаунт постоянно блокируется из-за превышения лимита запросов в секунду, у них там в секунду можно 7 раз обратиться. Код следующий получился:

for ($i = 0; $i < count($companies); $i++) {


        if (count($companies[$i]["_embedded"]["tags"]) > 1) {

            addTask($companies[$i]["id"]);

        }

    }


}


function addTask(int $companyId)
{


    $link = "https://{$_ENV["SUBDOMAIN"]}.amocrm.ru/api/v4/tasks";

    $queryData = array(
        [
            "text" => "У компании стоит больше одного тега, оставьте один",
            "entity_id" => $companyId,
            "complete_till" => 0,
            "entity_type" => "companies"

        ]
    );
    connect($link, 'POST', $queryData);

}

Функция коннект, которая отвечает за коннект к crm:

function connect(string $link, $method = 'GET', array $queryData = []): string
{

    $tokens = file_get_contents(ROOT . "/Tokens.json");
    $tokens = json_decode($tokens, true);

    $headers = [
        "Authorization: Bearer " . $tokens[0]["aToken"]
    ];


    $curl = curl_init();

    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_URL, $link);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl, CURLOPT_HEADER, false);


    if ($method === 'POST') {
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
        curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($queryData));

    } else if ($method === 'PATCH') {
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PATCH");
        curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($queryData));

    }

    try {

     

        $out = curl_exec($curl);
        $code = curl_getinfo($curl, CURLINFO_HTTP_CODE);

        curl_close($curl);


        $code = (int)$code;
        $errors = [
            400 => 'Bad request',
            401 => 'Unauthorized',
            403 => 'Forbidden',
            404 => 'Not found',
            500 => 'Internal server error',
            502 => 'Bad gateway',
            503 => 'Service unavailable'
        ];

        if ($code < 200 || $code > 204) {
            throw new Exception(isset($errors[$code]) ? $errors[$code] : 'Undefined error', $code);
        } else {
            return $out;
        }
    } catch (Exception $e) {

        $refreshTokens = getTokens();

        $tokens[0]["aToken"] = $refreshTokens["access_token"];
        $tokens[0]["rToken"] = $refreshTokens["refresh_token"];

        $tokens = json_encode($tokens, JSON_UNESCAPED_UNICODE);
        file_put_contents(ROOT . "/Tokens.json", $tokens);

        return connect($link, $method, $queryData);


    }


}


Я ставил sleep(1); перед коннектом, в другие места, ничего не помогло, все равно учетка блокируется, подскажите как там правильно делать?
  • Вопрос задан
  • 56 просмотров
Пригласить эксперта
Ответы на вопрос 1
Ash22
@Ash22
разработчик CRM
видел хороший пример https://github.com/mobilon-dev/amotop/blob/main/sa...
просто между функциями delay добавляют по полсекунды
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы