Coder Social home page Coder Social logo

drillcoder / amocrm_wrap Goto Github PK

View Code? Open in Web Editor NEW
34.0 8.0 12.0 182 KB

✅ Обёртка для простого взаимодействия с Api AmoCRM

License: MIT License

PHP 100.00%
amocrm api-amocrm api api-client api-wrapper drillcoder amo php crm

amocrm_wrap's Introduction

Обёртка для простого взаимодействия с Api AmoCRM

Build Status Latest Stable Version Total Downloads License

Подключение

Перед использованием обёртки, нужно подключить файл автозагрузки классов 'autoload.php'. Путь к файлу конечно же может отличаться от примера ниже. Или вы можете включать этот компонент в свой автозагрузчик.

<?php require_once 'AmoCRM_Wrap/autoload.php'; ?>

Использование

Для начала нужно произвести авторизацию. Для этого создаётся экземпляр класса AmoCRM в конструктор которого необходимо передать:

  1. Субдомен црм
  2. Логин юзера(почта)
  3. API ключ пользователя. Его вы можете найти в интерфейсе црм https://test.amocrm.ru/settings/profile/
  • 'test' нужно заменить на свой поддомен

Так как в обёртке предусмотрены Исключения (Exception) которые вызываются в случаях всевозможных ошибок, то их необходимо олавливать т.е. весь код работы с обёрткой следует помещать в try catch.

Пример авторизации:

<?php
try {
    $amo = new \DrillCoder\AmoCRM_Wrap\AmoCRM('test', '[email protected]', '011c2d7f862c688286b43ef552fb17f4');
    // ...
} catch (\DrillCoder\AmoCRM_Wrap\AmoWrapException $e) {
    die($e->getMessage());
}
?>

Возможности

  • Создание полного бэкапа црм, даже при отсутствии такой опции в тарифе
  • Поиск контакта по телефону или почте. Даный метод можно использовать для поиска дублей
  • Поиск по произвольному запросу среди Контактов, Компаний, Сделок, Примечаний и Задач
  • Получение списка любых сущностей с различной фильтрацией
  • Создание, изменение и удаление контактов, сделок, компаний, заметок и задач
  • Прикрепление к контактам, сделкам и компаниям файлов, заметок и задач
  • Удобная работа с доп полями, без знания их id
  • Назначение ответственных без id по имени или части имени пользователя в црм
  • На все запросы возвращается не огромный масив с данными, а удобные для работы объекты (Contact, Lead и тп)

В ближайших плана

  • Возможность развёртования бэкапа
  • Добавлени возможности работы с новыми сущностями (Покупатели и тп)
  • Добавление валидации к заданиям значений в пользовательским полям

Благодарности

  • Владислав Алаторцев — За уникальные методы прикрепления файлов и удаления сущностей а так же работе без возможности создания файла для хранения куки
  • Роман Маслеников — За поиски и исправление багов

Описание методов основных классов

Класс AmoCRM

  • AmoCRM::VERSION — Текущая версия обёртки
  • AmoCRM::getPhoneFieldId() — Возвращает id поля телефона у сущности Контакт
  • AmoCRM::getEmailFieldId() — Возвращает id поля почты у сущности Контакт
  • AmoCRM::getUsers() — Возвращает массив пользователей в црм
  • AmoCRM::getTaskTypes() — Возвращает массив типов задач
  • AmoCRM::getPipelinesName() — Возвращает массив воронок в црм
  • AmoCRM::getStatusesName($pipelineId) — Возвращает массив статусов в указанной воронке (нужен id воронки)
  • AmoCRM::getCustomFields($type) — Возвращает массив пользовательских полей у заданного типа сущности. Возможные типы: contact, lead, company
  • AmoCRM::getCustomFieldsEnums($type) — Возвращает массив enums пользовательских полей у заданного типа сущности
  • searchContactsByPhoneAndEmail($phone, $email) — Поиск по контактам без учета формата телефона. Телефоны начинающиеся с 7 или 8 считает разными. Возвращяет массив из объектов Contact, где ключи id контактов

Поиск по Контактам, Компаниям, Сделкам, Задачам и Примечаниям ко всем сущностям отдельно

  • searchContacts/searchCompanies/searchLeads/searchTasks
  • getContactNotes/getCompanyNotes/getLeadNotes/getTaskNotes ($query = null, $limit = 0,$offset = 0, $responsibleUsersIdOrName = array(), DateTime $modifiedSince = null, $isRaw = false) — Поиск по заданным сущностям. Все поля не обязательны. Если ничего не задано, то вернется полный список всех сущностей. $query - текст запроса. $limit - количество сущностей в ответе. 0 = без ограничения $offset - пропуск количества сущностей от начала $responsibleUsersIdOrName - ответственные юзеры (имя или id). Если несколько то в массиве $modifiedSince - измененный после даты и время заданным объектом DateTime $isRaw - флаг получить "сырые" данные. Массивом как при обычном запросе к апи

Важно!!! Все списки сортируются от самого ранее изменённого. Сортировку поменять нельзя =(

  • backup($directory) — Создаёт полный бэкап всей црм в директории $directory. Возможны проблемы с лимитом памяти

Абстрактный класс BaseEntity

На этом классе базируются все другие основные классы. Все методы присутствующие в нём можно использовать в других классах.

  • __construct($id = null) — Метод вызываемый при создании экземпляра класса. Можно передать id нужной сущность и тогда произойдёт загрузка данный из црм. Если не передавать id то будет создан пустой объект
  • getRaw() — Получить сырые данные на основе сущности
  • save() — Сохраняет текущую сущность в црм
  • delete() — Удаляет текущую сущность в црм
  • getId() — Возвращает id сущность
  • getName() — Возвращает имя сущности
  • setName($name) — Изменяет имя на $name
  • getResponsibleUserId() — Возвращает id ответственного за сущность
  • getResponsibleUserName() — Возвращает имя ответственного за сущность
  • setResponsibleUser($responsibleUserIdOrName) — Устанавливает ответственного за сущность. Принимает либо id ответственного либо его имя (ищет эту строку во всех именах всех менеджеров црм)
  • getDateCreate() — Возвращает объект DateTime с датой и временем создания сущность
  • getDateUpdate() — Возвращает объект DateTime с датой и временем последнего изменения сущность
  • getUserIdUpdate() — Возвращает id человека который последний раз изменял сущность
  • getUserNameUpdate() — Возвращает имя человека который последний раз изменял сущность
  • getCreatedUserId() — Возвращает id человека создавшего сущность
  • getCreatedUserName() — Возвращает имя человека создавшего сущность
  • getLeadsId() — Возвращает массив из id прикреплённых сделок
  • getLeads() — Возвращает массив объектов Lead прикреплённых сделок
  • addLead($lead) — Прикрепляет к сущность сделку
  • delLead($lead) — Открепляет сделку от сущность
  • getContactsId() — Возвращает массив из id прикреплённых контактов
  • getContacts() — Возвращает массив объектов Contact прикреплённых контактов
  • addContactId($contact) — Прикрепляет к сущность контакт
  • delContactId($contact) — Открепляет контакт от сущность
  • getCompanyId() — Возвращает id компании к которой привязана сущность
  • getCompany() — Возвращает объект Company компании к которой привязана сущность
  • setCompany($company) — Устанавливает компанию к которой будет привязана сущность
  • getTags() — Возвращает ассоциативный массив тэгов id => name
  • addTag($tag) — Добавляет тэг к сущности
  • delTag($tag) — Удаляет тэг у сущности
  • getPhones() — Возвращает нумерованый массив телефонов
  • addPhone($phone, $enum = CustomField::PHONE_OTHER) — Добавляет телефон к сущности, не обязательны пораметр тип телефона, по умолчанию "Другой". Проверяет имеется ли уже такой телефон у сущности и не добавляет дубликат. Возможные варианты типов телефона находятся в константах CustomField::PHONE__
  • delPhone($phone) — Удаляет телефон у сущности. Не учитывает формат телефона. Учитывает начинается телефон с 7 или 8
  • getEmails() — Возвращает нумерованый массив email'ов
  • addEmails($email, $enum = CustomField::EMAIL_OTHER) — Добавляет почту к сущности, не обязательны пораметр тип почты, по умолчанию "Другой". Проверяет имеется ли уже такая почта у контакт и не добавляет дубликат. Возможные варианты типов почт находятся в константах CustomField::Email_
  • delEmail($email) — Удаляет почту у сущности
  • addCustomField($name, $type = CustomField::TYPE_TEXT, $enums = array()) — Создаёт кастомное поле у текущего типа сущности с именем $name типом $type и если необходимо вариантами $enums. Возвращает id созданого поля. Типы полей храняться в CustomField::TYPE_
  • delCustomField($nameOrId) — Удаляет кастомное поле у текущего типа сущности, принимает как id поля так и его имя
  • getCustomFieldValueInStr($nameOrId) — Возвращает значение кастомного поля в виде строки. Принимает его имя или id. Разделитель значений точка с запятоу (;)
  • getCustomFieldValueInArray($nameOrId) — Возвращает значение кастомного поля в виде массива. Принимает его имя или id
  • setCustomFieldValue($customFieldNameOrId, $value, $subtype = null) — Задаёт значение кастомного поля. Первым аргументов можно передать как id поля, так и его название в црм. Если не передавать значение ($value) или задать его пустым, то при сохранении поле в црм так же будет очищено. В поле типа мультисписок значения вносятся массивом. Для типа адрес так же требуеться $subtype типы которого храняться в Value::SUBTYPE_
  • addNote($text) — Добавляет примичание для текущей сущности
  • addNoteSystem($text, $serviceName) — Добавляет системное(не удаляемое) примечание для текущей сущности
  • addNoteSmsOut($text, $phone) — Добавляет примечание для текущей сущности типа Исходящее смс (на номер $phone)
  • addNoteSmsIn($text, $phone) — Добавляет примечание для текущей сущности типа Входящее смс (с номера $phone)
  • addTask($text, $responsibleUserIdOrName = null, DateTime $completeTill = null, $typeId = 3) — Добавляет задачу для текущей сущности. $text - текст задачи. $responsibleUserIdOrName(не обязательный) - ответственный, принимает как id так и имя, если не установлен то ответственный тот же что и у текущей сущность. $completeTill(не обязательный) - дата и время, в виде объекта класса DateTime, до которого нужно завершить задачу, если не указан то время устанавливается текущее. $typeId(не обязательный) - тип задачи см. варианты в црм, если не установлен принимает тип 3 - письмо.
  • addFile($pathToFile) — прикрепляет файл к сущность (Сделка, Контакт или Компания). $pathToFile - путь до файла

Классы Contact и Company

Все методы базовые

Класс Lead

  • getSale() — Возвращает бюджет
  • setSale($sale) — Задаёт бюджет
  • getPipelineId() — Возвращает id воронки
  • getPipelineName() — Возвращает название воронки
  • getStatusId() — Возвращает id статуса
  • getStatusName() — Возвращает название статуса
  • setPipeline($idOrNamePipeline) — Задаёт воронку. Принимает id либо название
  • setStatus($idOrNameStatus, $idOrNamePipeline = null) — Задаёт статус в воронке $idOrNamePipeline, если не указано в текущей. Принимает id либо название из црм, как воронки так и статуса
  • getMainContactId() — Возвращает id основного контакта
  • getMainContact() — Возвращает объект Contact основного контакта
  • setMainContact($contact) — Задаёт основной контакт
  • isClosed() — Возвращает true если сделка закрыта и false в противном случае

Класс Note и Task

  • getElementId() — Возвращает id сущности к которой будет привязана заметка или задача
  • setElementId($elementId) — Задаёт id сущности к которой будет привязана заметка или задача
  • getElementType() — Возвращает тип сущности к которой будет привязана заметка или задача

Возможные значения: 1 - Контакт, 2 - Сделка, 3 - Компания, 4 - Результат задачи

  • setElementType($elementType) — Устанавливает тип сущности к которой будет привязана заметка или задача. Воможные варианты таке же как выше
  • getType() — Возвращает тип задачи или заметки
  • setType($type) — Задаёт тип задачи или заметки. Варианты см. в црм
  • getText() — Возвращает текст задачи или заметки
  • setText($text) — Задаёт текст задачи или заметки

Класс Unsorted

  • new Unsorted($formName, $lead, $contacts, $pipelineIdOrName = null, $companies = array()) — Создание объекта $formName - название формы которое будет отображаться в интерфейсе црм. $lead - сделка котороя будет создана после принятия заявки в "неразобранном". $contacts - массив объектов Contact которые будут созданы и привязаны к сделки после принятия заявки в "неразобранном". $pipelineIdOrName - Воронка в которой будет создана заявка, необязательный параметр. $companies - необязательный параметр, массив объектов Company которые будут созданы и привязаны к сделки после принятия заявки в "неразобранном"
  • addNote($text) — Добавляет текстовую заметку для сделки. Необходимо использовать перед сохранением
  • save() — Сохраняет "неразобранное" в црм

Классы хэлперы Config, CustomField, Value, Note и Task

Созданы как вспомогательные по этому описывать их не буду)

Примеры

Поиск, изменение и сохранение контакта в црм

<?php
try {
    $amo = new \DrillCoder\AmoCRM_Wrap\AmoCRM('test', '[email protected]', '011c2d7f862c688286b43ef552fb17f4');
    $contacts =  $amo->searchContactsByPhoneAndEmail('79998887766', '[email protected]'); //Ищем контакт по телефону и почте
    $contact = current($contacts); //Берём первый найденый контакт
    $contact->setName("{$contact->getName()} лучший") //Меняем имя дописывая в текущее строчку
            ->addPhone('78889998887766', 'MOB') //Добавляем мобильный телефон
            ->addEmail('[email protected]', 'WORK') //Добавляем рабочую почту
            ->delEmail('[email protected]') //Удаляем почту
            ->setResponsibleUser('Пётр Иванович') //Меняем ответственного
            ->save() //Сохраняем все изменение на сервере црм
            ->addTask('Позвонить клиенту', 'Саша'); //Прикрепляем задачку, и назначаем ответственным за неё Сашу
} catch (\DrillCoder\AmoCRM_Wrap\AmoWrapException $e) {
    die($e->getMessage()); //Прерывем работу скрипта и выводим текст ошибки
}
?>

Создание сделки с примечанием и двумя привязанными контактами в "Неразобранном" в вороке "Вторые продажи"

<?php
try {
    $amo = new \DrillCoder\AmoCRM_Wrap\AmoCRM('test', '[email protected]', '011c2d7f862c688286b43ef552fb17f4');
    $contact = new \DrillCoder\AmoCRM_Wrap\Contact();
    $contact->setName('Петя')
            ->addPhone(79998887766); //Создаём контакт, который будет создан в црм после принятия заявки в неразобранном
    $contact2 = new \DrillCoder\AmoCRM_Wrap\Contact();
    $contact2->setName('Ваня')
             ->addPhone(79998887755); //Создаём второй контакт
    $lead = new \DrillCoder\AmoCRM_Wrap\Lead();
    $lead->setName('Тестовая сделка')
         ->setSale(2500); //Создаём сделку, которая будет создана в црм после принятия заявки в неразобранном
    $unsorted = new \DrillCoder\AmoCRM_Wrap\Unsorted('Супер-Форма', $lead, array($contact, $contact2), 'Вторые продажи');
    $unsorted->addNote('Клиент сложный')
             ->save(); // Сохраняем всё в неразобранное в црм
} catch (\DrillCoder\AmoCRM_Wrap\AmoWrapException $e) {
    die($e->getMessage()); //Прерывем работу скрипта и выводим текст ошибки
}
?>

Реализация стандартной логики интеграции Ройстат и AmoCRM

Плюсом небольшая фишка с дозаполнением данными контакта

<?php
//Тестовые данные
$form = 'Заказать звонок';
$name = 'Тест';
$phone = '+7(999)888-77-66';
$email = '[email protected]';
$responsibleUserId = 'Александр';
$comment = 'Срочно перезвонить!';

try {
    $amo = new \DrillCoder\AmoCRM_Wrap\AmoCRM('test', '[email protected]', '8a66666666b3494179da07abc74bfd49');
    $lead = new \DrillCoder\AmoCRM_Wrap\Lead();
    $lead->setName("Заявка с формы '$form'")
         ->setCustomFieldValue('roistat', isset($_COOKIE['roistat_visit']) ? $_COOKIE['roistat_visit'] : null)
         ->setCustomFieldValue('roistat-marker', isset($_COOKIE['roistat_marker']) ? $_COOKIE['roistat_marker'] : 'Прямой визит')
         ->setCustomFieldValue('Форма захвата', $form)
         ->setCustomFieldValue('utm_source', $_COOKIE['utm_source'])
         ->setCustomFieldValue('utm_medium', $_COOKIE['utm_medium'])
         ->setCustomFieldValue('utm_campaign', $_COOKIE['utm_campaign'])
         ->setCustomFieldValue('utm_term', $_COOKIE['utm_term'])
         ->setCustomFieldValue('utm_content', $_COOKIE['utm_content'])
         ->setResponsibleUser($responsibleUserId)
         ->save()
         ->addNote($comment);
    $contacts = $amo->searchContactsByPhoneAndEmail($phone, $email);
    if (!empty($contacts)) {
        $contact = current($contacts);
    } else {
        $contact = new \DrillCoder\AmoCRM_Wrap\Contact();
        $contact->setName($name);
    }
    $contact->addPhone($phone)
            ->addEmail($email)
            ->addLead($lead)
            ->save();
} catch (\DrillCoder\AmoCRM_Wrap\AmoWrapException $e) {
    echo $e->getMessage();
}?>

amocrm_wrap's People

Contributors

aforkfreeman avatar drillcoder avatar xaaalera avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

amocrm_wrap's Issues

setCustomField Мультисписок не записывает значение

`620191
Array
(
[0] => DrillCoder\AmoCRM_Wrap\Helpers\Value Object
(
[value:DrillCoder\AmoCRM_Wrap\Helpers\Value:private] => Элита
[enum:DrillCoder\AmoCRM_Wrap\Helpers\Value:private] => 0
[subtype:DrillCoder\AmoCRM_Wrap\Helpers\Value:private] =>
)

)

Сегмент`
Лог перед $customFieldObj = new CustomField($id, $valueObj, $name);
Похоже enum id не определяется.
И тут опечатка " В поле типа мультисписок значения вносятся с разделителем точка с запятоу (;)"

Как работать с бекапом?

Есть ли методы по работе с файлами бекапа? К примеру взять контакты из бекапа и работать с ними как с объектами?

Отсутствует исключение при ошибке выполнения curl_exec

В коде отсутствует обработка ошибок curl:

AmoCRM_Wrap/src/Base.php

Lines 88 to 89 in d49e41b

$json = curl_exec($curl);
curl_close($curl);

Если запрос вообще не выполнится, то сработает исключение Не удалось авторизоваться. Что бы при этом понять реальную причину, необходимо отлаживать весь код по стеку.

Не работает сохранение из примера

<?php
try {
    $amo = new \DrillCoder\AmoCRM_Wrap\AmoCRM('test', '[email protected]', '011c2d7f862c688286b43ef552fb17f4');
    $contact = new \DrillCoder\AmoCRM_Wrap\Contact();
    $contact->setName('Петя')
            ->addPhone(79998887766); //Создаём контакт, который будет создан в црм после принятия заявки в неразобранном
    $contact2 = new \DrillCoder\AmoCRM_Wrap\Contact();
    $contact2->setName('Ваня')
             ->addPhone(79998887755); //Создаём второй контакт
    $lead = new \DrillCoder\AmoCRM_Wrap\Lead();
    $lead->setName('Тестовая сделка')
         ->setSale(2500); //Создаём сделку, которая будет создана в црм после принятия заявки в неразобранном
    $unsorted = new \DrillCoder\AmoCRM_Wrap\Unsorted('Супер-Форма', $lead, array($contact, $contact2), 'Вторые продажи');
    $unsorted->addNote('Клиент сложный')
             ->save(); // Сохраняем всё в неразобранное в црм
} catch (\DrillCoder\AmoCRM_Wrap\AmoWrapException $e) {
    die($e->getMessage()); //Прерывем работу скрипта и выводим текст ошибки
}
?>

Не удалось сохранить заявку в неразобранное

Array
(
    [add] => Array
        (
            [0] => Array
                (
                    [source_name] => DrillCoder AmoCRM Wrap
                    [created_at] => 1549406707
                    [pipeline_id] => 1336960
                    [incoming_entities] => Array
                        (
                            [leads] => Array
                                (
                                    [0] => Array
                                        (
                                            [pipeline_id] => 
                                            [sale] => 2500
                                            [status_id] => 
                                            [name] => Тестовая сделка
                                            [tags] => 
                                            [created_by] => 0
                                            [notes] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [element_id] => 
                                                            [element_type] => 0
                                                            [note_type] => 4
                                                            [text] => Клиент сложный
                                                            [created_by] => 0
                                                            [params] => Array
                                                                (
                                                                    [text] => Клиент сложный
                                                                    [service] => 
                                                                    [phone] => 
                                                                )

                                                            [tags] => 
                                                        )

                                                )

                                        )

                                )

                            [contacts] => Array
                                (
                                    [0] => Array
                                        (
                                            [name] => Петя
                                            [tags] => 
                                            [created_by] => 0
                                            [custom_fields] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [id] => 200757
                                                            [values] => Array
                                                                (
                                                                    [0] => Array
                                                                        (
                                                                            [enum] => 409593
                                                                            [value] => 79998887766
                                                                            [subtype] => 
                                                                        )

                                                                )

                                                        )

                                                )

                                        )

                                    [1] => Array
                                        (
                                            [name] => Ваня
                                            [tags] => 
                                            [created_by] => 0
                                            [custom_fields] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [id] => 200757
                                                            [values] => Array
                                                                (
                                                                    [0] => Array
                                                                        (
                                                                            [enum] => 409593
                                                                            [value] => 79998887755
                                                                            [subtype] => 
                                                                        )

                                                                )

                                                        )

                                                )

                                        )

                                )

                            [companies] => Array
                                (
                                )

                        )

                    [incoming_lead_info] => Array
                        (
                            [form_id] => 25
                            [form_page] => Супер-Форма
                        )

                )

        )

)
stdClass Object
(
    [error] => Wrong request
)

Метод delTag кривой

При использовании, если тэг найден, выдаёт ошибку что не найден и наоборот...
Оригинал:

    public function delTag($tag)
    {
        $key = array_search($tag, $this->tags);
        if ($key !== false) {
            unset($this->tags[$key]);
            throw new AmoWrapException('Тэг не найден');
        }
        return $this;
    }

FIX:

    public function delTag($tag)
    {
        $key = array_search($tag, $this->tags);
        if ($key == false) {
            throw new AmoWrapException('Тэг не найден');
        }
        unset($this->tags[$key]);
        return $this;
    }

Ошибка AmoCRM.php

Добрый день!
При использовании вашей обёртки возникает след. ошибка:
Parse error: syntax error, unexpected '[' in AmoCRM_Wrap/src/AmoCRM.php on line 748

В зависимости от версии обёртки.
В 748 строке кода файла AmoCRM.php находится след. строка кода:
$url = 'api/v2/' . (Config::$$attribute)['url'] . '?';

Подскажите, как исправить или что я делаю не так?

Спасибо.

drillcoder/amocrm_wrap 7.0 requires ext-curl >=7.34 -> the requested PHP extension curl has the wrong version (7.2.5) installed

php 7.2-fpm
php -r "print_r(curl_version());"

(
    [version_number] => 472065
    [age] => 3
    [features] => 4179869
    [ssl_version_number] => 0
    [version] => 7.52.1
    [host] => x86_64-pc-linux-gnu
    [ssl_version] => OpenSSL/1.0.2l
    [libz_version] => 1.2.8
    [protocols] => Array
        (
            [0] => dict
            [1] => file
            [2] => ftp
            [3] => ftps
            [4] => gopher
            [5] => http
            [6] => https
            [7] => imap
            [8] => imaps
            [9] => ldap
            [10] => ldaps
            [11] => pop3
            [12] => pop3s
            [13] => rtmp
            [14] => rtsp
            [15] => scp
            [16] => sftp
            [17] => smb
            [18] => smbs
            [19] => smtp
            [20] => smtps
            [21] => telnet
            [22] => tftp
        )

)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.