Интеграция node js с amoCrm


Авторизируемся и отправляем лиды в amoCrm при помощи Node.js

С официальной документацией по api amoCrm можно ознакомиться по ссылке:

https://www.amocrm.ru/developers/content/platform/abilities/

Все методы можно протестировать здесь https://www.amocrm.ru/developers/console/. Если у Вас что-то не получается, попробуйте сформировать запрос через консоль, предоставленную разработчиками amoCrm, и сравнить тело запроса с тем, которое пытаетесь отправить Вы.

Авторизация

Для авторизации Вам понадобится api ключ. Найти его можно в лично кабинете. Выглядеть он будет примерно так: "cda34df432332ac00123e4da3be34fds342342fsd"

Далее необходимо сформировать POST запрос на url yourhostname.amocrm.ru/private/api/auth.php?type=json, где yourhostname - имя поддомена на amocrm. Тело запроса должно содержать поля USER_LOGIN (ваш логин на amoCrm) и USER_HASH (api ключ), также нужно обратить внимание, что после успешной авторизации для последующих запросов нужно будет передавать cookie, так что сохраняем их.

var https = require('https');
/**
 * Тело запроса
 */
function login() {
  return new Promise(function(resolve, reject) {
    var body = {
      USER_LOGIN: 'test@test.ru',
      USER_HASH: 'cda34df432332ac00123e4da3be34fds342342fsd',
    };

    var cookieForAmoCrm = [];

    /**
     * Преобразуем объект в строку
     */

    body = JSON.stringify(body);

    var options = {
      host: "yourhostname.amocrm.ru",
      path: "/private/api/auth.php?type=json",
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      }
    };

    var request = https.request(options, function(response) {
      /**
       * Срабатывает в момент ответа
       */
      response.on('data', function (chunk) {
        /**
         * Парсим ответ
         * @type {any}
         */
        var responseObj = JSON.parse(chunk);

        if (response.statusCode == 200) {
          /**
           * Сохраняем cookie
           */
          cookieForAmoCrm = response.headers['set-cookie'];
          return resolve(responseObj);
        } else {
          return reject(responseObj);
        }
      });
    })

    request.write(body);
    /**
     * заканчиваем формирование запроса и отсылаем запрос
     */
    request.end();

  })
}

login().then(function() {
  console.log('success')
}, function(err) {
  console.log('error');
})

Авторизация выполнена, сессия длится 15 минут, так что следует после успешной авторизации запустить таймер с интервалом, меньшим, чем время длительности сессии и снова повторить тот же запрос, что и на авторизацию. Реализация с кроном с интервалом в 10 минут

new CronJob('*/10 * * * *', function () {
  login().then(function() {
    console.log('reconnected to amoCrm');
  }, function(err) {
    console.log('cant reconnect to amoCrm')
  })
}, null, true, 'Europe/Moscow');

Авторизовавшись, нам становятся доступны все методы api

Создание сделки

Для создания простейшей сделки нам потребуется совершить POST запрос на yourhostname.amocrm.ru/private/api/v2/leads с полем add - массив сделок, которые мы хотим добавить, поле name (название сделки) обязательное, sale - бюджет сделки

function createLead() {
  return new Promise(function(resolve, reject) {
    var body = {
      add: [
        {
          name: 'Тестовая сделка',
          created_at: '2018-09-14T11:26:02.999Z',
          updated_at: '2018-09-14T11:26:02.999Z',
          sale: '5000'
        },
      ]
    };
    body = JSON.stringify(body);
    var options = {
      host: 'yourhostname.amocrm.ru',
      path: '/api/v2/leads',
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Cookie': cookieForAmoCrm
      }
    };

    var request = https.request(options, function(response) {
      /**
       * Срабатывает в момент ответа от танкера
       */
      response.on('data', function (chunk) {

        var responseObj = JSON.parse(chunk);

        if (response.statusCode == 200) {
          return resolve(responseObj);
        } else {
          return reject(responseObj);
        }
      });
    })
    request.write(body);
    /**
     * отсылаем запрос
     */
    request.end();
  })
}
createLead().then(function() {
  console.log('success');
}, function() {
  console.log('error');
})

Добавление дополнительного поля

Для большей гибкости в amoCrm если возможность добавлять дополнительные поля для сделки, например, следует прикрепить ссылку к сделке.

Для этого создадим дополнительное поле "Фотография". Name - обязательный параметр, type - тип поля (в нашем случае URL, список доступных типов можно увидеть здесь https://www.amocrm.ru/developers/content/api/custom_fields), поле origin - идентификатор для последующего удаления поля.

function  createCustomProperty() {
  return new Promise(function(resolve, reject) {
    var body = {
      add: [
        {
          name:  'Фотография',
          type: '7',
          origin: 'image',
        }
      ]
    };
    body = JSON.stringify(body);
    var options = {
      host: 'yourhostname.amocrm.ru',
      path: '/api/v2/fields',
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Cookie': cookieForAmoCrm
      }
    };

    var request = https.request(options, function(response) {
      /**
       * Срабатывает в момент ответа от танкера
       */
      response.on('data', function (chunk) {

        var responseObj = JSON.parse(chunk);

        if (response.statusCode == 200) {
          return resolve(responseObj);
        } else {
          return reject(responseObj);
        }
      });
    })
    request.write(body);
    /**
     * заканчиваем формирование запроса и отсылаем запрос
     */
    request.end();
  })
}
createCustomProperty().then(function(response) {
  console.log(response);
}, function() {
  console.log('error');
})

В ответе мы увидим что-то подобное:

{
  "_links": {
    "self": {
      "href": "/api/v2/fields","method":"post"
    }
  },
  "_embedded": {
    "items": [{
      "id":578725,
      "request_id":0,
      "_links": {
        "self": {
          "href":"/api/v2/fields?id=578725",
          "method":"get"
        }
      }
    }]
  }
}

Нас интересует поле id: 578725, данный id будет использоваться для задания значения полю в сделке.

Теперь создадим новую сделку с дополнительным полем "Фотография".

Все будет выглядеть так же, как и в пункте "создание сделки" за исключением тела запроса, оно будет выглядеть так:

var body = {
  add: [
    {
      name: 'Сделка с дополнительным полем',
      created_at: '2018-09-14T11:26:02.999Z',
      updated_at: '2018-09-14T11:26:02.999Z',
      sale: '2000',
      custom_fields: [
        {
          "id": "578725",
          "values": [
            {
             "value": "https://www.amocrm.ru/developers/content/api/custom_fields"
            }
          ],
        }
      ],
    },
  ]
};

Таким образом вы можете задавать любые дополнительные поля для сделок.