Skip to content

srgykuz/vk-proxy

Repository files navigation

vk-proxy

Проксирование трафика через ВКонтакте используя VK API. Цель этого проекта - обход белого списка и получение минимального доступа к глобальному интернету.

vk-proxy не может быть использован для полноценной замены VPN и прокси. VK API имеет жесткие ограничения, поэтому с помощью этой программы вы едва сможете использовать, например, Google или Wikipedia, не говоря уже о более ресурсоемких сайтах и приложениях. Telegram будет работать только в текстовом режиме.

Передаваемый трафик зашифрован только если вы используете защищенное соединение (например, HTTPS): ВКонтакте не сможет прочитать то, что вы передаете. Не рекомендуется использовать незащищенное соединение (например, HTTP): ваш трафик может быть легко прочитан.

Для установки потребуется аккаунт ВКонтакте с подтвержденным номером телефона и двухфакторной аутентификацией. Нужно будет создать сообщество и выдать ключ доступа к нему. Опционально нужно будет выдать ключ доступа к аккаунту. Все ключи доступны только вам и не передаются куда-либо.

Программа должна быть запущена в двух местах: на устройстве в условиях белого списка и на устройстве за пределами белого списка. Второе устройство не обязательно должно быть сервером с публичным статическим айпи. Например, можно запустить программу на телефоне с мобильным интернетом, где белые списки действуют, и на компьютере с проводным интернетом, где белые списки не действуют.

Установка

Выполните установку в следующем порядке:

  1. сообщество
  2. аккаунт
  3. устройство за пределами белого списка
  4. устройство в условиях белого списка

Конфиг на устройствах должен быть одинаковыми, за исключением нескольких настроек не влияющих на передачу данных, иначе программа будет работать некорректно.

Программа может быть запущена как постоянно, так и по необходимости.

Сообщество

1. Создайте

Откройте ВКонтакте, нажмите Сообщества, нажмите Создать сообщество, введите любое название и тематику, нажмите Создать сообщество, нажмите Перейти в сообщество.

Адресная строка будет иметь вид https://vk.com/club12345, где 12345 - ID сообщества. Сохраните этот ID и название сообщества.

2. Настройте

Нажмите Сообщение, напишите что-нибудь, нажмите Отправить, отключите уведомления. Вернитесь обратно на страницу сообщества, нажав два раза на название сообщества.

Предварительно скачайте stub.jpg. Нажмите Фото, нажмите Добавить фото, выберите stub.jpg. Нажмите на загруженное фото. Адресная строка будет иметь вид https://vk.com/album-12345_6789?z=photo-12345_9876, где 6789 - это ID альбома, а 9876 - это ID фото. Сохраните оба ID. Вернитесь обратно, нажав на название сообщества.

Предварительно скачайте stub.mp4. Нажмите Видео, наведите на Добавить, нажмите Добавить видео, нажмите Выбрать файл, выберите stub.mp4. Ссылка на видео, справа, будет иметь вид https://vk.com/video-12345_7890, где 7890 - ID видео. Сохраните этот ID. Нажмите Далее, нажмите Далее, нажмите Опубликовать. Закройте открывшуюся страницу ВК Видео и вернитесь обратно на страницу сообщества.

Нажмите Управление, измените Тип сообщества на Частное, нажмите Сохранить.

Нажмите Разделы, включите раздел Файлы, нажмите Сохранить.

Нажмите Дополнительно, нажмите Работа с API, нажмите Создать ключ, включите все доступы, нажмите Создать, подтвердите действие. Ключ доступа имеет вид vk1.a.abCdE.... Скопируйте его полностью и сохраните. Никому не давайте этот ключ доступа.

Нажмите Long Poll API, измените Отключено на Включено, нажмите Типы событий, включите: Исходящее сообщение, Фотографии Добавление, Фотографии Новый комментарий, Видеозаписи Новый комментарий, Записи на стене Добавление, Комментарии на стене Добавление, Прочее Изменение настроек.

3. Повторите

Для тестирования программы достаточно одного сообщества. Но при реальном использовании вы быстро столкнетесь с лимитами VK API. Рекомендуется создать и настроить 5 сообществ. При необходимости можно и больше.

Аккаунт

1. ID

Откройте ВКонтакте, нажмите на свою аватарку в правом верхнем углу, нажмите Управление аккаунтом VK ID, нажмите Мои данные. Под вашим именем будут цифры - это ID. Сохраните его.

2. Ключ доступа

Дайте доступ любому из этих сервисов:

Сам сервис не будет иметь доступа к аккаунту. Доступ будет иметь только тот, у кого будет ключ, а будет он только у вас. Если вы все равно не хотите давать доступ, то смотрите Без доступа к аккаунту.

Нажмите Продолжить как.

Адресная строка будет иметь вид https://oauth.vk.com/blank.html#access_token=vk1.a.abCdE.... Ключ доступа имеет вид vk1.a.abCdE.... Скопируйте весь ключ доступа до знака &, не копируйте сам знак. Сохраните его. Никому не давайте этот ключ доступа.

Вы можете отозвать выданный ключ доступа. Откройте ВКонтакте, нажмите на свою аватарку в правом верхнем углу, нажмите Управление аккаунтом VK ID, нажмите Сервисы и сайты, нажмите на сервис которому вы дали доступ, нажмите Отозвать доступ.

3. Имя

Придумайте и сохраните любое имя для идентификации выданного ключа доступа. Например, если вы выдали доступ сервису aliexpress, то можете использовать имя aliexpress.

4. Повторите

Для тестирования программы достаточно одного аккаунта. Но при реальном использовании вы быстро столкнетесь с лимитами VK API. Рекомендуется создать и настроить 2 аккаунта. При необходимости можно и больше. При этом ID может быть одинаковым, но ключи доступа должны быть разные.

Linux

Рекомендуется использовать Debian или Ubuntu. Также можно использовать Docker.

В терминале выполните:

whoami

Если пользователь не root, то запускайте следующие команды с помощью sudo, например sudo apt update.

1. Установите зависимости

apt update
apt install -y wget nano zbar-tools

2. Скачайте архив

Откройте Releases, раскройте Assets последней версии, скопируйте ссылку на Linux-версию. Выполните:

wget -O vk-proxy.tar.gz <ССЫЛКА>
mkdir vk-proxy
tar -xzf vk-proxy.tar.gz -C vk-proxy
cd vk-proxy

3. Установите программу

mkdir /var/log/vk-proxy
touch /var/log/vk-proxy/output.log
chown nobody:nogroup /var/log/vk-proxy/output.log
mv logrotate.txt /etc/logrotate.d/vk-proxy

mkdir /usr/local/etc/vk-proxy
mv vk-proxy /usr/local/bin/
mv config.json /usr/local/etc/vk-proxy/
mv systemd.txt /etc/systemd/system/vk-proxy.service

systemctl daemon-reload
systemctl enable vk-proxy

4. Сгенерируйте секрет

Если секрет не сгенерирован ранее, то выполните:

vk-proxy -secret

Сохраните его.

5. Заполните конфиг

Откройте конфиг:

nano /usr/local/etc/vk-proxy/config.json

Заполните конфиг значениями которые вы сохраняли ранее.

Пример конфига
{
    "log": {
        "output": "/var/log/vk-proxy/output.log"
    },
    "session": {
        "secret": "abc123"
    },
    "socks": {
        "listenHost": "127.0.0.1",
        "listenPort": 1080
    },
    "api": {
        "unathorized": false
    },
    "qr": {
        "zbarPath": "zbarimg"
    },
    "clubs": [
        {
            "name": "test",
            "id": "12345",
            "accessToken": "vk1.a.abCdE",
            "albumID": "6789",
            "photoID": "9876",
            "videoID": "7890"
        }
    ],
    "users": [
        {
            "name": "aliexpress",
            "id": "123",
            "accessToken": "vk1.a.eDcBA"
        }
    ]
}

Сохраните конфиг: Ctrl+O + Enter. Закройте конфиг: Ctrl+X.

6. Запустите программу

systemctl start vk-proxy

Это запустит программу в фоновом режиме. После перезагрузки компьютера она будет запущена автоматически.

Для перезапуска программы выполните:

systemctl stop vk-proxy
systemctl start vk-proxy

7. Проверьте программу

Выполните следующие команды и убедитесь в отсутствии ошибок. После проверки закройте команды с помощью Ctrl+C.

Эта команда должна отобразить active (running):

systemctl status vk-proxy

Эти команды не должны содержать ошибок:

journalctl -u vk-proxy
tail -n 100 /var/log/vk-proxy/output.log

Если где-то есть ошибка, то устраните ее, перезапустите программу и снова убедитесь в отсутствии ошибок.

Вы можете смотреть логи программы используя последнюю tail команду. Смотрите логи, когда что-то идет не так.

Windows

На Windows установка ZBar затруднительна. Рекомендуется использовать WSL и запускать Linux-версию. Также можно использовать Docker.

Для Windows-версии необходимо выключить использование QR-кодов.

1. Скачайте архив

Откройте Releases, раскройте Assets последней версии, скачайте Windows-версию.

2. Установите программу

Распакуйте архив, перейдите в созданную папку, нажмите правую кнопку мыши, нажмите "Открыть в терминале".

3. Сгенерируйте секрет

Выполните это. Замените vk-proxy на ./vk-proxy.exe.

4. Заполните конфиг

Выполните это. Заполните конфиг в текущей папке.

  • в log.output укажите ""
  • в qr.zbarPath укажите "". На втором устройстве тоже укажите ""

5. Запустите программу

./vk-proxy.exe

После закрытия терминала программа будет остановлена. Чтобы запустить ее снова, откройте папку в терминале и запустите программу.

macOS

Адаптируйте инструкцию для Linux или Windows самостоятельно. Также можно использовать Docker.

Docker

1. Скачайте архив

Откройте Releases, раскройте Assets последней версии, скачайте Source code. zip для Windows, tar.gz для Linux и Mac.

2. Установите программу

Распакуйте архив, перейдите в созданную папку, откройте её в терминале.

Клонируйте файл config.template.json, назовите новый файл config.json.

Выполните:

docker compose build

3. Сгенерируйте секрет

Выполните это. Используйте команду:

docker compose run --rm vk-proxy -secret

4. Заполните конфиг

Выполните это. Заполните конфиг в текущей папке.

  • в log.output укажите ""
  • в socks.listenHost укажите "0.0.0.0"

5. Запустите программу

docker compose up -d

Это запустит программу в фоновом режиме. После перезагрузки компьютера она будет запущена автоматически.

Для перезапуска программы выполните:

docker compose restart

Для просмотра логов выполните:

docker compose logs -n 100

Android

Предварительно установите и запустите Termux. Рекомендуется устанавливать версию из F-Droid.

Для Android-версии необходимо выключить использование QR-кодов.

1. Установите зависимости

pkg update
pkg install -y wget nano zbar proot

2. Скачайте архив

Выполните это. Используйте Android-версию.

3. Сгенерируйте секрет

Выполните это. Замените vk-proxy на ./vk-proxy.

4. Заполните конфиг

Откройте конфиг:

nano config.json

И выполните это.

  • в log.output укажите ""
  • в qr.zbarPath укажите "". На втором устройстве тоже укажите ""

Если печатать на телефоне утомительно, то заполните конфиг на компьютере, отправьте текст на телефон, скопируйте этот текст и вставьте в конфиг с нуля:

rm config.json
nano config.json

5. Запустите программу

termux-chroot ./vk-proxy

После закрытия терминала программа будет остановлена. Чтобы запустить ее снова, откройте папку в терминале и запустите программу.

Для перезапуска программы остановите ее с помощью Ctrl+C и запустите снова.

Использование

После установки и запуска будет доступен SOCKS-прокси по адресу 127.0.0.1:1080. На устройстве в условиях белого списка установите его там, где нужно проксировать трафик через ВК.

Обратите внимание на Flood control. Не ожидайте быстрой загрузки страниц, делайте паузы между запросами, передавайте как можно меньше трафика. Ещё раз: vk-proxy расчитан лишь на минимальный доступ к глобальному интернету.

Рекомендуется использовать vk-proxy в связке с любым V2Ray-клиентом для настройки точечного роутинга. Например, отправляйте весь трафик Google через vk-proxy, а остальной трафик пускайте напрямую.

Проверка

В Linux и macOS используйте curl, в Windows - curl.exe. В терминале выполните:

curl --verbose --socks5 127.0.0.1:1080 https://www.google.com/

Вы должны увидеть код страницы и его окончание </html>.

curl --verbose --socks4 127.0.0.1:1080 https://api.ipapi.is/

Вы должны увидеть информацию об айпи устройства за пределами белого списка.

Конфиг

Возможные настройки и их значения по умолчанию.

Описание
{
    "log": {
        "level": 0, // Уровень логов. -4 - debug, 0 - info, 4 - warn, 8 - error
        "output": "", // Путь к файлу куда сохранять логи. Если пусто, то выводить логи в терминал
        "payload": false // Логировать тела запросов и ответов
    },
    "session": {
        "timeout": 30000, // Если соединение бездействует в течение этого времени, то оно будет закрыто. В миллисекундах. 0 выключает проверку
        "secret": "" // Ключ шифрования
    },
    "socks": {
        "listenHost": "127.0.0.1", // Запустить SOCKS-прокси на этом адресе
        "listenPort": 1080, // Запустить SOCKS-прокси на этом порту
        "forwardSize": 1048576, // Максимальный размер пересылаемого датаграмма. В байтах
        "forwardInterval": 500 // Буферизировать проксируемые данные в течение этого времени перед упаковкой их в датаграммы. В миллисекундах
    },
    "api": {
        "unathorized": false // Не использовать user.accessToken
    },
    "qr": {
        "zbarPath": "zbarimg", // Путь к программе ZBar. Если пусто, то выключает использование QR-кодов
        "saveDir": "" // Куда сохранять временные QR-коды. Если пусто, то используется временная директория системы
    },
    "clubs": [ // Описания сообществ
        {
            "name": "", // Имя для идентификации в логах
            "id": "", // ID сообщества
            "accessToken": "", // Ключ доступа к API
            "albumID": "", // ID альбома куда загружать QR-коды
            "photoID": "", // ID загруженного фото
            "videoID": "" // ID загруженного видео
        }
    ],
    "users": [ // Описания пользователей
        {
            "name": "", // Имя для идентификации в логах
            "id": "", // ID пользователя
            "accessToken": "" // Ключ доступа к API
        }
    ]
}

Указать путь к конфигу:

vk-proxy -config /path/to/config.json

По умолчанию используется config.json в директории программы.

Без доступа к аккаунту

Если вы не хотите давать доступ к аккаунту, то в конфиге на всех устройствах укажите:

{
    "api": {
        "unathorized": true
    }
}

В этом случае user.accessToken использоваться не будет. Использование QR-кодов будет выключено.

При этом вероятность Flood control значительно увеличивается.

Flood control

vk-proxy может начать работать нестабильно или вовсе перестать работать. В логах программы вы увидите ошибку Flood control. Это значит, что вы передаете слишком много трафика или слишком быстро. vk-proxy не рассчитан на такую работу. VK API имеет ограничения, поэтому передать много трафика не получится. Используйте vk-proxy только для минимального доступа к важным сервисам.

Подождите некоторое время для обнуления достигнутых лимитов и повторите запрос. Во время использования vk-proxy сократите количество передаваемого трафика и делайте паузы между запросами.

Для минимизации этой ошибки:

  • создайте больше сообществ и аккаунтов
  • проксируйте только определенные сервисы, а не весь трафик целиком
  • устанавливайте прокси на уровне браузера или даже сайта, а не на уровне всей системы
  • отключите ненужный контент (картинки, видео, стили и т.п)
  • используйте блокировщик рекламы
  • используйте минималистичные версии сайтов
  • используйте режим экономии трафика
  • если безопасность и приватность неважны, то используйте HTTP-версию сайта вместо HTTPS

V2Ray

Рекомендуется использовать vk-proxy в связке с любым V2Ray-клиентом. В этом случае вы сможете настроить точечный роутинг и обеспечить более широкую поддержку входящих интерфейсов.

Примеры V2Ray-клиентов:

Пример конфига V2Ray
{
    "log": {
        "loglevel": "info"
    },
    "inbounds": [
        {
            "protocol": "socks",
            "listen": "127.0.0.1",
            "port": 2000,
            "settings": {
                "udp": false
            },
            "sniffing": {
                "enabled": true,
                "destOverride": [
                    "http",
                    "tls"
                ]
            }
        }
    ],
    "outbounds": [
        {
            "tag": "direct",
            "protocol": "freedom"
        },
        {
            "tag": "vk-proxy",
            "protocol": "socks",
            "settings": {
                "servers": [
                    {
                        "address": "127.0.0.1",
                        "port": 1080
                    }
                ]
            }
        }
    ],
    "routing": {
        "domainStrategy": "IPOnDemand",
        "rules": [
            {
                "type": "field",
                "domains": [
                    "google.com",
                    "gstatic.com",
                    "googleusercontent.com",
                    "wikipedia.org",
                    "wikimedia.org",
                    "telegram.org"
                ],
                "network": "tcp",
                "outboundTag": "vk-proxy"
            }
        ]
    }
}
Пример конфига v2rayN и v2rayNG

Интерфейс:

socks://Og%3D%3D@127.0.0.1:1080#vk-proxy

Роутинг:

[
    {
        "domain": [
            "google.com",
            "gstatic.com",
            "googleusercontent.com",
            "wikipedia.org",
            "wikimedia.org",
            "telegram.org"
        ],
        "enabled": true,
        "locked": true,
        "network": "tcp",
        "outboundTag": "proxy",
        "remarks": "vk-proxy: proxy"
    },
    {
        "enabled": true,
        "locked": true,
        "outboundTag": "direct",
        "port": "0-65535",
        "remarks": "vk-proxy: direct"
    }
]

Telegram

Рекомендуется использовать веб-версию - https://web.telegram.org. Обязательно отключите медиаконтент: нажмите Настройки, нажмите Данные и память, выключите Загружать автоматически или выключите всю автозагрузку. Не скачивайте фото и видео, используйте только текст.