Мне надо пройтись по компаниям, компаний 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); перед коннектом, в другие места, ничего не помогло, все равно учетка блокируется, подскажите как там правильно делать?