krukov / amocrm_api Goto Github PK
View Code? Open in Web Editor NEWPython amocrm API wrapper
License: MIT License
Python amocrm API wrapper
License: MIT License
Для корректной работы генерации файла с готовым мапингом требуется библиотека https://github.com/un33k/python-slugify или любая другая с подобным функционалом/сигнатурой, прошу обновить зависимости
amocrm_api/amocrm/v2/tokens.py
Line 161 in d90b288
При валидации access токена нужно явно передать audience. Ошибка выходит сразу же при любом запросе.
Мы хотим написать интеграцию amocrm + bizon + getcourse и ищем программиста на Python. Если у Вас есть время и желание поучавствовать в проекте, пишите на почту [email protected]
Заранее спасибо.
Здравствуйте, не могу созадть сущность, токен возвращает. но сущность не создается
from amocrm.v2.entity.contact import Contact
from amocrm.v2 import tokens
value = tokens.FileTokensStorage()
print(value.get_access_token())
print(value.get_refresh_token())
Contact.objects.create(name = "test_009")
Ошибка =>
Traceback (most recent call last):
File "C:\Users\Nikol\OneDrive\Рабочий стол\амоапи\345678.py", line 22, in
Contact.objects.create(name = "Залупа")
File "D:\успех\lib\site-packages\amocrm\v2\manager.py", line 16, in create
return self._model(data=self._interaction.create(data=data or kwargs))
File "D:\успех\lib\site-packages\amocrm\v2\interaction.py", line 123, in create
response, status = self.request("post", self._get_path(), data=[data])
File "D:\успех\lib\site-packages\amocrm\v2\interaction.py", line 57, in request
return self._request(method, path, data=data, params=params, headers=headers)
File "D:\успех\lib\site-packages\amocrm\v2\interaction.py", line 36, in _request
headers.update(self.get_headers())
File "D:\успех\lib\site-packages\amocrm\v2\interaction.py", line 25, in get_headers
headers.update(self._get_auth_headers())
File "D:\успех\lib\site-packages\amocrm\v2\interaction.py", line 29, in _get_auth_headers
return {"Authorization": "Bearer " + self._token_manager.get_access_token()}
File "D:\успех\lib\site-packages\amocrm\v2\tokens.py", line 151, in get_access_token
token = self._storage.get_access_token()
AttributeError: 'NoneType' object has no attribute 'get_access_token'
Подскажите, пожалуйста, в чем может быть проблема?
Добрый день! Подскажите как использовать правильно запрос фильтр.
data = {"created_at":yyyy-mm-dd}
Lead.objects.filter(**data)
Ошибка отсутствует именнованный параметр "created_at"
Здравствуй!
Когда пытаюсь достать или создать Lead, получаю такую ошибку.
Помоги, пожалуйста :3
Traceback (most recent call last):
File "/usr/lib/python3.9/runpy.py", line 197, in _run_module_as_main
return _run_code(code, main_globals, None,
File "/usr/lib/python3.9/runpy.py", line 87, in _run_code
exec(code, run_globals)
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/flask/__main__.py", line 3, in <module>
main()
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/flask/cli.py", line 990, in main
cli.main(args=sys.argv[1:])
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/flask/cli.py", line 596, in main
return super().main(*args, **kwargs)
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/click/core.py", line 1062, in main
rv = self.invoke(ctx)
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/click/core.py", line 1668, in invoke
return _process_result(sub_ctx.command.invoke(sub_ctx))
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/click/core.py", line 1404, in invoke
return ctx.invoke(self.callback, **ctx.params)
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/click/core.py", line 763, in invoke
return __callback(*args, **kwargs)
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/click/decorators.py", line 84, in new_func
return ctx.invoke(f, obj, *args, **kwargs)
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/click/core.py", line 763, in invoke
return __callback(*args, **kwargs)
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/flask/cli.py", line 845, in run_command
app = DispatchingApp(info.load_app, use_eager_loading=eager_loading)
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/flask/cli.py", line 321, in __init__
self._load_unlocked()
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/flask/cli.py", line 346, in _load_unlocked
self._app = rv = self.loader()
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/flask/cli.py", line 402, in load_app
app = locate_app(self, import_name, name)
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/flask/cli.py", line 256, in locate_app
__import__(module_name)
File "/mnt/8A2C66EE2C66D4AB/PyCharmProjects/dialogflow/app.py", line 35, in <module>
add_lead("TEST", "+79999999999", "[email protected]", "10.06.2023", "13:37")
File "/mnt/8A2C66EE2C66D4AB/PyCharmProjects/dialogflow/app.py", line 33, in add_lead
Lead.save(Lead(name = name, number = number, email = email, date = date, time = time))
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/model.py", line 23, in __init__
setattr(self, attr, value)
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/entity/custom_field.py", line 147, in __set__
self._check(instance)
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/entity/custom_field.py", line 99, in _check
field = self._find(instance)
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/entity/custom_field.py", line 91, in _find
for field in CustomFieldModel.get_for(instance):
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/manager.py", line 27, in filter
for data in self._interaction.get_all(*args, include=self._model._get_embedded_fields(), **kwargs):
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/interaction.py", line 112, in get_all
for data in self._all(self._get_path(), include=include, query=query, filters=filters, order=order):
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/interaction.py", line 77, in _all
response, _ = self._list(
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/interaction.py", line 72, in _list
return self.request("get", path, params=params, include=include)
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/interaction.py", line 57, in request
return self._request(method, path, data=data, params=params, headers=headers)
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/interaction.py", line 36, in _request
headers.update(self.get_headers())
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/interaction.py", line 25, in get_headers
headers.update(self._get_auth_headers())
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/interaction.py", line 29, in _get_auth_headers
return {"Authorization": "Bearer " + self._token_manager.get_access_token()}
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/tokens.py", line 154, in get_access_token
if self._is_expire(token):
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/amocrm/v2/tokens.py", line 161, in _is_expire
token_data = jwt.decode(token, options={"verify_signature": False})
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/jwt/api_jwt.py", line 104, in decode
self._validate_claims(payload, merged_options, **kwargs)
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/jwt/api_jwt.py", line 140, in _validate_claims
self._validate_aud(payload, audience)
File "/home/danilax86/diskD/PyCharmProjects/dialogflow/venv/lib/python3.9/site-packages/jwt/api_jwt.py", line 189, in _validate_aud
raise InvalidAudienceError('Invalid audience')
jwt.exceptions.InvalidAudienceError: Invalid audience
Конфигурация токенов, как в примере:
tokens.default_token_manager(
client_id = app.config['AMOCRM_INTEGRATION_ID'],
client_secret = app.config['AMOCRM_SECRET'],
subdomain = app.config['AMOCRM_DOMAIN'],
redirect_url = 'https://36434e2604eb.ngrok.io',
storage = tokens.FileTokensStorage()
)
tokens.default_token_manager.init(
code = app.config['AMOCRM_AUTH'],
skip_error = True
)
Привет, подскажите как создать задачу для лида? Не могу разобраться, в примерах о Task ничего не нашел
KeyError Traceback (most recent call last)
Input In [6], in
----> 1 list(Status.get_for("4483554").filter())
File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/amocrm/v2/manager.py:27, in Manager.filter(self, *args, **kwargs)
26 def filter(self, *args, **kwargs):
---> 27 for data in self._interaction.get_all(*args, include=self._model._get_embedded_fields(), **kwargs):
28 yield self._model(data=data)
File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/amocrm/v2/entity/pipeline.py:17, in StatusesInteraction.get_all(self, include, query, filters, order)
16 def get_all(self, include=None, query=None, filters=(), order=None):
---> 17 for data in self._all(self._get_path(), include=include, query=None, filters=filters, order=order):
18 for status_data in data[self._get_field()]:
19 if not query or status_data["name"].lower() == query.lower():
File /Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/amocrm/v2/interaction.py:83, in BaseInteraction._all(self, path, include, query, filters, order, limit)
81 return
82 yield response["_embedded"]
---> 83 if "next" not in response["_links"]:
84 return
85 page += 1
KeyError: '_links'
Добрый день!
Подскажите, пожалуйста, как можно получить Дату закрытия Сделки (это одно из стандартных свойств - closed_at)?
Пробовала добавить её, как кастомное поле, но не сработало:
class Lead(_Lead):
closing_date = custom_field.DateTimeCustomField("closed_at")
Пытаюсь подключиться к api, но не получается
from amocrm.v2 import tokens
from amocrm.v2 import Contact, Company, Lead
import os
dir_path = os.path.dirname(os.path.realpath(__file__))
tokens.default_token_manager(
client_id="***",
client_secret="***",
subdomain="***",
redirect_url="https://google.com/",
storage=tokens.FileTokensStorage(directory_path=dir_path), # by default FileTokensStorage
)
print(dir_path)
tokens.default_token_manager.init(code="***", skip_error=False)
leads = Lead.objects.all()
for lead in leads:
print(lead)
raise exceptions.NoToken("You need to init tokens with code by 'init' method")
amocrm.v2.exceptions.NoToken: You need to init tokens with code by 'init' method
Добрый день. Подскажите, пожалуйста, как получить всех лидов из Амо?
Авторизируюсь как указано в примере, сутки все работает а потом слетает авторизация пока не укажу новый код авторизации. Подскажите, в чем может быть проблема?
Не нашел как работать со списком "products".
Подскажите.
Добрый день. Не могу найти как привязать контакт к сделке. Отдельно создаю контакт, затем сделку, а дальше не понятно. Подскажите, пожалуйста, я новичок в этом деле.
Не пойму как получить pipeline сделки
<generator object Manager.filter at 0x000001BA10750F20>
Как распаковать этот ответ?
leadget1 = Pipeline.objects.filter(pipeline_id=45884164)
вот так собственно я ищу просто pipeline. пробовал с разных сторон заходить. Уже два дня бьюсь. Мб потому что не особо опытен
Короче, я просто хочу получить все сделки в определенном pipeline =(
Раньше все хорошо работало, но теперь при любой попытке забрать Event любым способом, выдаётся только 50
Пробовал так:
events = list(Event.objects.filter( filters=[ filters.DateRangeFilter("created_at")(now-timedelta(days=7), now), filters.SingleFilter("type")("lead_status_changed") ] ))
и так:
events = list(Event.objects.all())
# -*- coding: utf-8 -*-
## HIGH level API
from amocrm import BaseContact, amo_settings, fields
amo_settings.set('[email protected]', 'myapikey', 'myprojectaname')
class Contact(BaseContact):
position = fields.CustomField('Должность')
site = fields.CustomField('Сайт')
phone = fields.CustomField('Телефон', enum='WORK')
new_contact = Contact(name='Example2', company='ExampleCorp2', position='QA', phone='0001')
new_contact.site = 'http://example.com'
new_contact.save()
Ошибка:
Traceback (most recent call last):
File "test2.py", line 7, in <module>
class Contact(BaseContact):
File "test2.py", line 10, in Contact
phone = fields.CustomField('Телефон', enum='WORK')
TypeError: __init__() got an unexpected keyword argument 'enum'
Есть такое поле
class Contact(_Contact):
class LANG_ENUMS:
ru = custom_field.SelectValue(id=1227515, value='Рус')
en = custom_field.SelectValue(id=1227517, value='Англ')
lang = custom_field.SelectCustomField("Язык", field_id=1152165, enums=LANG_ENUMS)
Делаю так:
lang_enum_ru = crm_inst.LANG_ENUMS.ru
crm_inst.lang = lang_enum_ru
или
crm_inst.lang = 'Рус'
затем
crm_inst.save()
и получаю Exception:
ValidationError({'validation-errors': [{'request_id': '0', 'errors': [{'code': 'FieldNotExpected', 'path': 'custom_fields_values.5.values.0.enum_code', 'detail': 'This field was not expected.'}]}], 'title': 'Bad Request', 'type': 'https://httpstatus.es/400', 'status': 400, 'detail': 'Request validation failed'})
Причем такое почти при любом сохранении полей кроме стандартных(в смысле при сохранении custom_fields).
в чем может быть проблема?
celeryworker_1 | Traceback (most recent call last):
celeryworker_1 | File "/usr/local/lib/python3.9/site-packages/celery/app/trace.py", line 451, in trace_task
celeryworker_1 | R = retval = fun(*args, **kwargs)
celeryworker_1 | File "/usr/local/lib/python3.9/site-packages/celery/app/trace.py", line 734, in __protected_call__
celeryworker_1 | return self.run(*args, **kwargs)
celeryworker_1 | File "/app/amo/tasks.py", line 246, in validate_person
celeryworker_1 | raise self.retry(exc=e)
celeryworker_1 | File "/usr/local/lib/python3.9/site-packages/celery/app/task.py", line 717, in retry
celeryworker_1 | raise_with_context(exc)
celeryworker_1 | File "/app/amo/tasks.py", line 242, in validate_person
celeryworker_1 | crm_inst.save()
celeryworker_1 | File "/usr/local/lib/python3.9/site-packages/amocrm/v2/model.py", line 49, in save
celeryworker_1 | self.update()
celeryworker_1 | File "/usr/local/lib/python3.9/site-packages/amocrm/v2/model.py", line 63, in update
celeryworker_1 | self._manager.update(self.id, self._get_updated_data())
celeryworker_1 | File "/usr/local/lib/python3.9/site-packages/amocrm/v2/manager.py", line 19, in update
celeryworker_1 | return self._interaction.update(object_id=object_id, data=data or kwargs)
celeryworker_1 | File "/usr/local/lib/python3.9/site-packages/amocrm/v2/interaction.py", line 132, in update
celeryworker_1 | raise exceptions.ValidationError(response)
celeryworker_1 | amocrm.v2.exceptions.ValidationError: {'validation-errors': [{'request_id': '0', 'errors': [{'code': 'FieldNotExpected', 'path': 'custom_fields_values.5.values.0.enum_code', 'detail': 'This field was not expected.'}]}], 'title': 'Bad Request', 'type': 'https://httpstatus.es/400', 'status': 400, 'detail': 'Request validation failed'}
Возникает на разных свойствах, ['note'], ['link'] и т.д при переборе и выводе каждого элемента списка событий в консоль.
Traceback (most recent call last):
File "/home/rusty/Client-projects/AmoCrmDB/another_wrap.py", line 137, in
print(i)
File "/home/rusty/Client-projects/AmoCrmDB/venv/lib/python3.10/site-packages/amocrm/v2/model.py", line 40, in repr
fields = [
File "/home/rusty/Client-projects/AmoCrmDB/venv/lib/python3.10/site-packages/amocrm/v2/model.py", line 41, in
"{} = {}".format(field.name, getattr(self, attr))
File "/home/rusty/Client-projects/AmoCrmDB/venv/lib/python3.10/site-packages/amocrm/v2/fields.py", line 33, in get
return self.on_get_instance(instance, data)
File "/home/rusty/Client-projects/AmoCrmDB/venv/lib/python3.10/site-packages/amocrm/v2/entity/events.py", line 93, in on_get_instance
return value[0]["note"]["id"]
IndexError: list index out of range
Traceback (most recent call last):
File "/home/rusty/Client-projects/AmoCrmDB/another_wrap.py", line 133, in
print(i)
File "/home/rusty/Client-projects/AmoCrmDB/venv/lib/python3.10/site-packages/amocrm/v2/model.py", line 40, in repr
fields = [
File "/home/rusty/Client-projects/AmoCrmDB/venv/lib/python3.10/site-packages/amocrm/v2/model.py", line 41, in
"{} = {}".format(field.name, getattr(self, attr))
File "/home/rusty/Client-projects/AmoCrmDB/venv/lib/python3.10/site-packages/amocrm/v2/fields.py", line 33, in get
return self.on_get_instance(instance, data)
File "/home/rusty/Client-projects/AmoCrmDB/venv/lib/python3.10/site-packages/amocrm/v2/entity/events.py", line 103, in on_get_instance
return value[0]["link"]["entity"]
IndexError: list index out of range
Пытаемся сохранить изменения в сделке:
lead.save()
Класс _BaseAmoManager делает post-запрос:
https://xxx.amocrm.ru/private/api/v2/json/leads/set
получает ответ (со статусом 200):
{"response":{"leads":{"update":{"errors":{"17207117":"Last modified date is older than in database"}}},"server_time":1513160837}}
но считает, что всё прошло хорошо.
Ожидаемое поведение: библиотека сообщает об ошибке при сохранении сделки.
Подскажите, планируется добавление метода /api/v4/calls? Или возможно ли реализовать его вручную?
Не могу разобраться как добавить примечание к сделке?
lead = Lead(name='Имя')
lead.notes = ?
Дано:
Контакт, у которого есть несколько "Рабочих" адресов и один "Личный".
Нужно изменить первый из них.
class Contact(BaseContact):
email=fields.EnumCustomField(u'Email', enum='WORK')
Получаем список контактов.
contact=Contact.objects.get(id=12345)
print(contact.email)
# ['[email protected]', '[email protected]']
В массиве только "Рабочие" адреса. Пытаемся поменять первый рабочий адрес.
if isinstance(contact.email , list):
tmp_mails=contact.email
tmp_mails[0]='[email protected]'
contact.email = tmp_mails
contact.save()
В результате, все "Рабочие" контакты сохраняются корректно в CRM, а "Личные" просто удаляются. Подскажите, может неправильно пользуюсь библиотекой?
подскажите пожалуйста как могу использовать FiltersByPipelineAndStatus фильтр что то не могу понять (я новичек) спасибо заранее
Здравствуйте! Делаю выгрузку из events log, используя Event from amocrm.v2 – код здесь. Иногда выгрузка отваливается с ошибкой # Sometimes Connection aborted. amocrm.v2.exceptions.AmoApiException: Connection aborted. Я пробовала варьирование продолжительности задержки и размеров батчей – ничего не помогает. Как обойти описанную выше проблему?
Содержимое main.py
файла:
from amocrm.v2 import tokens, Lead
tokens.default_token_manager(
client_id="xxx",
client_secret="xxxx",
subdomain="xxx",
redirect_url="https://example.com",
storage=tokens.FileTokensStorage(),
)
tokens.default_token_manager.init(code="code", skip_error=False)
при запуске python main.py
получаю в ответ это:
{
'title': 'Некорректный клиент',
'type': 'https://developers.amocrm.ru/v3/errors/OAuthProblemJson',
'status': 401,
'detail': 'Авторизация клиента не прошла'
}
Не могу понять в чем проблема, можете подсказать?
Amocrm api got new ability - manage custom fields, create, change and delete https://developers.amocrm.ru/rest_api/fields_set.php.
We can automagically map all custom fields to amocrm itself
class Lead(BaseLead):
target = fields.CustomField(u'Цели', type=MULTILIST_TYPE, origin=ANY)
spend = fields.CustomField(u'Потрачено', type=NUMBER_TYPE)
Lead.objects.map_fields()
# Custom field 'Цели' successfully created
# Custom field 'Потрачено' successfully created
Реализовать интерфейс для https://developers.amocrm.ru/rest_api/contacts_links.php
Установил pip install amocrm_api
Создал простой файл.
from amocrm.v2 import tokens, Contact
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)
contacts = Contact.objects.all()
print(contacts)
И запуститл, в ответ ошибка
root@67d3abe17a1b:/backend# python data/amocrm.py
Traceback (most recent call last):
File "/backend/data/amocrm.py", line 1, in
from amocrm.v2 import tokens, Contact
File "/backend/data/amocrm.py", line 1, in
from amocrm.v2 import tokens, Contact
ModuleNotFoundError: No module named 'amocrm.v2'; 'amocrm' is not a package
Хедер параметр IF-MODIFIED-SINCE
Добрый день
Подскажите пожалуйста, как пользоваться Lead.objects.filter() ??? Как задавать параметры? Пытаюсь выбрать все лиды в статусе = " Успешно завершено"
Hi,
I'm looking for a way to retrieve messages from whatsapp integration . That integration is set on a phone I don't have access, so it'd be great if I could work around it.
I have access to leads and other entities mapped, but I'm clueless about how to interact with integrations and widgets, is it possible? If so, what is a viable way to do that? I'm open to contribute : )
My use case is quite simple: I don't have access to individual whatsapp notifications. In other words, I have to check each lead in order to know if he/she answers my message or dive into notifications (I'm not able to filter only my clients). I want to interact problematically with chat messages.
Не понятно, как использовать фильтры, какие бы параметры я не вводил (в виде словарей, просто аргументов итд) выдает TypeError: GenericInteraction.get_all() got multiple values for argument 'include'
Можно какой-то пример, как этими фильтрами можно пользоваться?
Спасибо заранее
В июле 2020 года, AmoCRM отказались от поддержки авторизации через api_key. Вместо api_key предполагается использовать авторизацию через OAuth2.
Подробности: https://www.amocrm.ru/developers/content/oauth/switch-over-oauth
Библиотека отличная! С документацией поработать и вообще супер!
Инициализацию я поставил в apps.py
, потому что если ставить в settings.py
выдаст ошибку, видимо settings.py
выполняется 2 раза:
class SiteSettingsConfig(AppConfig):
name = 'site_settings'
def ready(self):
# AMOCRM MAIN SETTINGS
# Authorization
from amocrm.v2 import tokens # noqa: E402
tokens.default_token_manager(
client_id="xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx",
client_secret="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
subdomain="xxxxxxxx",
redirect_url="https://xxxxxx.ngrok.io",
storage=tokens.FileTokensStorage()
)
# if not pathlib.File(os.path.join(settings.BASE_DIR, 'refresh_token.txt')).is_file():
tokens.default_token_manager.init(
code="...code...",
skip_error=False
)
Теперь пробую после отправки формы создать Lead
вот так: lead = Lead(name="Форма")
и потом lead.save()
. На это почему-то возвращает amocrm.v2.exceptions.UnAuthorizedException
(неверный логин и пароль если быть точным)...
Файлы refresh_token.txt
и access_token.txt
создает, и все вроде нормально.
Очень нужна помощь, заранее спасибо!
И если не сложно еще вопросик: Как мне создать Lead
в определенном pipeline и добавить responsible user? Я пытался вот так Lead(name="Форма", responsible_user_id=6591718, group_id=0, pipeline_id=36854932)
, но не вышло... Я так понял надо найти пользователя - main_user = User.objects.get(1)
и в аргументы поставить responsible_user=main_user
, но чтобы это понять мне сначала надо решить первую проблему, она появляется при любом запросе...
Не могу разобраться как создать новую задачу, можете подсказать?
В связи с большими изменениями во взаимодействии с AmoCrm и популярности этой платформы появились планы реанимировать библиотеку.
В планах
При вызове метода User.objects.all()
возвращается генератор (<generator object Manager.filter at 0x7f9c104aa270>
), но при прокрутке пустота:
users = User.objects.all()
for u in users:
print(u)
При этом если запрашивать юзеров через BaseInteraction().request("get", path="users")
, то всё приходит.
Дело такое. Создаю lead на основе BaseLead модели.
lead = BaseLead(name=u'some name')
lead.save()
task = LeadTask(lead=lead, text='123', type=u'Звонок')
task.save()
А дальше трейс:
Суть в том, что в _request словарь method выглядит так:
{u'container': [u'add'],
u'method': u'post',
u'path': u'set',
u'result': [u'add', 0, u'id']}
И когда в _modify_response происходит магия:
response = response[key]
Где keys строятся на основе 'result' подставляется 0 в dict как целое и ... IndexError.
P.S.: Может я конечно совсе где-то не прав, тогда дико каюсь.
I've found out that BaseCompany.tasks returns empty collection, even when there are tasks assigned.
I've also found a way to make it work after playing with AmoCRM developer console.
The original code:
class CompanyTask(_AbstractTaskModel):
company = fields.ForeignField(BaseCompany, 'element_id')
_element_type = fields._ConstantField('element_type',
_BaseModel._ELEMENT_TYPES['company'])
objects = TasksManager(object_type='contact')
If we remove object_type (make it objects = TasksManager()
) it works. Also the object_type can be removed from ContactTask and LeadTask class without changing the way they work (they work either way).
I am not sure that's the right way to do it though for this wrapper, since maybe AmoCRM's behavior will change in the future again.
Пытаюсь создать неразобранную сделку:
Lead.objects.create(name='Нераз.Сделка', status_id=48692119, pipeline_id=5503552)
Получаю ошибку:
amocrm.v2.exceptions.ValidationError: {'validation-errors': [{'request_id': '0', 'errors': [{'code': 'NotSupportedChoice', 'path': 'status_id', 'detail': 'The value you selected is not a valid choice.'}]}], 'title': 'Bad Request', 'type': 'https://httpstatus.es/400', 'status': 400, 'detail': 'Request validation failed'}
ID шники статуса и pipeline перепроверял:
Status(color = #c1c1c1, id = 48692119, is_editable = False, name = Неразобранное, sort = 10, type = 1)
Каков правильный путь для создания неразобранной сделки?
В модели написано что то вроде
telefon = custom_field.ContactPhoneField("Телефон", field_id=496001, code="PHONE")
Модель сгенерирована через pyamogen
При обращении к contact.telefon, возвращается строка, которая содержит только один номер телефона.
Как получить ВСЕ номера телефонов, которые привязаны к карточке(рабочие, мобильные, личные)?
Как быть если, к примеру у контакта несколько рабочих телефонов?
При попытке получить любые сущности выдает jwt.exceptions.InvalidAudienceError: Invalid audience. Токены в файл записались. Посдкажите, пожалуйста, что я делаю не так.
Привет @Krukov!
У меня возникает вышеозначенная ошибка, когда я пытаюсь забрать Event из амо
events = list(Event.objects.filter(filters=[filters.DateRangeFilter("created_at")(now-timedelta(days=1), now)]))
events
Причем та же ошибка возникает, если просто делать, хотя раньше возвращало просто последнее событие:
Event.objects.get()
Мб бага какая?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.