Бот ВКонтакте с нейросетью: Bots Long Poll API и Claude на Python

Собираем бота для сообщества ВКонтакте, который отвечает через Claude: настройка сообщества, Bots Long Poll API, учёт расходов по usage и полный код.

5 мин · · разработка · автоматизация

Бот ВКонтакте с нейросетью отвечает подписчикам сообщества в личных сообщениях: консультирует по товарам, отвечает на типовые вопросы, принимает заявки. Ниже — бот на Python, который получает сообщения через Bots Long Poll API, отправляет их в Claude через Zukko и следит, чтобы один пользователь не потратил больше заданного бюджета. Внешний сервер и открытый порт не нужны: бот сам опрашивает ВКонтакте.

Настройка сообщества

Все шаги ниже — по официальной документации VK для разработчиков. Названия пунктов меню ВКонтакте иногда меняет, поэтому при расхождениях сверяйтесь с ней.

  1. Включите сообщения и возможности ботов. В сообществе: «Управление» → «Сообщения» — включите сообщения; там же в «Настройках для бота» включите «Возможности ботов».
  2. Создайте ключ доступа. «Управление» → «Дополнительно» → «Работа с API» → «Создать ключ». Отметьте права на сообщения сообщества и на управление сообществом: метод groups.getLongPollServer требует право manage, а messages.send — право messages.
  3. Включите Long Poll. В том же разделе на вкладке Long Poll API выберите «Включено», а в «Типах событий» отметьте «Входящее сообщение» (message_new).
  4. Узнайте ID сообщества — число из адреса вида club123456789 или из настроек сообщества.

Ключ Zukko вида fetch_... создайте в кабинете. Для бота удобно завести отдельный ключ с дневным лимитом в долларах — тогда даже ошибка в коде не потратит больше лимита.

Установка и переменные окружения

bash
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 работает в три шага:

  1. Метод groups.getLongPollServer возвращает server, key и ts.
  2. Бот делает запрос {server}?act=a_check&key={key}&ts={ts}&wait=25. Сервер держит соединение до 25 секунд и возвращает новые события в массиве updates и новый ts.
  3. Следующий запрос идёт уже с новым 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) токенов. Умножаем их на цену модели и копим сумму по пользователю за день:

bash
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.

Это оценка на стороне бота. Точные списания видны в кабинете в разделе «Использование», а жёсткий потолок для всего бота задаётся лимитами ключа.

Полный код

bash
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.301M
gpt-5.6-sol$0.30 / $0.301M
gpt-5.6-luna$0.10 / $0.101M
glm-5.3-flash$0.04 / $0.04128K

Актуальный список — 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.