Krukov / amocrm_api

Python amocrm API wrapper
MIT License
104 stars 55 forks source link

Нужна помощь в интеграции с Django #33

Closed itekhi closed 3 years ago

itekhi commented 3 years ago

Библиотека отличная! С документацией поработать и вообще супер! Инициализацию я поставил в 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, но чтобы это понять мне сначала надо решить первую проблему, она появляется при любом запросе...

Krukov commented 3 years ago

Привет, тяжело конечно сказать что не так в вашем случае. Это только на сохранении происходить? Получить что то из амо удается?

Когда я интегрировал эту либу в джанго проект я делал все эти инициализации с токеном прямо в модуле (файле) где были определены модели Lead с кастомными полями.

# django_project/django_app/amo_integration.py
from amocrm.v2 import Lead as _Lead

tokens.default_token_manager(
    client_secret=settings.AMOCRM_CLIENT_SECRET,
    client_id=settings.AMOCRM_CLIENT_ID,
    subdomain="xxx",
    redirect_url="xxx",
    storage=tokens.FileTokensStorage(directory_path=str(Path.home())),
)
if ENABLE and settings.AMOCRM_CODE:
    tokens.default_token_manager.init(settings.AMOCRM_CODE, skip_error=True)

...
class Lead(_Lead):
    utm_source = custom_field.TextCustomField("Источник / utm_source")
    utm_medium = custom_field.TextCustomField("Канал / utm_medium")
     ....

# django_project/django_app/views.py
from .amo_integration import Lead

def view(request):
    ...
    Lead(....).save()

И советую попробовать зафиксировтаь путь для сохранения токенов аля storage=tokens.FileTokensStorage(directory_path=str(Path.home())),

Насчет воронки и отвественного - по идеи вот так должно работать

 Lead(name="Форма", responsible_user=6591718, pipeline=36854932).save()

group_id - по доке вроде не передается при созданиии по этому в библиотеке это только редактируемое поле.

itekhi commented 3 years ago

Большое спасибо за ответ!

Попробовал Pipeline.objects.all() и Lead.objects.all() - возвращает <generator object Manager.filter at 0x0000019224AAEDE0> (без ошибки! но по-моему это просто сущность, запрос не отправляется...)

А в if ENABLE and settings.AMOCRM_CODE: откуда берется ENABLE? Я так понял как только в самый первый раз выполнили init() дальше уже не надо.

Я поместил всё в models.py токен создается и все вроде работает нормально:

from django.conf import settings

from amocrm.v2 import tokens
from amocrm.v2 import Lead as _Lead
from amocrm.v2 import custom_field

tokens.default_token_manager(
    client_secret=settings.AMOCRM_SECRET,
    client_id=settings.AMOCRM_CLIENT_ID,
    subdomain=settings.AMOCRM_SUBDOMAIN,
    redirect_url=settings.AMOCRM_REDIRECT_URL,
    storage=tokens.FileTokensStorage(directory_path=settings.BASE_DIR),
)
print('hello! hello! hello! hello! hello! hello! hello! hello! hello! ')

if False and settings.AMOCRM_CODE:
    tokens.default_token_manager.init(settings.AMOCRM_CODE, skip_error=False)

class Lead(_Lead):
    utm_source = custom_field.TextCustomField("Источник / utm_source")
    utm_medium = custom_field.TextCustomField("Канал / utm_medium")

Потом в views.py:

from amocrm_api.models import Lead
from amocrm.v2.entity.pipeline import Pipeline

def index(request):
        lead = Lead.objects.get(1)
        print(lead)

Отправляю форму, print(lead) выдает None {'with': 'contacts,loss_reason,tags'} А потом сразу за этим amocrm.v2.exceptions.UnAuthorizedException (неверный логин или пароль)

Не могу понять, функция tokens.default_token_manager() должна выполняться при каждом запросе или только в запуск? Потому что print('hello! hello!... ') выполняется только при перезапуске сервера... Возможно проблема как раз в этом, только не могу понять как сделать чтобы выполнялось каждый раз при запросе.

Update:

Поместил from amocrm_api.models import Lead внутри def index(request) и теперь print('hello! hello!... ') показывается при каждом запросе, но все равно выдает error UnAuthorizedException.....

itekhi commented 3 years ago

Возможно это что-то с созданной интеграцией в amocrm, я ни разу не авторизировал интеграцию администратором, но вроде в интеграции во вкладке Granted access всё есть... Может есть вариант вручную указать login и password при авторизации?

Krukov commented 3 years ago

ENABLE можно опустить, это просто в качестве примера (у меня это ENABLE = settings.AMO_ENABLE). Не суть, по идеи если токены создались то и авторизация прошла нормально. Инициализация токенов должна происходить один раз tokens.default_token_manager()

utm_source = custom_field.TextCustomField("Источник / utm_source") я в качестве примера указал, у вас должны быть другие кастомыне поля или они вообще не нужны

По-видемому и получение данных не работает тоже

1) Проверьте что в интеграции у вас стоит галочка

Screenshot 2020-12-29 at 9 40 58 AM

2) создайте фаил any_name.py

from amocrm.v2 import tokens
from amocrm.v2 import Lead, Pipeline

tokens.default_token_manager(
    client_secret="xxx",
    client_id="xxx",
    subdomain="xxx",
    redirect_url="xxx",
    storage=tokens.FileTokensStorage(),
)
tokens.default_token_manager.init("xxx", skip_error=True)

if __name__ == "__main__":
    print(list(Pipeline.objects.all()))
    print(list(Lead.objects.all()))

и запустите python any_name.py

itekhi commented 3 years ago

Все равно amocrm.v2.exceptions.UnAuthorizedException...... 🤦‍♂️🤦‍♂️ Даже уже не знаю что попробовать... В интеграции все стоит. Даже попробовал использовать MemoryTokensStorage(), не помогло. Удалил файлы access_token.txt и refresh_token.txt поставил новый authorization_key, не работает.....

Может в самом амо есть какая-то настройка, не в интеграции?

Krukov commented 3 years ago

Не думаю ) . Ради эксперемента завидите новый аккаунт и создайте там новую интеграцию - попробуйте код, если не работает , то скинте креды и я попробую )

Krukov commented 3 years ago

Привет, как успехи? Закрываю задачу?

itekhi commented 3 years ago

Добрый день! Не закрывайте пока, жду ответ поддержки по пропаже интеграции из профиля, праздники, не отвечают...

itekhi commented 3 years ago

А вот вопрос: REDIRECT_URL используется для чего-то в библиотеке? В смысле на локалке должно работать или надо в production с нормальным доменом? REDIRECT_URL такой же как и при создании интеграции.

Krukov commented 3 years ago

REDIRECT_URL не влияет на работу библиотеки, но что бы amocrm выдало токен его нужно указывать как в интеграции

Krukov commented 3 years ago

@Shaffle1 есть новости? )

itekhi commented 3 years ago

Неа, теперь не хочет создаваться интеграция в амо, пропадает и всё... Напишу как будут!

Krukov commented 3 years ago

Может таже проблема https://github.com/Krukov/amocrm_api/issues/41 ?

itekhi commented 3 years ago

Вроде нет, амо оплаченный и давно. + я еще тестил API через браузер и postman, все работает. Но все равно спасибо!))

itekhi commented 3 years ago

Наконец-то! Решилось, не знаю точно в чем была проблема, но я проверил оплату, и создал тестовый субаккаунт amocrm. Попробовал с нуля сделать мини-прогу на python без django. И все заработало!!! Видимо amo забагался и не хотел пускать api нормально работать((