Удаление дублей контактов в 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 мы не стали, поскольку он не настолько сложен, что бы при желании можно было разобраться самостоятельно.
Для определения уникальности контакта можно, использовать хеш любой комбинации его полей. В зависимости от ваших потребностей. Скачать исходные коды можно здесь.

08.09.2017 @ 7:54 пп
Перестал работать скрипт(( Authorisation error
10.09.2017 @ 6:30 пп
Да, надо переделывать.