Go-сервис для поиска кратчайшей цепочки знакомств между двумя пользователями VK через граф друзей и двусторонний BFS.
VK API · Алгоритм · API · Быстрый-старт
VKGraph — небольшой backend-проект на Go, который работает с социальным графом VK.
Пользователь вводит два VK ID, сервис получает списки друзей через VK API и ищет кратчайший путь между людьми: кто через кого связан. По сути, это мини-версия идеи «теории шести рукопожатий», но поверх реального графа друзей.
Проект, на мой взгляд, интересен тем, что здесь есть не просто CRUD или работа с API, а реальная алгоритмическая задача: обход графа с внешними API-вызовами, восстановление пути и отдача результата через HTTP.
- подключение к VK API через access token;
- получение списка друзей пользователя;
- получение информации о пользователях: имя, ссылка, аватар, пол;
- поиск кратчайшего пути между двумя пользователями VK;
- двусторонний BFS для ускорения поиска;
- восстановление найденного пути;
- HTTP API на Go;
- простой web-интерфейс для ввода двух ID;
- базовые тесты для графовой логики и VK client слоя.
VK ID A + VK ID B
↓
Backend получает друзей A и B через VK API
↓
Запускается bidirectional BFS
↓
Поиск идет одновременно от A и от B
↓
Когда фронты поиска пересекаются — путь найден
↓
Backend восстанавливает цепочку пользователей
↓
Frontend показывает кратчайший путь
flowchart TD
A["Web UI"] --> B["Go HTTP Server"]
B --> C["gorilla/mux router"]
C --> D["/friends/{userID}"]
C --> E["/friends/{userIDa}/{userIDb}"]
C --> F["/friends/info/{userIDa}/{userIDb}"]
D --> G["VK client"]
E --> H["Bidirectional BFS"]
F --> H
H --> G
G --> I["VK API"]
H --> J["Shortest path: IDs"]
F --> K["User details"]
K --> L["JSON response"]
Обычный BFS от одного пользователя может быстро стать тяжелым: социальный граф широкий, у каждого пользователя могут быть сотни друзей, а каждый шаг требует внешних API-вызовов.
Поэтому используется двусторонний BFS:
start user → → →
встреча
end user ← ← ←
Вместо того чтобы идти только от первого пользователя, алгоритм одновременно расширяет поиск с двух сторон. Когда один фронт встречает уже посещенную вершину из другого фронта, путь найден.
В проекте это вынесено в отдельную графовую логику:
bidirectionalSearch— основной поиск;bfsStep— один шаг BFS;mergePaths— склейка двух половин пути;backtrace— восстановление маршрута по map предыдущих вершин.
GET /friends/{userID}Возвращает список друзей пользователя с базовой информацией.
GET /friends/{userIDa}/{userIDb}Возвращает путь как список VK ID.
GET /friends/info/{userIDa}/{userIDb}Возвращает путь с именами, аватарами и ссылками на профили.
Пример ответа:
[
{
"id": 1,
"name": "User A",
"source": "https://vk.com/id1",
"photo": "https://...",
"sex": 2
},
{
"id": 2,
"name": "Mutual Friend",
"source": "https://vk.com/id2",
"photo": "https://...",
"sex": 1
},
{
"id": 3,
"name": "User B",
"source": "https://vk.com/id3",
"photo": "https://...",
"sex": 1
}
]| Область | Технологии |
|---|---|
| Язык | Go 1.22 |
| HTTP router | gorilla/mux |
| VK integration | SevereCloud/vksdk |
| Config | godotenv, .env |
| Algorithm | bidirectional BFS |
| Frontend | HTML, CSS, JavaScript |
.
├── main.go # запуск сервера, маршруты, static files
├── go.mod # Go module и зависимости
├── src/
│ ├── graph.go # bidirectional BFS и восстановление пути
│ ├── handlers.go # HTTP handlers
│ ├── models.go # модели ответа
│ ├── vk_client.go # работа с VK API
│ ├── graph_test.go # тесты графовой логики
│ └── vk_client_test.go
└── static/
├── index.html # web-форма
├── script.js # запросы к backend
└── style.css
git clone https://github.com/Optoed/VKGraph.git
cd VKGraphСейчас основной код находится в ветке
visual. Если GitHub открывает не ее, переключись:
git checkout visualACCESS_TOKEN=your_vk_access_token_hereТокен нужен для запросов к VK API.
go mod downloadgo run main.goСервер запускается на:
http://localhost:8081
Через браузер:
http://localhost:8081
Через HTTP API:
curl http://localhost:8081/friends/info/USER_ID_A/USER_ID_BГде USER_ID_A и USER_ID_B — числовые VK ID пользователей.
- VK API может ограничивать количество запросов;
- закрытые профили и приватные списки друзей могут ломать полноту графа;
- поиск по большому социальному графу может быть медленным без кэша;
- проект рассчитан на исследование графовой логики и интеграции с VK API, а не на production-нагрузку.
- добавить кэширование друзей, чтобы не дергать VK API повторно;
- добавить лимит глубины поиска;
- добавить rate limiting и обработку ошибок VK API;
- визуализировать путь как граф, а не только как список;
- добавить Dockerfile;
- добавить Swagger/OpenAPI;
- улучшить frontend: карточки пользователей, аватары, ссылки, loader;
- добавить хранение уже найденных путей.
Проект создан как развлекательная практическая работа с Go, VK API и алгоритмами на графах.
MIT License.