Бот ВКонтакте с нейросетью: Bots Long Poll API и Claude на Python
Собираем бота для сообщества ВКонтакте, который отвечает через Claude: настройка сообщества, Bots Long Poll API, учёт расходов по usage и полный код.
5 мин · · разработка · автоматизация
Бот ВКонтакте с нейросетью отвечает подписчикам сообщества в личных сообщениях: консультирует по товарам, отвечает на типовые вопросы, принимает заявки. Ниже — бот на Python, который получает сообщения через Bots Long Poll API, отправляет их в Claude через Zukko и следит, чтобы один пользователь не потратил больше заданного бюджета. Внешний сервер и открытый порт не нужны: бот сам опрашивает ВКонтакте.
Настройка сообщества
Все шаги ниже — по официальной документации VK для разработчиков. Названия пунктов меню ВКонтакте иногда меняет, поэтому при расхождениях сверяйтесь с ней.
- Включите сообщения и возможности ботов. В сообществе: «Управление» → «Сообщения» — включите сообщения; там же в «Настройках для бота» включите «Возможности ботов».
- Создайте ключ доступа. «Управление» → «Дополнительно» → «Работа с API» → «Создать ключ». Отметьте права на сообщения сообщества и на управление сообществом: метод
groups.getLongPollServerтребует правоmanage, аmessages.send— правоmessages. - Включите Long Poll. В том же разделе на вкладке Long Poll API выберите «Включено», а в «Типах событий» отметьте «Входящее сообщение» (
message_new). - Узнайте ID сообщества — число из адреса вида
club123456789или из настроек сообщества.
Ключ Zukko вида fetch_... создайте в кабинете. Для бота удобно завести отдельный ключ с дневным лимитом в долларах — тогда даже ошибка в коде не потратит больше лимита.
Установка и переменные окружения
pip install requests openai python-dotenvФайл .env:
VK_GROUP_ID=123456789
VK_TOKEN=vk1.a.ваш_ключ_сообщества
ZUKKO_API_KEY=fetch_...
ZUKKO_MODEL=claude-sonnet-5
Как работает бот ВКонтакте с нейросетью
Bots Long Poll API работает в три шага:
- Метод
groups.getLongPollServerвозвращаетserver,keyиts. - Бот делает запрос
{server}?act=a_check&key={key}&ts={ts}&wait=25. Сервер держит соединение до 25 секунд и возвращает новые события в массивеupdatesи новыйts. - Следующий запрос идёт уже с новым
ts.
Каждое событие — объект с полями type, object, group_id. Для входящего сообщения type равен message_new, а само сообщение лежит в object.message (так с версии API 5.103): текст в text, адрес диалога в peer_id. Код из старых примеров вида event[0] == 4 относится к User Long Poll и для ботов сообществ не подходит.
Сервер может ответить ошибкой:
| Ответ | Что делать |
|---|---|
{"failed": 1, "ts": ...} | взять новый ts из ответа и продолжать |
{"failed": 2} | ключ истёк — заново вызвать groups.getLongPollServer |
{"failed": 3} | информация утеряна — заново получить key и ts |
Методы API вызываются на домене api.vk.ru, ключ передаётся в заголовке Authorization: Bearer ... — так сейчас рекомендует документация VK. Для messages.send обязателен random_id: случайное число в пределах int32, которое защищает от повторной отправки. Максимальная длина текста — 9000 символов, длинные ответы режем на части.
Учёт расходов на пользователя
Ответ API содержит поле usage с числом входных (prompt_tokens) и выходных (completion_tokens) токенов. Умножаем их на цену модели и копим сумму по пользователю за день:
cost = (usage.prompt_tokens * PRICE_IN + usage.completion_tokens * PRICE_OUT) / 1_000_000Для claude-sonnet-5 цена в Zukko — $0.30 за 1M входных и $0.30 за 1M выходных токенов. Если сообщение с историей занимает 2 000 входных токенов, а ответ — 500 выходных, то стоимость: (2 000 × 0.30 + 500 × 0.30) / 1 000 000 = $0.00075. При бюджете $0.05 в день на пользователя это примерно 0.05 / 0.00075 ≈ 66 таких сообщений. Цены остальных моделей — в таблице ниже; если меняете модель, поменяйте и PRICE_IN/PRICE_OUT.
Это оценка на стороне бота. Точные списания видны в кабинете в разделе «Использование», а жёсткий потолок для всего бота задаётся лимитами ключа.
Полный код
import os
import random
import time
from datetime import date
import requests
from dotenv import load_dotenv
from openai import APIConnectionError, APIStatusError, OpenAI
load_dotenv()
VK_API = "https://api.vk.ru/method/"
VK_VERSION = "5.199"
VK_TOKEN = os.environ["VK_TOKEN"]Запуск: python vk_bot.py. Напишите сообществу в личные сообщения — бот ответит.
Пара замечаний к коду. Сообщения обрабатываются по очереди: пока модель отвечает одному пользователю, остальные ждут. Для небольшого сообщества этого хватает; при большой нагрузке выносите handle() в пул потоков или переписывайте на asyncio с AsyncOpenAI и асинхронным HTTP-клиентом. История и расходы хранятся в памяти и пропадут после перезапуска — для продакшена переносите их в Redis или базу.
Какую модель выбрать
| Модель | Цена в Zukko, вход/выход за 1M токенов | Контекст |
|---|---|---|
claude-sonnet-5 | $0.30 / $0.30 | 1M |
gpt-5.6-sol | $0.30 / $0.30 | 1M |
gpt-5.6-luna | $0.10 / $0.10 | 1M |
glm-5.3-flash | $0.04 / $0.04 | 128K |
Актуальный список — GET https://api.zukko.pro/v1/models или страница «Модели» в кабинете. Какая модель лучше отвечает вашим подписчикам, проверьте на своих задачах: соберите 20–30 реальных вопросов из сообщений сообщества и сравните ответы двух-трёх моделей с одним и тем же системным промптом.
Частые вопросы
Бот не получает сообщения — что проверить?
Включён ли Long Poll API в настройках сообщества и отмечен ли тип события «Входящее сообщение». Есть ли у ключа права на сообщения и управление (без manage метод groups.getLongPollServer вернёт ошибку). Включены ли сообщения сообщества. Код печатает текст ошибки VK — начните с него.
Почему ответ приходит с задержкой?
Модели нужно время на генерацию, плюс сообщения обрабатываются по очереди. Уменьшите max_tokens, попросите в системном промпте отвечать короче или распараллельте обработку.
Можно ли добавить бота в беседу?
Да, это включается в настройках бота сообщества. По умолчанию в беседе бот видит только упоминания и ответы на свои сообщения. В коде ничего менять не нужно: ответ уходит в peer_id беседы, история тоже ведётся по нему.
Как ограничить общие расходы, а не только на пользователя?
Задайте дневной и месячный лимит в долларах самому ключу Zukko в кабинете. Когда лимит исчерпан, API вернёт ошибку, и бот покажет пользователю сообщение из ERRORS. Подробнее — в документации по ключам.
zukko
Платите в 25×
меньше
за Claude Code & ChatGPT
Один ключ fetch_* и base URL api.zukko.pro — в Cursor, Claude Code, Codex и любом SDK.
Похожие статьи
- Перевод субтитров нейросетью: SRT без сбитых таймкодовГлавный риск при переводе SRT нейросетью — сломанная структура файла. Показываем схему, где таймкоды не попадают к модели, и скрипт на Python с проверкой.
- Редактирование текстов нейросетью: корректура, стиль и сокращениеРазные виды редактуры требуют разных промптов. Показываем формулировки для корректуры, стиля и сокращения, как получать правки с объяснением и не терять авторский голос.
- Нейросеть для написания скриптов: Bash, PowerShell и PythonМодель быстро пишет скрипты для рутины, но запускать их вслепую нельзя. Показываем, как ставить задачу, требовать безопасный режим dry-run и проверять результат до запуска.
- Dify в Docker: установка, первичная настройка и подключение моделейСтавим Dify через Docker Compose, создаём администратора и подключаем модели Claude, GPT и DeepSeek по одному ключу. Отдельно — что делать, если контейнеры не стартуют.