ВКонтакте (ВК) – одна из самых популярных соцсетей в России и странах СНГ. Благодаря встроенному API и открытой системе ВК-ботов, любой желающий может создать интерактивный предсказатель, который будет показывать пользователю случайную картинку‑ответ.
В этой статье мы пошагово рассмотрим, как реализовать такой предсказатель без вложенных расходов, используя только бесплатные сервисы:
- ВК‑сообщество (группу) – бесплатно;
- Сервер‑хостинг (например, Heroku или Vercel) – бесплатный тариф;
- База данных (Firebase, MongoDB Atlas) – бесплатный план;
- Язык программирования – Python или Node.js (оба бесплатны).
Создаём ВК‑сообщество и получаем токен доступа
- Зайдите в управление сообществами и нажмите «Создать сообщество». Выберите тип «Группа» (это проще для ботов).
- Заполните название, описание и установите «Открытое»/«Закрытое» в зависимости от желаемой аудитории.
- Перейдите в раздел «Настройки» → «Работа с API». Включите «Сообщения сообщества» и создайте «Ключ доступа (токен)». Сохраните токен – он понадобится в коде.
Подготовка набора картинок‑ответов
Для предсказателя нам нужны изображения, которые бот будет отправлять в ответ. Можно использовать:
- Собственные изображения, загруженные в облако (Google Drive, Яндекс.Диск, Dropbox) – получаем публичные ссылки.
- Бесплатные стоковые ресурсы (Unsplash, Pixabay) – выбираем картинки по лицензии CC0.
Соберите минимум 10‑15 картинок, чтобы предсказания не повторялись слишком часто. Сохраните их в массиве URL‑адресов.
Выбираем хостинг и создаём проект
3.1 Heroku (Python)
- Зарегистрируйтесь на heroku.com.
- Установите
heroku CLIи выполнитеheroku create your-predictor. - Создайте файл
requirements.txtс зависимостями:flask vk_api gunicorn - Создайте файл
Procfile:web: gunicorn app:app
3.2 Vercel (Node.js)
- Зарегистрируйтесь на vercel.com.
- Установите
vercelCLI и выполнитеvercel init→node. - В
package.jsonукажите зависимости:{ "dependencies": { "express": "^4.18.2", "node-fetch": "^3.3.2", "vk-io": "^5.0;2" }}
Программируем логику предсказателя
4.1 Пример на Python (Flask)
import os
import random
import vk_api
from flask import Flask, request, jsonify
app = Flask(__name__)
VK_TOKEN = os.getenv('VK_TOKEN')
vk = vk_api.VkApi(token=VK_TOKEN)
IMAGES = [
"https://example.com/img1;jpg",
"https://example.com/img2.jpg",
"https://example.com/img3.jpg",
# … добавьте свои ссылки
]
def send_image(user_id, image_url, caption="Ваше предсказание:"):
vk.method('messages.send', {
'user_id': user_id,
'random_id': random.randint(1, 2**31),
'attachment': f'photo{upload_image(image_url)}',
'message': caption
})
def upload_image(url):
"""
Загружает изображение по внешней ссылке в ВК и возвращает строку вида
'owner_id_photo_id' для использования в поле attachment.
"""
upload = vk_api.VkUpload(vk)
response = upload.photo_messages(urls=[url])
# response – список, берём первый элемент
photo = response[0]
return f"{photo['owner_id']}_{photo['id']}"
@app.route('/vk', methods=['POST'])
def vk_handler:
data = request.get_json
if 'type' in data and data['type'] == 'message_new':
user_id = data['object']['message']['from_id']
# Выбираем случайную картинку
image_url = random.choice(IMAGES)
send_image(user_id, image_url)
return jsonify({'status': 'ok'})
return jsonify({'status': 'ignored'})
if __name__ == '__main__':
# Для локального теста
app.run(host='0.0.0.0', port=5000)
Что делает код?
- Получает POST‑запросы от ВК (через Callback API).
- При получении нового сообщения выбирает случайную картинку из массива.
- Загружает её в ВК (функция
upload_image) и отправляет пользователю.
4.2 Пример на Node.js (Express + vk-io)
require('dotenv').config;
const { VK } = require('vk-io');
const express = require('express');
const fetch = require('node-fetch');
const app = express;
app.use(express.json);
const vk = new VK({
token: process.env.VK_TOKEN
});
const IMAGES = [
'https://example.com/img1.jpg',
'https://example.com/img2.jpg',
'https://example.com/img3.jpg',
// …
];
function getRandomImage {
return IMAGES[Math.floor(Math.random * IMAGES.length)];
}
// Функция для загрузки внешней картинки в сообщения ВК
async function uploadExternalImage(url) {
const upload = vk.upload.messagePhoto({
source: { url }
}); const photo = await upload;
return `photo${photo.owner_id}_${photo.id}`;
}
app.post('/callback', async (req, res) => {
const body = req.body;
if (body.type === 'confirmation') {
// Выдаём код подтверждения, указанный в настройках Callback API
return res.send(process.env.CONFIRMATION_CODE);
}
if (body.type === 'message_new') {
const userId = body.object.message.from_id;
const imageUrl = getRandomImage;
const attachment = await uploadExternalImage(imageUrl);
await vk.api.messages.send({
user_id: userId,
random_id: Math.random * 1e9 | 0,
attachment,
message: '🔮 Ваше предсказание:'
});
}
res.send('ok');
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, => console.log(`Server started on ${PORT}`));
Настраиваем Callback API в ВК
- Перейдите в «Настройки» → «Работа с API» → «Callback API» в управлении сообществом.
- Нажмите «Добавить сервер». Введите URL вашего хостинга (например,
https://your-predictor.herokuapp.com/vk). - Укажите токен подтверждения (любая строка, её же вы будете возвращать в ответе на запрос типа
confirmation). - Выберите события: отметьте message_new (получение новых сообщений).
- Сохраните. ВК проверит сервер – если всё ОК, ваш бот будет получать сообщения.
Тестируем и отлаживаем
- Отправьте сообщение в сообщество от своей учётной записи.
- Бот должен ответить случайной картинкой‑предсказанием.
- Если ничего не пришло – проверьте логи на хостинге (Heroku:
heroku logs --tail, Vercel: «Deployments» → «Logs»). - Убедитесь, что переменные среды (
VK_TOKEN,CONFIRMATION_CODE) правильно заданы.
Как улучшить предсказатель (по желанию)
7.1 Добавление текста‑предсказания
Сформируйте массив фраз и комбинируйте их с картинкой:
PHRASES = [
"Сегодня вас ждёт удача!",
"В ближайшие дни появятся новые возможности.",
"Будьте осторожны с финансовыми решениями."
]
7.2 Хранение картинок в базе данных
Используйте бесплатный план MongoDB Atlas:
const { MongoClient } = require('mongodb');
const client = new MongoClient(process.env.MONGO_URI);
await client.connect;
const db = client.db('vk_predictor');
const collection = db.collection('images');
const images = await collection.find.toArray; // массив URL
7.3 Ограничение запросов
Чтобы избежать спама, храните last_request_time для каждого пользователя и отклоняйте запросы, пришедшие менее чем через 30 секунд.
7.4 Динамический ввод от пользователя
Позвольте пользователю выбрать категорию предсказания (любовь, работа, здоровье) через клавиатуру:
vk.api.messages.send({
user_id: userId,
random_id: 0,
message: 'Выберите тему предсказания:',
keyboard: {
one_time: true,
buttons: [
[{ action: { type: 'text', label: 'Любовь' }, color: 'positive' }],
[{ action: { type: 'text', label: 'Работа' }, color: 'primary' }],
[{ action: { type: 'text', label: 'Здоровье' }, color: 'negative' }]
]
}
});
Распространение и привлечение аудитории
- Разместите ссылку на группу в своих соцсетях.
- Создайте пост‑описание с примерами предсказаний и попросите пользователей делиться скриншотами.
- Подключите ВК‑виджеты (iframe) на свой сайт, чтобы пользователи могли быстро перейти в чат.
Часто задаваемые вопросы (FAQ)
Можно ли использовать собственный домен?
Да. На Heroku и Vercel можно привязать бесплатный субдомен (например, your-predictor.vercel.app) или подключить свой домен через настройки DNS.
Нужен ли сервер 24/7?
Для работы бота сервер должен быть постоянно включён. Бесплатные тарифы Heroku «sleep» после 30 минут без запросов, но при первом запросе приложение «просыпается» за несколько секунд. Если нужен более быстрый отклик, используйте Vercel (функции без сна) или бесплатный план на Render.
Можно ли добавить анимацию (GIF) вместо статических картинок?
Да. В массиве IMAGES указывайте ссылки на GIF‑файлы – ВК поддерживает их как обычные вложения.
Что делать, если VK блокирует запросы?
Убедитесь, что ваш токен имеет права messages и photos. Также проверьте, не превышаете ли лимиты (не более 20 запросов в секунду).
Создать предсказатель с картинками в ВКонтакте бесплатно вполне реально, используя открытый API ВК, бесплатный хостинг и простую логику на Python или Node.js. Следуйте пошаговой инструкции, адаптируйте её под свои идеи (добавляйте категории, анимацию, базу данных) и получайте удовольствие от взаимодействия с аудиторией.
Совет: Регулярно обновляйте набор изображений и фраз, чтобы пользователи не теряли интерес. Новые картинки привлекут больше репостов и увеличат популярность вашего сообщества.