Удаление дублей контактов в 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
admin
10.09.2017 @ 6:30 пп
Да, надо переделывать.