Python API for Amocrm


License
MIT
Install
pip install amocrm-api==2.6.1

Documentation

AmoCRM python API. V2

https://travis-ci.org/Krukov/amocrm_api.svg?branch=master

Python AmoCRM API v2 (http://www.amocrm.ru/) (human interface for easy using)

Installation

pip install amocrm_api

Usage

Авторизация

Авторизация - с Июня 2020 amoCRM форсировала смСну Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ с Ρ‚ΠΎΠΊΠ΅Π½Π° Π½Π° OAuth

И Π±Π΅Π· ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ server to server взаимодСйствия, Π² связи с Ρ‡Π΅ΠΌ тСкущая рСализация содСрТит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ограничСния

  1. Π’ Π»ΠΈΡ‡Π½ΠΎΠΌ ΠΊΠ°Π±ΠΈΠ½Π΅Ρ‚Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ
  2. Π Π΅Ρ„Ρ€Π΅Ρˆ Ρ‚ΠΎΠΊΠ΅Π½ ΠΎΠ΄Π½ΠΎΡ€Π°Π·ΠΎΠ²Ρ‹ΠΉ ΠΈ обновляСтся ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠΈ аксСсс Ρ‚ΠΎΠΊΠ΅Π½Π°
  3. EcΠ»ΠΈ запросы Π² amoCRM происходят Ρ€Π΅ΠΆΠ΅ Ρ‡Π΅ΠΌ врСмя ΠΆΠΈΠ·Π½ΠΈ Ρ€Π΅Ρ„Ρ€Π΅Ρˆ Ρ‚ΠΎΠΊΠ΅Π½Π° Ρ‚ΠΎ Π²Π°ΠΌ Π½Π΅ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ Ρ‚Π°ΠΊΠΎΠΉ Π²Π°Ρ€Π°Π½Ρ‚ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ
  4. Π’ΠΎΠΊΠ΅Π½Ρ‹ Π½ΡƒΠΆΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ, для этого Π΅ΡΡ‚ΡŒ api ΠΈ сущСствуСт 3 Ρ‚ΠΈΠΏΠ° Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° (ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ свой):
  • MemoryTokensStorage - Ρ…Ρ€Π°Π½ΠΈΡ‚ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ Π² памяти (Ссли Π²Ρ‹ пСрСзапускаСтС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ‚ΠΎ придСтся снова ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ refresh_token)
  • FileStorage - сохраняСт Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ Π² Ρ„Π°ΠΉΠ»Π΅
  • RedisTokensStorage - сохраняСт Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ Π² рСдисС (pip install redis) для new-age ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… экзСмплярах

Example:

from amocrm.v2 import tokens

tokens.default_token_manager(
    client_id="xxx-xxx-xxxx-xxxx-xxxxxxx",
    client_secret="xxxx",
    subdomain="subdomain",
    redirect_url="https://xxxx/xx",
    storage=tokens.FileTokensStorage(),  # by default FileTokensStorage
)
tokens.default_token_manager.init(code="..very long code...", skip_error=True)
  • ΠšΠΎΠ½Ρ‚Π°ΠΊΡ‚ - Contact
  • Компания - Company
  • Π’Π΅Π³ΠΈ - Tags
  • Π‘Π΄Π΅Π»ΠΊΠ° - Lead
  • Π—Π°Π΄Π°Ρ‡Π° - Task
  • ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ - Note
  • Π‘ΠΎΠ±Ρ‹Ρ‚ΠΈΠ΅ - Event
  • Π’ΠΎΡ€ΠΎΠ½ΠΊΠΈ ΠΈ Бтатусы - Pipeline, Status

Π Π°Π±ΠΎΡ‚Π° с сущностями

Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ сущности Π΅ΡΡ‚ΡŒ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ (Π°Ρ‚Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚ objects), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹

<Entity>.objects.get(object_id=1, query="test")  # ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŒΠ΅ΠΊΡ‚Π°
<Entity>.objects.all()  # ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ всСх сущностСй
<Entity>.objects.filter(**kwargs)  # ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ списка сущностСй с Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠΌ

<Entity>.objects.create(**kwargs)  # созданиС сущности (Π½Π΅Ρ‚ явной сигнатуры поэтому Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ create самой сущности)
<Entity>.objects.update(**kwargs)  # обнослСниС сущности (Π½Π΅Ρ‚ явной сигнатуры поэтому Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ update самой сущности)

Π’ свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ сама ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для Π±ΠΎΠ»Π΅Π΅ простого создания ΠΈ обновлСния

<EntityInstance>.create()
<EntityInstance>.update()
<EntityInstance>.save()  # создаст ΠΈΠ»ΠΈ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΎΠ±ΡŒΠ΅ΠΊΡ‚ Π±Ρ‹Π» ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½

Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ - созданиС Π·Π²ΠΎΠ½ΠΊΠ° происходит Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΏΡ€ΠΎΡˆΠ΅Π½Π½ΡƒΡŽ ΡΡƒΡ‰Π½ΠΎΡΡ‚ΡŒ

from amocrm.v2 import Call, CallDirection, CallStatus

Call().create(CallDirection.OUTBOUNT, phone="....", source="", duration=timedelta(minutes=10), status=CallStatus.CALL_LATER, created_by=manager)

Рассмотрим ΠΏΠΎΠ»Π½Ρ‹ΠΉ процСсс Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚Π°

from amocrm.v2 import Contact, Company

contact = Contact.objects.get(query="ВСст")
print(contact.first_name)
print(contact.company.name)
print(contact.created_at)

contact.last_name = "НовоС"
contact.tags.append("new")
contact.notes.objects.create(text="ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅")

contact.save()

contact.company = Company(name="Amocrm")  # создаст ΠΈ сразу ΠΏΡ€ΠΈΠ»ΠΈΠ½ΠΊΡƒΠ΅Ρ‚ компанию
print(contact.company.id)

len(list(contact.customers)) # lazy list
contact.customers.append(Customer(name="Volta"))

ΠšΠ°ΡΡ‚ΠΎΠΌΠ½Ρ‹Π΅ поля

Одна ΠΈΠ· ΡƒΠ΄ΠΎΠ±Π½Ρ‹Ρ… возмоТностСй amoCRM - кастомныС поля

Example:

from amocrm.v2 import Lead as _Lead, custom_field

class Lead(_Lead):
    utm = custom_field.UrlCustomField("UTM ΠΌΠ΅Ρ‚ΠΊΠ°")
    delivery_type = custom_field.SelectCustomField("Бпособ доставки")
    address = custom_field.TextCustomField("АдрСс")

Однако ΠΌΠ°ΠΏΠΈΠ½Π³ всСх кастомных ΠΏΠΎΠ»Π΅ΠΉ Π΄Π΅Π»ΠΎ ΡƒΡ‚ΠΎΠΌΠΈΠ½Π΅Ρ‚Π»ΡŒΠ½ΠΎΠ΅, поэтому для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ„Π°ΠΉΠ»Π° с Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌ ΠΌΠ°ΠΏΠΈΠ½Π³ΠΎΠΌ Π΅ΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Π°:

export AMOCRM_CLIENT_ID=xxx
export AMOCRM_SECRET=xxx
export AMOCRM_SUBDOMAIN=xxx
export AMOCRM_REDIRECT_URL=xxx
export AMOCRM_CODE=xxx # optional
pyamogen > models.py

Для Π΅Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ°ΠΊΠ΅Ρ‚ python-slugify (https://github.com/un33k/python-slugify)