В статье разберём, как связать бота с CRM (AmoCRM, Bitrix24) и 1С: заявки из бота попадают в воронку, заказы уходят в учётную систему, а в бота можно подтягивать остатки и цены. Примеры на Python (aiohttp).
Как это устроено
Бот при действии пользователя (заявка, заказ, ответ в форме) отправляет данные в API CRM или 1С — обычно REST с JSON. Для HTTP-запросов в Python удобна библиотека aiohttp. В обратную сторону: запрос из бота к вашему API 1С или CRM (остатки, цены), ответ парсится и показывается в чате.
Пример: лид в AmoCRM
Токен и ID полей берутся в AmoCRM: настройки → интеграции (токен), настройки → поля сделки/лида — field_id для телефона и для Telegram ID (если создали такое поле). Документация: AmoCRM API — лиды. Пример создания лида:
import aiohttp
AMO_API = "https://yourdomain.amocrm.ru/api/v4"
AMO_TOKEN = "..." # от интеграции или OAuth
async def create_lead(name: str, phone: str, telegram_id: int):
async with aiohttp.ClientSession() as session:
async with session.post(
f"{AMO_API}/leads",
headers={
"Authorization": f"Bearer {AMO_TOKEN}",
"Content-Type": "application/json",
},
json={
"name": f"Заявка из бота: {name}",
"custom_fields_values": [
{"field_id": 123, "values": [{"value": phone}]}, # 123 — ID поля «Телефон»
{"field_id": 456, "values": [{"value": str(telegram_id)}]}, # 456 — ID поля «Telegram»
],
},
) as resp:
if resp.status in (200, 201):
return await resp.json()
return None # иначе логировать resp.status и текст
В хендлере бота после сбора имени и телефона вызываете await create_lead(name, phone, message.from_user.id) и затем отправляете пользователю «Заявка принята».
Пример: запрос к 1С
Если у вас есть HTTP-API 1С (или прослойка), остатки/цены можно получать GET- или POST-запросом. Ответ парсите и формируете сообщение в боте. Пример GET:
async def get_product_stock(product_id: str) -> dict | None:
async with aiohttp.ClientSession() as session:
async with session.get(
f"https://your-1c-api.example/stock",
params={"id": product_id},
headers={"Authorization": "Bearer YOUR_1C_TOKEN"},
) as resp:
if resp.status == 200:
return await resp.json() # например {"quantity": 5, "price": 1000}
return None
# В хендлере бота:
data = await get_product_stock("item_123")
if data:
await message.answer(f"В наличии: {data['quantity']} шт., цена {data['price']} ₽")
Типичные сценарии
- Лиды в CRM: форма в боте → создание лида/сделки в AmoCRM, Bitrix24 и т.п.
- Заказы в 1С: оформление в боте → документ заказа или заявка в 1С
- Справочники из 1С: товары, цены, остатки для каталога в боте
Итоги
Интеграция с CRM и 1С делается через их API: бот отправляет или запрашивает данные по HTTP. Важно продумать формат данных и обработку ошибок (недоступность API, неверный ответ).