[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81022":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":8,"htmlUrl":8,"language":9,"languages":8,"totalLinesOfCode":8,"stars":10,"forks":11,"watchers":12,"openIssues":13,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":13,"stars7d":15,"stars30d":15,"stars90d":14,"forks30d":14,"starsTrendScore":15,"compositeScore":16,"rankGlobal":8,"rankLanguage":8,"license":8,"archived":17,"fork":17,"defaultBranch":18,"hasWiki":19,"hasPages":17,"topics":20,"createdAt":8,"pushedAt":8,"updatedAt":21,"readmeContent":22,"aiSummary":23,"trendingCount":14,"starSnapshotCount":14,"syncStatus":24,"lastSyncTime":25,"discoverSource":26},81022,"ip-hunter","stafilakok\u002Fip-hunter","stafilakok",null,"Python",32,7,29,1,0,3,2.71,false,"main",true,[],"2026-06-12 02:04:09","# Yandex Cloud IP Hunter\n\nБедолаги, наколякал такое добро для тех, кто устал покупать \"секретный скрипт\"\nу очередного маркетного шамана. Оно запускается с вашего ПК, ходит в Yandex\nCloud API, крутит публичные IPv4 и останавливается, когда выпал адрес из ваших\n`target_ips` или `target_cidrs`.\n\nФоркайте, ломайте, чините, присылайте PR. Может, иногда буду обновлять. Может,\nбуду просто смотреть, как сообщество снова воюет с JSON без запятых.\n\n## Что делает скрипт\n\n- Резервирует случайные статические IPv4 в Yandex Cloud.\n- Проверяет адрес по списку нужных IP\u002FCIDR.\n- Неподходящие адреса удаляет.\n- При лимитах умеет менять folder\u002Fcloud, если это включено.\n- При успехе оставляет найденный адрес зарезервированным.\n- Пишет логи в `run.log`, состояние в `state.json`.\n- Может отправить Telegram-уведомление.\n- Может открыть сюрприз-видос, потому что страдать надо красиво.\n\n## Что нельзя коммитить\n\nЭти файлы должны жить только локально:\n\n- `config.json`\n- `sa-key.json`\n- `state.json`\n- `run.log`\n- `runner.*.log`\n- `.env`\n- любые `*.key`, `*.pem`\n\nОни уже в `.gitignore`. Если вы все равно запушили ключ в публичный репозиторий,\nпоздравляю: вы прошли обучение кибербезопасности методом лица об асфальт.\nУдалите ключ в Yandex Cloud и создайте новый.\n\n## Установка\n\nНужен Python 3.9+.\n\n```powershell\npython -m pip install PyJWT cryptography\n```\n\nСкопируйте пример конфига:\n\n```powershell\nCopy-Item .\\config.example.json .\\config.json\n```\n\nКлюч сервисного аккаунта положите рядом:\n\n```text\nyc_ip_hunter\u002F\n  yc_ip_hunter.py\n  config.json\n  sa-key.json\n```\n\n## Гайд для бедолаг: где что искать в Yandex Cloud\n\nОткрываем [console.yandex.cloud](https:\u002F\u002Fconsole.yandex.cloud). Дальше без\nмагии, просто тыкаем нужные меню.\n\n### 1. Организация: `organization_id`\n\nЭто ID организации, в которой создаются cloud.\n\nКак найти:\n\n1. В левом верхнем углу консоли нажмите на название организации.\n2. Откройте **Cloud Center** или страницу организации.\n3. Найдите строку **Идентификатор**.\n4. Скопируйте значение в `organization_id`.\n\nВыглядит примерно так:\n\n```json\n\"organization_id\": \"REPLACE_WITH_ORGANIZATION_ID\"\n```\n\nЕсли вы не видите организацию, значит вы либо не там, либо Яндекс снова решил\nсыграть в UX-квест. Ищите в верхней панели переключатель организации\u002Fоблака.\n\n### 2. Платежный аккаунт: `billing_account_id`\n\nНужен, чтобы новые cloud можно было привязать к биллингу.\n\nКак найти:\n\n1. В левом меню нажмите **Биллинг**.\n2. Откройте нужный платежный аккаунт.\n3. Найдите **ID платежного аккаунта**.\n4. Скопируйте его в `billing_account_id`.\n\n```json\n\"billing_account_id\": \"REPLACE_WITH_BILLING_ACCOUNT_ID\"\n```\n\nЕсли биллинг не привязан, новые cloud могут создаваться, но ресурсы внутри будут\nпадать с ошибками. Да, это тот самый момент, где полчаса жизни улетают в окно.\n\n### 3. Служебное облако: `service_cloud_id`\n\nЭто cloud, который нельзя удалять. В нем живет сервисный аккаунт, через который\nскрипт управляет остальными cloud.\n\nКак найти:\n\n1. В списке облаков выберите ваше служебное облако.\n2. Под названием облака найдите ID.\n3. Скопируйте его в `service_cloud_id`.\n\n```json\n\"service_cloud_id\": \"REPLACE_WITH_SERVICE_CLOUD_ID\"\n```\n\nВажно: это облако должно жить всегда. Удалите его - и скрипт останется без рук.\n\n### 4. Сервисный аккаунт\n\nСоздаем аккаунт, который будет делать всю грязную работу.\n\nКак создать:\n\n1. Выберите служебное облако.\n2. Выберите каталог, обычно `default`.\n3. В левом меню откройте **Identity and Access Management**.\n4. Откройте **Сервисные аккаунты**.\n5. Нажмите **Создать сервисный аккаунт**.\n6. Назовите его, например `huntersa`.\n\n### 5. Права сервисному аккаунту\n\nМинимально для folder mode:\n\n- `admin` на target cloud.\n\nДля cloud\u002Fhybrid mode:\n\n- права на организацию для создания cloud;\n- права на billing account для привязки billing;\n- `admin` на создаваемые cloud\u002Ffolder.\n\nСамый простой путь для тех, кто не хочет читать IAM-доки:\n\n1. Откройте нужный ресурс: cloud или organization.\n2. Перейдите в **Права доступа**.\n3. Нажмите **Добавить пользователя** или **Назначить роли**.\n4. Выберите сервисный аккаунт `huntersa`.\n5. Добавьте роль `admin`.\n6. Сохраните.\n\nДа, `admin` жирно. Да, можно тоньше. Нет, в гайде для бедолаг мы не будем\nсобирать IAM-мозаику из 14 ролей и трех молитв.\n\n### 6. JSON-ключ: `sa-key.json`\n\nЭто файл, через который скрипт авторизуется.\n\nКак скачать:\n\n1. Откройте **Identity and Access Management**.\n2. Перейдите в **Сервисные аккаунты**.\n3. Откройте `huntersa`.\n4. Справа сверху нажмите **Создать новый ключ**.\n5. Выберите **Создать авторизованный ключ**.\n6. Скачайте JSON.\n7. Переименуйте файл в `sa-key.json`.\n8. Положите его рядом со скриптом.\n\nВ `config.json` должно быть:\n\n```json\n\"auth\": {\n  \"service_account_key_file\": \"sa-key.json\",\n  \"iam_token_env\": \"YC_IAM_TOKEN\"\n}\n```\n\n### 7. Target cloud: `target_cloud_id`\n\nНужен только для `rotation_mode: \"folder\"`.\n\nКак найти:\n\n1. Откройте cloud, внутри которого хотите создавать временные folder.\n2. Под названием cloud скопируйте ID.\n3. Вставьте в `target_cloud_id`.\n\n```json\n\"target_cloud_id\": \"REPLACE_WITH_TARGET_CLOUD_ID_FOR_FOLDER_MODE\"\n```\n\nЕсли используете `hybrid` или `cloud`, поле можно оставить плейсхолдером\u002Fпустым,\nа рабочими будут `organization_id`, `billing_account_id`, `service_cloud_id`.\n\n## Как заполнить `config.json`\n\nБазовый живой вариант для hybrid:\n\n```json\n{\n  \"dry_run\": false,\n  \"rotation_mode\": \"hybrid\",\n  \"organization_id\": \"ВАШ_ORGANIZATION_ID\",\n  \"billing_account_id\": \"ВАШ_BILLING_ACCOUNT_ID\",\n  \"service_cloud_id\": \"ВАШ_SERVICE_CLOUD_ID\",\n  \"auth\": {\n    \"service_account_key_file\": \"sa-key.json\",\n    \"iam_token_env\": \"YC_IAM_TOKEN\"\n  },\n  \"zone\": \"ru-central1-a\",\n  \"zones\": [\"ru-central1-a\"],\n  \"target_ips\": [],\n  \"target_cidrs\": [\n    \"84.201.188.0\u002F23\",\n    \"84.201.184.0\u002F22\",\n    \"84.201.128.0\u002F18\",\n    \"158.160.0.0\u002F16\"\n  ],\n  \"max_iterations\": 0,\n  \"max_addresses_per_cloud\": 9,\n  \"max_parallel_clouds\": 3,\n  \"allow_delete_cloud\": true,\n  \"immediate_delete_cloud\": true\n}\n```\n\n`target_cidrs` - это ваши нужные подсети. Хотите другие - меняйте. Скрипт\nостановится только на том, что вы сами туда положили.\n\n## Режимы\n\n### `folder`\n\nСоздает новый folder внутри одного существующего cloud. Самый спокойный режим,\nно если лимиты душат на уровне cloud, будет грустно.\n\n### `cloud`\n\nСоздает новый cloud, привязывает billing, крутит IP, удаляет cloud при промахе.\nЖестче, но можно упереться в лимит cloud в организации.\n\n### `hybrid`\n\nОсновной режим. Крутит адреса, при лимитах переходит к следующему cloud. Для\nтекущего хаоса это самый рабочий вариант.\n\n## Telegram-уведомления\n\nВ `config.json`:\n\n```json\n\"notifications\": {\n  \"enabled\": true,\n  \"telegram\": {\n    \"enabled\": true,\n    \"bot_token_env\": \"TELEGRAM_BOT_TOKEN\",\n    \"chat_id\": \"ВАШ_CHAT_ID\"\n  }\n}\n```\n\nТокен лучше хранить в переменной окружения:\n\n```powershell\n$env:TELEGRAM_BOT_TOKEN=\"123456:ABCDEF...\"\n```\n\nПроверить:\n\n```powershell\npython .\\yc_ip_hunter.py --config .\\config.json --test-telegram\n```\n\nЕсли бот молчит, проверьте:\n\n- токен бота;\n- `chat_id`;\n- что вы написали боту хотя бы одно сообщение;\n- `run.log`.\n\n## Запуск\n\nСначала dry-run:\n\n```powershell\npython .\\yc_ip_hunter.py --config .\\config.json --dry-run\n```\n\nБоевой запуск:\n\n```powershell\npython .\\yc_ip_hunter.py --config .\\config.json --run --yes-delete-cloud\n```\n\nЕсли `allow_delete_cloud: true`, но вы забыли `--yes-delete-cloud`, скрипт\nоткажется удалять cloud. Это не баг, это защита от пользователей с быстрыми\nпальцами и медленным осознанием.\n\n## Как понять, что IP найден\n\nВ терминале и `run.log` появится:\n\n```text\nTARGET MATCH: allocated IP ... is in configured target ranges.\n```\n\nПосле этого скрипт:\n\n- сохраняет результат в `state.json`;\n- не удаляет найденный address;\n- отправляет Telegram, если включен;\n- открывает сюрприз-видос;\n- завершает работу с кодом `0`.\n\n## Частые ошибки\n\n### `Permission denied during create_cloud`\n\nСервисному аккаунту не хватает прав на organization. Идите в организацию,\n**Права доступа**, добавляйте роль.\n\n### `Permission denied to create external address`\n\nНе хватает прав на cloud\u002Ffolder\u002FVPC. Дайте сервисному аккаунту `admin` на cloud\nили folder, где идет охота.\n\n### `Cloud creation quota exceeded`\n\nВ организации забита квота cloud. Старые cloud могут висеть в удалении долго.\nСкрипт делает deep cleanup перед удалением, но внутреннюю очередь Яндекса за\nвас не победит.\n\n### Бот Telegram не пишет\n\nЗапустите:\n\n```powershell\npython .\\yc_ip_hunter.py --config .\\config.json --test-telegram\n```\n\nПотом смотрите `run.log`.\n\n## Тесты\n\n```powershell\npython -m unittest .\\test_yc_ip_hunter.py\n```\n\n## Дисклеймер\n\nЭто утилита для управления собственными облачными ресурсами и проверки\nвыделенных вам адресов. За лимиты, квоты, биллинг, удаленные cloud, внезапные\nрасходы и прочие радости взрослой жизни отвечает тот, кто нажал Enter.\n","Yandex Cloud IP Hunter 是一个用于在Yandex Cloud中自动寻找并预留特定IP地址的Python脚本。其核心功能包括随机保留静态IPv4地址、根据预设的目标IP或CIDR检查地址的有效性，并删除不符合条件的地址。此外，它支持跨文件夹\u002F云操作以规避限制，成功找到目标地址后会保持其预留状态，并记录日志及发送Telegram通知。该工具适用于需要频繁管理Yandex Cloud上公网IP资源的场景，如优化网络配置或满足特定安全需求时。通过简单的配置即可运行，但需要注意保护好敏感信息如密钥文件不被公开。",2,"2026-06-11 04:03:13","CREATED_QUERY"]