Как начать работу с amoCRM - vorst.ru

amoCRM


Как получить данные из amoCRM

Использование стороннего сервиса может существенно облегчить разработку сайта. Одним из таких сервисов, помогающих создавать сайты, является amoCRM. Пример подключения и использования amoCRM в проекте.

amoCRM

Как получить данные из amoCRM

Заказчик попросил вывести данные о сделках в таблицу в формате CSV. Данные должны быть максимально полными.

В том числе, необходимо вывести все возможные этапы сделки и даты, когда сделка переходила с этапа на этап. В amoCRM предусмотрена возможность определять этапы для каждой воронки продаж. Необходимо было, чтобы учитывались все этапы, всех воронок.

Ну и прочее - кто, когда, с кем, контакты клиента и, наконец, все комментарии к сделке.


На сайте amoCRM подробно описан порядок взаимодействия с системой. Приведены примеры кода и данных, полученных в результате работы.

Так как операции для разных таблиц однотипны, то и примеры похожи. И первое, что приходит в голову - надо что-то придумать, чтобы не копипастить код.

Сначала был написан класс amoREST.php, который может пройти авторизацию и получить результаты выбранного действия (GET-запроса). Результат можно посмотреть на GitHub.

Далее был написан класс amoTable.php, который, используя класс amoREST.php получает все необходимые данные из системы и формирует строки таблицы.

require(dirname(__FILE__) . '/amoREST.php');
class amoTable {
    const DELIMITER = "\t";
    const BATCH_SIZE = 100;
    // needed data for making a table
    public $account;
    public $leads;
    public $events;
    public $notes;
    ...
    public function __construct($config)
    {
        $maxrows = $config['limit_rows'];
        $offset = $config['limit_offset'];
        $amo = new amoREST(['account' => $config['account']]);
        $this->amo = $amo;
        if($amo->auth($config['email'], $config['api_key'])) {
            // account
            $response = $amo->get('accounts/current');
            $this->account = $response['account'];
            // leads
            $response = $amo->get('leads/list', [
                'limit_rows' => $maxrows,
                'limit_offset' => $offset,
            ]);
            $this->leads = $response['leads'];
            ...
    }
    /*
     * CSV table maker
     */
    public function make()
    {
        // Make a table
        foreach($this->leads as $lead) {
        ...
    }

После получения порции строк о сделках (leads), нужно запросить данные о сделках в связанных таблицах по коду сделки (lead ID). Посылать запрос с каждым ID никак нельзя - это сильно тормозит систему. Но можно сформировать пакет из нескольких ID.

    /*
     * Batch request with multiple ids. One request for BATCH_SIZE ids.
     * @param array source - it's ids we are going to find
     * @param string id_attribute - name of id attribute
     * @param string action - get request
     * @param array params - additional params for the request
     * @param string param - what we are looking for
     * @param string response_attribute - part of the response (array) that we need
     * @return array requested data
     */
    public function getBatch($source, $id_attribute, $action, $params, $param, $response_attribute) {
        $i = $j = 0; $ids = $a = []; $c = count($source);
        foreach($source as $item) {
            $ids[] = $item[$id_attribute]; $i++; $j++;
            if($i == self::BATCH_SIZE || $j == $c) {
                $params[$param] = $ids;
                $response = $this->amo->get($action, $params);
                    foreach($response[$response_attribute] as $row)
                        $a[] = $row;
                    $i = 0; $ids = [];
            }
        }
        return $a;
    }

Например, для получения всех событий и заметок, закрепленных за выбранными сделками, код будет следующим

class amoTable {
    ...
    public function __construct($config)
    {
            ...
            $this->leads = $response['leads'];
            // get events, notes
            $a = $this->getBatch($this->leads, 'id', 'notes/list', 
                ['type' => 'lead'], 'element_id', 'notes');
            ...

Теперь остается положить в каталог файл index.php примерно следующего содержания

require(dirname(__FILE__) . '/amoTable.php');
$amoTable = new amoTable([
    'account' => 'your-amoCRM-account',
    'email' => 'registered-email', 
    'api_key' => 'your-api-key',
    'limit_rows' => getParam('maxleads', 500),
    'limit_offset' => getParam('offset', 0),
]);
$f = fopen('amo.csv', 'w');
foreach($amoTable->make() as $line)
    fwrite($f, "$line\n");
fclose($f);
echo "Fine! Please, check amo.csv file.";
function getParam($var, $default) {
    return isset($_GET[$var]) ? $_GET[$var] : $default;
}

Заключение

Если у вас есть тестовый аккаунт на amoCRM.ru, вы можете посмотреть вид получаемого отчета на странице примеров sample.vorst.ru.

Оставьте комментарий