AmoCRM python API. V2
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 Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ, Π² ΡΠ²ΡΠ·ΠΈ Ρ ΡΠ΅ΠΌ ΡΠ΅ΠΊΡΡΠ°Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ
- Π Π»ΠΈΡΠ½ΠΎΠΌ ΠΊΠ°Π±ΠΈΠ½Π΅ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ
- Π Π΅ΡΡΠ΅Ρ ΡΠΎΠΊΠ΅Π½ ΠΎΠ΄Π½ΠΎΡΠ°Π·ΠΎΠ²ΡΠΉ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΠΈ Π°ΠΊΡΠ΅ΡΡ ΡΠΎΠΊΠ΅Π½Π°
- EcΠ»ΠΈ Π·Π°ΠΏΡΠΎΡΡ Π² amoCRM ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΡΡ ΡΠ΅ΠΆΠ΅ ΡΠ΅ΠΌ Π²ΡΠ΅ΠΌΡ ΠΆΠΈΠ·Π½ΠΈ ΡΠ΅ΡΡΠ΅Ρ ΡΠΎΠΊΠ΅Π½Π° ΡΠΎ Π²Π°ΠΌ Π½Π΅ ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ ΡΠ°ΠΊΠΎΠΉ Π²Π°ΡΠ°Π½Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ
- Π’ΠΎΠΊΠ΅Π½Ρ Π½ΡΠΆΠ½ΠΎ Ρ ΡΠ°Π½ΠΈΡΡ, Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π΅ΡΡΡ 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)