Удаление дублей контактов в AmoCRM

Исходя из моих наблюдений, более половины пользователей AmoCRM заботятся о виде структуры их списка контактов. В основном их беспокоит наличие дублей. У пользователей, которые пользуются AmoCRM уже достаточно продолжительное время и поток их клиентов (как старых, так и новых) достаточно велик, то рано или поздно их список контактов начинает изобиловать дублями. Причем дублей становится так много, что настает пора подумать о том, как бы от этого всего изобилия начать избавляться. Дело в том, что AmoCRM не позволяет произвести удаление карточек клиента через API. А значит, придется разработать модуль, позволяющий производить удаление контактов не используя API AmoCRM. В качестве языка программирования был выбран PHP. Но для того чтобы приступить к удалению, контакты следует получить и разделить их на дубли и уникальные.

Получение контактов

Для получения контактов, воспользуемся алгоритмом из примера, предоставленного в документации по работе с API AmoCRM. Только нам потребуется модифицировать данный пример, ведь для начала нужно пройти авторизацию. Для разделения контактов на дубли и уникальные, мы поступим следующим образом: создадим два массива: для уникальных контактов и дублей. При получении контакта будем получать хеш конкатенации имени контакта и номера телефона. Если полученный хеш отсутствует в массиве уникальных контактов, значит, добавляем его в этот массив. В ином случае добавляем в массив, для дублей полученный ранее хеш в качестве значения ключа и в качестве значения этого элемента массива присваиваем массив с идентификаторами контактов. К примеру, мы располагаем следующим списком контактов, структура которого представлена в табл. 1.

Таблица 1. Контакты

Id Имя Телефон
1284541 Дмитрий 7(001) 111-111-111
1338537 Дмитрий 7(001) 111-111-111
1284493 Иван 7(001) 123-123-123
1284501 Иван 7(001) 123-123-123
1284519 Иван 7(001) 123-123-123
1284485 Иван 7(001) 123-123-123

После обработки полученных контактов через API AmoCRM мы получим следующие два массива:

Идентификаторы контактов имеющих дубли
Array
(
    [f665f8442fbf0d040187d59c88ca0150] => Array
        (
            [0] => 1284493
            [1] => 1284501
            [2] => 1284519
        )

    [7beb4e216fc14635ba5071009109b063] => Array
        (
            [0] => 1284541
        )

)

Массив уникальных хешей контактов
Array
(
    [0] => f665f8442fbf0d040187d59c88ca0150
    [1] => 7beb4e216fc14635ba5071009109b063
)

Удаление контактов

Теперь у нас есть массив с идентификаторами контактов имеющих дубли. И мы можем приступить к их удалению. Результат работы выполнения скрипта:

Contacts with identifiers: [1284493,1284501,1284519] were removed
Contacts with identifiers: [1284541] were removed

Полный исходный код скрипта приведен ниже:

define ( 'ROOT_DIR', dirname ( __FILE__ ) );

define ( 'LOGIN', 'Ваш логин' );
define ( 'PASSWORD', 'Ваш пароль' );
define ( 'DOMAIN', 'Ваш домен' );
define ( 'API', 'API ключ' );

require_once (ROOT_DIR . '/amocrm.class.php');

// Дубли контактов
$contacts = array();
// Уникальные контакты
$unique_contacts = array();

$user = array('USER_LOGIN' => LOGIN, 'USER_HASH' => API);
$http_header = array('Content-Type: application/json');

$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl, CURLOPT_USERAGENT,'amoCRM-API-client/1.0');
$link = 'https://'.DOMAIN.'.amocrm.ru/private/api/auth.php?type=json';
curl_setopt($curl, CURLOPT_URL, $link);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($user));
curl_setopt($curl, CURLOPT_HTTPHEADER, $http_header);
curl_setopt($curl, CURLOPT_HEADER, false);
curl_setopt($curl, CURLOPT_COOKIEFILE, ROOT_DIR . '/cookie.txt');
curl_setopt($curl, CURLOPT_COOKIEJAR, ROOT_DIR. '/cookie.txt');
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);

$out = curl_exec($curl); 
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE); 
$response = json_decode($out, true);
$response = $response['response'];

if(isset($response['auth'])) {
	curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
	$link = 'https://'.DOMAIN.'.amocrm.ru/private/api/v2/json/contacts/';
	curl_setopt($curl,CURLOPT_URL, $link);
	$out = curl_exec($curl); 
	$code = curl_getinfo($curl, CURLINFO_HTTP_CODE); 

	$response = json_decode($out, true);
	$response = $response['response'];
	
	if(isset($response['contacts'])) {
		foreach ($response['contacts'] as $contact) {
			$custom_fields = end($contact['custom_fields']);
			$field = end($custom_fields['values']);
			/*
			* Получаем хеш из конкатенации
			* имени контакта и номера телефона
			*/
			$hash = md5($contact['name'] . $field['value']);
			
			/*
			* Если хеш есть в массиве, то
			* значит контакт является дублем
			*/
			if (in_array($hash, $unique_contacts)) {
				$contacts[$hash][] = $contact['id'];
			} else {
				$unique_contacts[] = $hash;
			}
		}
	}
} else {
	echo "API Authorisation error\n";
} 

curl_close($curl);

if ($contacts) {
	// Авторизуемся на сайте AmoCRM
	$amocrm = new amocrm(LOGIN, PASSWORD, DOMAIN);
	
	// Производим удаление контактов
	foreach ($contacts as $value) {
		$amocrm->DeleteContacts($value);
	}
}

Разбирать класс, используемый для работы с AmoCRM без API мы не стали, поскольку он не настолько сложен, что бы при желании можно было разобраться самостоятельно.

Для определения уникальности контакта можно, использовать хеш любой комбинации его полей. В зависимости от ваших потребностей. Скачать исходные коды можно здесь.