amochka 0.3.0__tar.gz → 0.3.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {amochka-0.3.0 → amochka-0.3.1}/PKG-INFO +103 -24
- amochka-0.3.1/README.md +173 -0
- {amochka-0.3.0 → amochka-0.3.1}/amochka.egg-info/PKG-INFO +103 -24
- {amochka-0.3.0 → amochka-0.3.1}/pyproject.toml +1 -1
- amochka-0.3.0/README.md +0 -94
- {amochka-0.3.0 → amochka-0.3.1}/amochka/__init__.py +0 -0
- {amochka-0.3.0 → amochka-0.3.1}/amochka/client.py +0 -0
- {amochka-0.3.0 → amochka-0.3.1}/amochka/etl.py +0 -0
- {amochka-0.3.0 → amochka-0.3.1}/amochka.egg-info/SOURCES.txt +0 -0
- {amochka-0.3.0 → amochka-0.3.1}/amochka.egg-info/dependency_links.txt +0 -0
- {amochka-0.3.0 → amochka-0.3.1}/amochka.egg-info/requires.txt +0 -0
- {amochka-0.3.0 → amochka-0.3.1}/amochka.egg-info/top_level.txt +0 -0
- {amochka-0.3.0 → amochka-0.3.1}/etl/__init__.py +0 -0
- {amochka-0.3.0 → amochka-0.3.1}/etl/config.py +0 -0
- {amochka-0.3.0 → amochka-0.3.1}/etl/extractors.py +0 -0
- {amochka-0.3.0 → amochka-0.3.1}/etl/loaders.py +0 -0
- {amochka-0.3.0 → amochka-0.3.1}/etl/migrations/001_create_tables.sql +0 -0
- {amochka-0.3.0 → amochka-0.3.1}/etl/run_etl.py +0 -0
- {amochka-0.3.0 → amochka-0.3.1}/etl/transformers.py +0 -0
- {amochka-0.3.0 → amochka-0.3.1}/setup.cfg +0 -0
- {amochka-0.3.0 → amochka-0.3.1}/tests/test_client.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: amochka
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.1
|
|
4
4
|
Summary: Python library for working with amoCRM API with ETL capabilities
|
|
5
5
|
Author-email: Timur <timurdt@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -39,88 +39,167 @@ Requires-Dist: python-dotenv>=1.0.0
|
|
|
39
39
|
- Редактирование сделок, включая обновление стандартных и кастомных полей
|
|
40
40
|
- Поддержку нескольких amoCRM-аккаунтов с персистентным кэшированием кастомных полей для каждого аккаунта отдельно
|
|
41
41
|
- Ограничение запросов (7 запросов в секунду) с использованием декораторов из библиотеки `ratelimit`
|
|
42
|
+
- **Полнофункциональный ETL модуль** для синхронизации данных amoCRM в PostgreSQL
|
|
42
43
|
|
|
43
|
-
|
|
44
|
+
## Возможности
|
|
45
|
+
|
|
46
|
+
### API клиент
|
|
44
47
|
|
|
45
48
|
- `get_deal_by_id(deal_id)` — получение детальной информации по сделке
|
|
46
49
|
- `get_pipelines()` — список воронок и статусов
|
|
47
50
|
- `fetch_updated_leads_raw(pipeline_id, updated_from, ...)` — выгрузка необработанных сделок за период
|
|
48
51
|
|
|
52
|
+
### ETL модуль
|
|
53
|
+
|
|
54
|
+
- **Extractors**: извлечение данных из amoCRM (сделки, контакты, события, примечания)
|
|
55
|
+
- **Transformers**: преобразование в табличный формат для БД
|
|
56
|
+
- **Loaders**: загрузка в PostgreSQL с UPSERT логикой и сохранением внутренних ID
|
|
57
|
+
- **Migrations**: автоматическое создание таблиц и схем
|
|
58
|
+
- **Incremental sync**: инкрементальная синхронизация по updated_at
|
|
59
|
+
- Интеграция с **Apache Airflow** для автоматизации ETL процессов
|
|
60
|
+
|
|
49
61
|
## Требования к окружению
|
|
50
62
|
|
|
51
|
-
Python 3.
|
|
63
|
+
Python 3.6 или новее.
|
|
52
64
|
|
|
53
65
|
## Установка
|
|
54
66
|
|
|
55
|
-
Установите зависимости командой:
|
|
56
|
-
|
|
57
67
|
```bash
|
|
58
|
-
pip install
|
|
68
|
+
pip install amochka
|
|
59
69
|
```
|
|
60
70
|
|
|
61
|
-
|
|
71
|
+
Для использования ETL модуля установите дополнительные зависимости:
|
|
62
72
|
|
|
63
73
|
```bash
|
|
64
|
-
pip install amochka
|
|
74
|
+
pip install amochka psycopg2-binary python-dotenv
|
|
65
75
|
```
|
|
66
76
|
|
|
67
77
|
## Кэширование кастомных полей
|
|
68
78
|
|
|
69
79
|
Для уменьшения количества запросов к API кастомные поля кэшируются персистентно. Если параметр cache_file не указан, имя файла кэша генерируется автоматически на основе домена amoCRM-аккаунта. Вы можете обновлять кэш принудительно, передавая параметр force_update=True в метод get_custom_fields_mapping() или настроить время жизни кэша (по умолчанию — 24 часа).
|
|
70
80
|
|
|
71
|
-
##
|
|
81
|
+
## Примеры использования
|
|
72
82
|
|
|
73
|
-
|
|
83
|
+
### Быстрый старт: выгрузка обновленных сделок
|
|
74
84
|
|
|
75
85
|
```python
|
|
76
86
|
from datetime import datetime, timedelta
|
|
77
87
|
from amochka import AmoCRMClient, CacheConfig
|
|
78
88
|
|
|
79
89
|
client = AmoCRMClient(
|
|
80
|
-
base_url="https://
|
|
81
|
-
token_file="
|
|
90
|
+
base_url="https://example.amocrm.ru",
|
|
91
|
+
token_file="token.json",
|
|
82
92
|
cache_config=CacheConfig.disabled(),
|
|
83
93
|
disable_logging=True
|
|
84
94
|
)
|
|
85
95
|
|
|
86
96
|
three_hours_ago = datetime.utcnow() - timedelta(hours=3)
|
|
87
|
-
client.fetch_updated_leads_raw(
|
|
97
|
+
leads = client.fetch_updated_leads_raw(
|
|
98
|
+
pipeline_id=123456,
|
|
99
|
+
updated_from=three_hours_ago,
|
|
100
|
+
save_to_file="leads.json",
|
|
101
|
+
include_contacts=True
|
|
102
|
+
)
|
|
88
103
|
```
|
|
89
104
|
|
|
90
|
-
|
|
105
|
+
### ETL: синхронизация в PostgreSQL
|
|
106
|
+
|
|
107
|
+
```python
|
|
108
|
+
from etl.config import DatabaseConfig, AmoCRMAccount
|
|
109
|
+
from etl.extractors import AmoCRMExtractor
|
|
110
|
+
from etl.loaders import PostgresLoader
|
|
111
|
+
from etl.run_etl import sync_leads_with_contacts
|
|
112
|
+
from datetime import datetime, timezone
|
|
113
|
+
|
|
114
|
+
# Настройка БД
|
|
115
|
+
db_config = DatabaseConfig(
|
|
116
|
+
host="localhost",
|
|
117
|
+
port=5432,
|
|
118
|
+
dbname="amocrm",
|
|
119
|
+
user="postgres",
|
|
120
|
+
password="password",
|
|
121
|
+
schema="public"
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
# Настройка amoCRM аккаунта
|
|
125
|
+
account = AmoCRMAccount(
|
|
126
|
+
id=1,
|
|
127
|
+
name="main",
|
|
128
|
+
base_url="https://example.amocrm.ru",
|
|
129
|
+
token_path="token.json",
|
|
130
|
+
mybi_account_id=1,
|
|
131
|
+
pipeline_ids=[123456]
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
# ETL процесс
|
|
135
|
+
loader = PostgresLoader(db_config)
|
|
136
|
+
extractor = AmoCRMExtractor(account)
|
|
137
|
+
|
|
138
|
+
result = sync_leads_with_contacts(
|
|
139
|
+
extractor=extractor,
|
|
140
|
+
loader=loader,
|
|
141
|
+
mybi_account_id=1,
|
|
142
|
+
updated_from=datetime(2025, 1, 1, tzinfo=timezone.utc),
|
|
143
|
+
updated_to=datetime.now(timezone.utc),
|
|
144
|
+
pipeline_ids=[123456]
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
print(f"Загружено сделок: {result['leads_count']}")
|
|
148
|
+
print(f"Загружено контактов: {result['contacts_count']}")
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Пример структуры данных
|
|
91
152
|
|
|
92
153
|
```json
|
|
93
154
|
[
|
|
94
155
|
{
|
|
95
|
-
"id":
|
|
96
|
-
"name": "
|
|
156
|
+
"id": 12345678,
|
|
157
|
+
"name": "Сделка: Заявка от клиента",
|
|
97
158
|
"custom_fields_values": [
|
|
98
159
|
{
|
|
99
|
-
"field_name": "
|
|
100
|
-
"values": [{"value": "
|
|
160
|
+
"field_name": "utm_source",
|
|
161
|
+
"values": [{"value": "google"}]
|
|
101
162
|
}
|
|
102
163
|
],
|
|
103
164
|
"_embedded": {
|
|
104
165
|
"tags": [
|
|
105
|
-
{"id":
|
|
166
|
+
{"id": 123, "name": "Приоритетный клиент"}
|
|
106
167
|
]
|
|
107
168
|
}
|
|
108
169
|
}
|
|
109
170
|
]
|
|
110
171
|
```
|
|
111
172
|
|
|
112
|
-
|
|
173
|
+
## Интеграция с Apache Airflow
|
|
174
|
+
|
|
175
|
+
Модуль ETL разработан для использования в Airflow DAG. Пример минимального DAG:
|
|
176
|
+
|
|
177
|
+
```python
|
|
178
|
+
from airflow.decorators import dag, task
|
|
179
|
+
from etl.config import DatabaseConfig, AmoCRMAccount
|
|
180
|
+
from etl.run_etl import sync_leads_with_contacts
|
|
181
|
+
|
|
182
|
+
@dag(schedule_interval=None)
|
|
183
|
+
def amocrm_sync():
|
|
184
|
+
@task
|
|
185
|
+
def sync_data():
|
|
186
|
+
db_config = DatabaseConfig.from_env()
|
|
187
|
+
account = AmoCRMAccount.from_env()
|
|
188
|
+
# ... ETL процесс
|
|
189
|
+
|
|
190
|
+
amocrm_sync()
|
|
191
|
+
```
|
|
113
192
|
|
|
114
193
|
## Тесты
|
|
115
194
|
|
|
116
|
-
|
|
195
|
+
Запустить тесты можно командой:
|
|
117
196
|
|
|
118
197
|
```bash
|
|
119
198
|
pytest -q
|
|
120
199
|
```
|
|
121
200
|
|
|
122
|
-
|
|
201
|
+
Тесты проверяют основную функциональность API клиента и помогают убедиться, что изменения в коде не ломают работу библиотеки.
|
|
123
202
|
|
|
124
|
-
##
|
|
203
|
+
## Лицензия
|
|
125
204
|
|
|
126
|
-
|
|
205
|
+
MIT
|
amochka-0.3.1/README.md
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
# amochka
|
|
2
|
+
|
|
3
|
+
Официальная документация API amocrm - https://www.amocrm.ru/developers/content/crm_platform/api-reference
|
|
4
|
+
|
|
5
|
+
**amochka** — библиотека для работы с API amoCRM на Python. Она поддерживает:
|
|
6
|
+
- Получение данных сделок с вложенными сущностями (контакты, компании, теги, и т.д.)
|
|
7
|
+
- Редактирование сделок, включая обновление стандартных и кастомных полей
|
|
8
|
+
- Поддержку нескольких amoCRM-аккаунтов с персистентным кэшированием кастомных полей для каждого аккаунта отдельно
|
|
9
|
+
- Ограничение запросов (7 запросов в секунду) с использованием декораторов из библиотеки `ratelimit`
|
|
10
|
+
- **Полнофункциональный ETL модуль** для синхронизации данных amoCRM в PostgreSQL
|
|
11
|
+
|
|
12
|
+
## Возможности
|
|
13
|
+
|
|
14
|
+
### API клиент
|
|
15
|
+
|
|
16
|
+
- `get_deal_by_id(deal_id)` — получение детальной информации по сделке
|
|
17
|
+
- `get_pipelines()` — список воронок и статусов
|
|
18
|
+
- `fetch_updated_leads_raw(pipeline_id, updated_from, ...)` — выгрузка необработанных сделок за период
|
|
19
|
+
|
|
20
|
+
### ETL модуль
|
|
21
|
+
|
|
22
|
+
- **Extractors**: извлечение данных из amoCRM (сделки, контакты, события, примечания)
|
|
23
|
+
- **Transformers**: преобразование в табличный формат для БД
|
|
24
|
+
- **Loaders**: загрузка в PostgreSQL с UPSERT логикой и сохранением внутренних ID
|
|
25
|
+
- **Migrations**: автоматическое создание таблиц и схем
|
|
26
|
+
- **Incremental sync**: инкрементальная синхронизация по updated_at
|
|
27
|
+
- Интеграция с **Apache Airflow** для автоматизации ETL процессов
|
|
28
|
+
|
|
29
|
+
## Требования к окружению
|
|
30
|
+
|
|
31
|
+
Python 3.6 или новее.
|
|
32
|
+
|
|
33
|
+
## Установка
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
pip install amochka
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Для использования ETL модуля установите дополнительные зависимости:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
pip install amochka psycopg2-binary python-dotenv
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## Кэширование кастомных полей
|
|
46
|
+
|
|
47
|
+
Для уменьшения количества запросов к API кастомные поля кэшируются персистентно. Если параметр cache_file не указан, имя файла кэша генерируется автоматически на основе домена amoCRM-аккаунта. Вы можете обновлять кэш принудительно, передавая параметр force_update=True в метод get_custom_fields_mapping() или настроить время жизни кэша (по умолчанию — 24 часа).
|
|
48
|
+
|
|
49
|
+
## Примеры использования
|
|
50
|
+
|
|
51
|
+
### Быстрый старт: выгрузка обновленных сделок
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
from datetime import datetime, timedelta
|
|
55
|
+
from amochka import AmoCRMClient, CacheConfig
|
|
56
|
+
|
|
57
|
+
client = AmoCRMClient(
|
|
58
|
+
base_url="https://example.amocrm.ru",
|
|
59
|
+
token_file="token.json",
|
|
60
|
+
cache_config=CacheConfig.disabled(),
|
|
61
|
+
disable_logging=True
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
three_hours_ago = datetime.utcnow() - timedelta(hours=3)
|
|
65
|
+
leads = client.fetch_updated_leads_raw(
|
|
66
|
+
pipeline_id=123456,
|
|
67
|
+
updated_from=three_hours_ago,
|
|
68
|
+
save_to_file="leads.json",
|
|
69
|
+
include_contacts=True
|
|
70
|
+
)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### ETL: синхронизация в PostgreSQL
|
|
74
|
+
|
|
75
|
+
```python
|
|
76
|
+
from etl.config import DatabaseConfig, AmoCRMAccount
|
|
77
|
+
from etl.extractors import AmoCRMExtractor
|
|
78
|
+
from etl.loaders import PostgresLoader
|
|
79
|
+
from etl.run_etl import sync_leads_with_contacts
|
|
80
|
+
from datetime import datetime, timezone
|
|
81
|
+
|
|
82
|
+
# Настройка БД
|
|
83
|
+
db_config = DatabaseConfig(
|
|
84
|
+
host="localhost",
|
|
85
|
+
port=5432,
|
|
86
|
+
dbname="amocrm",
|
|
87
|
+
user="postgres",
|
|
88
|
+
password="password",
|
|
89
|
+
schema="public"
|
|
90
|
+
)
|
|
91
|
+
|
|
92
|
+
# Настройка amoCRM аккаунта
|
|
93
|
+
account = AmoCRMAccount(
|
|
94
|
+
id=1,
|
|
95
|
+
name="main",
|
|
96
|
+
base_url="https://example.amocrm.ru",
|
|
97
|
+
token_path="token.json",
|
|
98
|
+
mybi_account_id=1,
|
|
99
|
+
pipeline_ids=[123456]
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
# ETL процесс
|
|
103
|
+
loader = PostgresLoader(db_config)
|
|
104
|
+
extractor = AmoCRMExtractor(account)
|
|
105
|
+
|
|
106
|
+
result = sync_leads_with_contacts(
|
|
107
|
+
extractor=extractor,
|
|
108
|
+
loader=loader,
|
|
109
|
+
mybi_account_id=1,
|
|
110
|
+
updated_from=datetime(2025, 1, 1, tzinfo=timezone.utc),
|
|
111
|
+
updated_to=datetime.now(timezone.utc),
|
|
112
|
+
pipeline_ids=[123456]
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
print(f"Загружено сделок: {result['leads_count']}")
|
|
116
|
+
print(f"Загружено контактов: {result['contacts_count']}")
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### Пример структуры данных
|
|
120
|
+
|
|
121
|
+
```json
|
|
122
|
+
[
|
|
123
|
+
{
|
|
124
|
+
"id": 12345678,
|
|
125
|
+
"name": "Сделка: Заявка от клиента",
|
|
126
|
+
"custom_fields_values": [
|
|
127
|
+
{
|
|
128
|
+
"field_name": "utm_source",
|
|
129
|
+
"values": [{"value": "google"}]
|
|
130
|
+
}
|
|
131
|
+
],
|
|
132
|
+
"_embedded": {
|
|
133
|
+
"tags": [
|
|
134
|
+
{"id": 123, "name": "Приоритетный клиент"}
|
|
135
|
+
]
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
]
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
## Интеграция с Apache Airflow
|
|
142
|
+
|
|
143
|
+
Модуль ETL разработан для использования в Airflow DAG. Пример минимального DAG:
|
|
144
|
+
|
|
145
|
+
```python
|
|
146
|
+
from airflow.decorators import dag, task
|
|
147
|
+
from etl.config import DatabaseConfig, AmoCRMAccount
|
|
148
|
+
from etl.run_etl import sync_leads_with_contacts
|
|
149
|
+
|
|
150
|
+
@dag(schedule_interval=None)
|
|
151
|
+
def amocrm_sync():
|
|
152
|
+
@task
|
|
153
|
+
def sync_data():
|
|
154
|
+
db_config = DatabaseConfig.from_env()
|
|
155
|
+
account = AmoCRMAccount.from_env()
|
|
156
|
+
# ... ETL процесс
|
|
157
|
+
|
|
158
|
+
amocrm_sync()
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Тесты
|
|
162
|
+
|
|
163
|
+
Запустить тесты можно командой:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
pytest -q
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Тесты проверяют основную функциональность API клиента и помогают убедиться, что изменения в коде не ломают работу библиотеки.
|
|
170
|
+
|
|
171
|
+
## Лицензия
|
|
172
|
+
|
|
173
|
+
MIT
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: amochka
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.1
|
|
4
4
|
Summary: Python library for working with amoCRM API with ETL capabilities
|
|
5
5
|
Author-email: Timur <timurdt@gmail.com>
|
|
6
6
|
License: MIT
|
|
@@ -39,88 +39,167 @@ Requires-Dist: python-dotenv>=1.0.0
|
|
|
39
39
|
- Редактирование сделок, включая обновление стандартных и кастомных полей
|
|
40
40
|
- Поддержку нескольких amoCRM-аккаунтов с персистентным кэшированием кастомных полей для каждого аккаунта отдельно
|
|
41
41
|
- Ограничение запросов (7 запросов в секунду) с использованием декораторов из библиотеки `ratelimit`
|
|
42
|
+
- **Полнофункциональный ETL модуль** для синхронизации данных amoCRM в PostgreSQL
|
|
42
43
|
|
|
43
|
-
|
|
44
|
+
## Возможности
|
|
45
|
+
|
|
46
|
+
### API клиент
|
|
44
47
|
|
|
45
48
|
- `get_deal_by_id(deal_id)` — получение детальной информации по сделке
|
|
46
49
|
- `get_pipelines()` — список воронок и статусов
|
|
47
50
|
- `fetch_updated_leads_raw(pipeline_id, updated_from, ...)` — выгрузка необработанных сделок за период
|
|
48
51
|
|
|
52
|
+
### ETL модуль
|
|
53
|
+
|
|
54
|
+
- **Extractors**: извлечение данных из amoCRM (сделки, контакты, события, примечания)
|
|
55
|
+
- **Transformers**: преобразование в табличный формат для БД
|
|
56
|
+
- **Loaders**: загрузка в PostgreSQL с UPSERT логикой и сохранением внутренних ID
|
|
57
|
+
- **Migrations**: автоматическое создание таблиц и схем
|
|
58
|
+
- **Incremental sync**: инкрементальная синхронизация по updated_at
|
|
59
|
+
- Интеграция с **Apache Airflow** для автоматизации ETL процессов
|
|
60
|
+
|
|
49
61
|
## Требования к окружению
|
|
50
62
|
|
|
51
|
-
Python 3.
|
|
63
|
+
Python 3.6 или новее.
|
|
52
64
|
|
|
53
65
|
## Установка
|
|
54
66
|
|
|
55
|
-
Установите зависимости командой:
|
|
56
|
-
|
|
57
67
|
```bash
|
|
58
|
-
pip install
|
|
68
|
+
pip install amochka
|
|
59
69
|
```
|
|
60
70
|
|
|
61
|
-
|
|
71
|
+
Для использования ETL модуля установите дополнительные зависимости:
|
|
62
72
|
|
|
63
73
|
```bash
|
|
64
|
-
pip install amochka
|
|
74
|
+
pip install amochka psycopg2-binary python-dotenv
|
|
65
75
|
```
|
|
66
76
|
|
|
67
77
|
## Кэширование кастомных полей
|
|
68
78
|
|
|
69
79
|
Для уменьшения количества запросов к API кастомные поля кэшируются персистентно. Если параметр cache_file не указан, имя файла кэша генерируется автоматически на основе домена amoCRM-аккаунта. Вы можете обновлять кэш принудительно, передавая параметр force_update=True в метод get_custom_fields_mapping() или настроить время жизни кэша (по умолчанию — 24 часа).
|
|
70
80
|
|
|
71
|
-
##
|
|
81
|
+
## Примеры использования
|
|
72
82
|
|
|
73
|
-
|
|
83
|
+
### Быстрый старт: выгрузка обновленных сделок
|
|
74
84
|
|
|
75
85
|
```python
|
|
76
86
|
from datetime import datetime, timedelta
|
|
77
87
|
from amochka import AmoCRMClient, CacheConfig
|
|
78
88
|
|
|
79
89
|
client = AmoCRMClient(
|
|
80
|
-
base_url="https://
|
|
81
|
-
token_file="
|
|
90
|
+
base_url="https://example.amocrm.ru",
|
|
91
|
+
token_file="token.json",
|
|
82
92
|
cache_config=CacheConfig.disabled(),
|
|
83
93
|
disable_logging=True
|
|
84
94
|
)
|
|
85
95
|
|
|
86
96
|
three_hours_ago = datetime.utcnow() - timedelta(hours=3)
|
|
87
|
-
client.fetch_updated_leads_raw(
|
|
97
|
+
leads = client.fetch_updated_leads_raw(
|
|
98
|
+
pipeline_id=123456,
|
|
99
|
+
updated_from=three_hours_ago,
|
|
100
|
+
save_to_file="leads.json",
|
|
101
|
+
include_contacts=True
|
|
102
|
+
)
|
|
88
103
|
```
|
|
89
104
|
|
|
90
|
-
|
|
105
|
+
### ETL: синхронизация в PostgreSQL
|
|
106
|
+
|
|
107
|
+
```python
|
|
108
|
+
from etl.config import DatabaseConfig, AmoCRMAccount
|
|
109
|
+
from etl.extractors import AmoCRMExtractor
|
|
110
|
+
from etl.loaders import PostgresLoader
|
|
111
|
+
from etl.run_etl import sync_leads_with_contacts
|
|
112
|
+
from datetime import datetime, timezone
|
|
113
|
+
|
|
114
|
+
# Настройка БД
|
|
115
|
+
db_config = DatabaseConfig(
|
|
116
|
+
host="localhost",
|
|
117
|
+
port=5432,
|
|
118
|
+
dbname="amocrm",
|
|
119
|
+
user="postgres",
|
|
120
|
+
password="password",
|
|
121
|
+
schema="public"
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
# Настройка amoCRM аккаунта
|
|
125
|
+
account = AmoCRMAccount(
|
|
126
|
+
id=1,
|
|
127
|
+
name="main",
|
|
128
|
+
base_url="https://example.amocrm.ru",
|
|
129
|
+
token_path="token.json",
|
|
130
|
+
mybi_account_id=1,
|
|
131
|
+
pipeline_ids=[123456]
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
# ETL процесс
|
|
135
|
+
loader = PostgresLoader(db_config)
|
|
136
|
+
extractor = AmoCRMExtractor(account)
|
|
137
|
+
|
|
138
|
+
result = sync_leads_with_contacts(
|
|
139
|
+
extractor=extractor,
|
|
140
|
+
loader=loader,
|
|
141
|
+
mybi_account_id=1,
|
|
142
|
+
updated_from=datetime(2025, 1, 1, tzinfo=timezone.utc),
|
|
143
|
+
updated_to=datetime.now(timezone.utc),
|
|
144
|
+
pipeline_ids=[123456]
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
print(f"Загружено сделок: {result['leads_count']}")
|
|
148
|
+
print(f"Загружено контактов: {result['contacts_count']}")
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Пример структуры данных
|
|
91
152
|
|
|
92
153
|
```json
|
|
93
154
|
[
|
|
94
155
|
{
|
|
95
|
-
"id":
|
|
96
|
-
"name": "
|
|
156
|
+
"id": 12345678,
|
|
157
|
+
"name": "Сделка: Заявка от клиента",
|
|
97
158
|
"custom_fields_values": [
|
|
98
159
|
{
|
|
99
|
-
"field_name": "
|
|
100
|
-
"values": [{"value": "
|
|
160
|
+
"field_name": "utm_source",
|
|
161
|
+
"values": [{"value": "google"}]
|
|
101
162
|
}
|
|
102
163
|
],
|
|
103
164
|
"_embedded": {
|
|
104
165
|
"tags": [
|
|
105
|
-
{"id":
|
|
166
|
+
{"id": 123, "name": "Приоритетный клиент"}
|
|
106
167
|
]
|
|
107
168
|
}
|
|
108
169
|
}
|
|
109
170
|
]
|
|
110
171
|
```
|
|
111
172
|
|
|
112
|
-
|
|
173
|
+
## Интеграция с Apache Airflow
|
|
174
|
+
|
|
175
|
+
Модуль ETL разработан для использования в Airflow DAG. Пример минимального DAG:
|
|
176
|
+
|
|
177
|
+
```python
|
|
178
|
+
from airflow.decorators import dag, task
|
|
179
|
+
from etl.config import DatabaseConfig, AmoCRMAccount
|
|
180
|
+
from etl.run_etl import sync_leads_with_contacts
|
|
181
|
+
|
|
182
|
+
@dag(schedule_interval=None)
|
|
183
|
+
def amocrm_sync():
|
|
184
|
+
@task
|
|
185
|
+
def sync_data():
|
|
186
|
+
db_config = DatabaseConfig.from_env()
|
|
187
|
+
account = AmoCRMAccount.from_env()
|
|
188
|
+
# ... ETL процесс
|
|
189
|
+
|
|
190
|
+
amocrm_sync()
|
|
191
|
+
```
|
|
113
192
|
|
|
114
193
|
## Тесты
|
|
115
194
|
|
|
116
|
-
|
|
195
|
+
Запустить тесты можно командой:
|
|
117
196
|
|
|
118
197
|
```bash
|
|
119
198
|
pytest -q
|
|
120
199
|
```
|
|
121
200
|
|
|
122
|
-
|
|
201
|
+
Тесты проверяют основную функциональность API клиента и помогают убедиться, что изменения в коде не ломают работу библиотеки.
|
|
123
202
|
|
|
124
|
-
##
|
|
203
|
+
## Лицензия
|
|
125
204
|
|
|
126
|
-
|
|
205
|
+
MIT
|
amochka-0.3.0/README.md
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
# amochka
|
|
2
|
-
|
|
3
|
-
Официальная документация API amocrm - https://www.amocrm.ru/developers/content/crm_platform/api-reference
|
|
4
|
-
|
|
5
|
-
**amochka** — библиотека для работы с API amoCRM на Python. Она поддерживает:
|
|
6
|
-
- Получение данных сделок с вложенными сущностями (контакты, компании, теги, и т.д.)
|
|
7
|
-
- Редактирование сделок, включая обновление стандартных и кастомных полей
|
|
8
|
-
- Поддержку нескольких amoCRM-аккаунтов с персистентным кэшированием кастомных полей для каждого аккаунта отдельно
|
|
9
|
-
- Ограничение запросов (7 запросов в секунду) с использованием декораторов из библиотеки `ratelimit`
|
|
10
|
-
|
|
11
|
-
### Основные функции
|
|
12
|
-
|
|
13
|
-
- `get_deal_by_id(deal_id)` — получение детальной информации по сделке
|
|
14
|
-
- `get_pipelines()` — список воронок и статусов
|
|
15
|
-
- `fetch_updated_leads_raw(pipeline_id, updated_from, ...)` — выгрузка необработанных сделок за период
|
|
16
|
-
|
|
17
|
-
## Требования к окружению
|
|
18
|
-
|
|
19
|
-
Python 3.8 или новее. Потребуются пакеты `requests` и `ratelimit`.
|
|
20
|
-
|
|
21
|
-
## Установка
|
|
22
|
-
|
|
23
|
-
Установите зависимости командой:
|
|
24
|
-
|
|
25
|
-
```bash
|
|
26
|
-
pip install requests ratelimit
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
Затем скопируйте репозиторий или установите пакет из PyPI (после публикации):
|
|
30
|
-
|
|
31
|
-
```bash
|
|
32
|
-
pip install amochka
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
## Кэширование кастомных полей
|
|
36
|
-
|
|
37
|
-
Для уменьшения количества запросов к API кастомные поля кэшируются персистентно. Если параметр cache_file не указан, имя файла кэша генерируется автоматически на основе домена amoCRM-аккаунта. Вы можете обновлять кэш принудительно, передавая параметр force_update=True в метод get_custom_fields_mapping() или настроить время жизни кэша (по умолчанию — 24 часа).
|
|
38
|
-
|
|
39
|
-
## Выгрузка обновленных сделок
|
|
40
|
-
|
|
41
|
-
Метод `fetch_updated_leads_raw()` позволяет получить все сделки из указанной воронки, которые были изменены в заданный промежуток времени. Результат можно сохранить в JSON-файл без какой‑либо обработки:
|
|
42
|
-
|
|
43
|
-
```python
|
|
44
|
-
from datetime import datetime, timedelta
|
|
45
|
-
from amochka import AmoCRMClient, CacheConfig
|
|
46
|
-
|
|
47
|
-
client = AmoCRMClient(
|
|
48
|
-
base_url="https://bneginskogo.amocrm.ru",
|
|
49
|
-
token_file="/path/to/token.json",
|
|
50
|
-
cache_config=CacheConfig.disabled(),
|
|
51
|
-
disable_logging=True
|
|
52
|
-
)
|
|
53
|
-
|
|
54
|
-
three_hours_ago = datetime.utcnow() - timedelta(hours=3)
|
|
55
|
-
client.fetch_updated_leads_raw(6241334, updated_from=three_hours_ago, save_to_file="leads.json")
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
Пример получаемого JSON (укороченный):
|
|
59
|
-
|
|
60
|
-
```json
|
|
61
|
-
[
|
|
62
|
-
{
|
|
63
|
-
"id": 26282337,
|
|
64
|
-
"name": "Автосделка: Заявка от (Максим Брокер Дубай Бюро Негинского)",
|
|
65
|
-
"custom_fields_values": [
|
|
66
|
-
{
|
|
67
|
-
"field_name": "roistat",
|
|
68
|
-
"values": [{"value": "2026"}]
|
|
69
|
-
}
|
|
70
|
-
],
|
|
71
|
-
"_embedded": {
|
|
72
|
-
"tags": [
|
|
73
|
-
{"id": 179813, "name": "WZ (Федор 971568113315)"}
|
|
74
|
-
]
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
]
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
Для подключения к реальному аккаунту сохраните JSON с OAuth‑токеном и укажите его путь в параметре `token_file` при создании клиента. Базовый URL можно взять из переменной окружения `AMO_BASE_URL`.
|
|
81
|
-
|
|
82
|
-
## Тесты
|
|
83
|
-
|
|
84
|
-
Файл `tests/test_client.py` содержит небольшой набор автоматических тестов, написанных на [pytest](https://docs.pytest.org/). Они запускают методы клиента на подставном классе `DummyClient` и проверяют, что функции работают так, как ожидается. Запустить тесты можно командой:
|
|
85
|
-
|
|
86
|
-
```bash
|
|
87
|
-
pytest -q
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
Эти тесты помогают убедиться, что изменения в коде не ломают основную функциональность.
|
|
91
|
-
|
|
92
|
-
## Пример использования `fetch_updated_leads_raw`
|
|
93
|
-
|
|
94
|
-
Кроме примера в разделе выше, код из `example_fetch.py` демонстрирует полный процесс получения сделок и сохранения их в файл.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|