尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Мобильное веб-приложение с шестью играми и внутренней валютой ★. Баланс пополняется только через администратора @silent; вывод звёзд оформляется заявкой, которая уходит администратору в Telegram.
Стартовый баланс — 50 ★, ежедневный бонус — 10 ★ (сброс в полночь по Москве). Пополнение — от 1 ★, только через администратора @silent.
Баланс, история и все игры работают на сервере. Состояние каждого игрока
хранится в приватном Vercel Blob (kaz/players/<id>/rNNNNNNNNNN.json):
каждое изменение — это новая ревизия, которая создаётся с
allow_overwrite=False. Благодаря этому два одновременных запроса не могут
оба записать одну ревизию (нет двойной траты), а CDN-кэш не отдаёт устаревший
баланс. Приложение только отправляет выбор игрока (ставка, клетка, «ещё»,
«хватит») на /api/game и рисует ответ сервера; незавершённые раунды
(блэкджек, мины, краш) восстанавливаются после перезагрузки. В браузере
остаются только настройка звука и последний известный баланс для показа.
Все игры честные: шансы, которые видит игрок, совпадают с реальными, а в ходе
игры ничего не подкручивается. Случайность — secrets на сервере. Итоговый
возврат игрокам (RTP) показан в приложении («Честная игра») и проверяется
тестами (tests/test_server.py):
| Игра | RTP | Как считается |
|---|---|---|
| Слоты | ≈ 86% | веса символов 30/23/19/13/9/6, пять линий |
| Блэкджек | зависит от стратегии | новая колода на раздачу, блэкджек 6:5, дилер берёт на мягких 17 |
| Рулетка | ≈ 94,7% | 38 равновероятных лунок |
| Мины | 92% | множитель = честный множитель × 0,92 |
| Краш | 84% | шанс дойти до ×X равен 0,84 ÷ X, максимум ×50 |
| Апгрейд | 93% | шанс = 0,93 ÷ множитель |
Звёзды — внутренняя игровая валюта. Пополнение теперь только ручное: игрок отправляет заявку администратору @silent, и тот зачисляет звёзды. Азартные игры на реальные деньги во многих странах требуют лицензии: убедитесь, что вы вправе запускать такой сервис.
В приложении: «Пополнить» → ввести сумму → «Отправить заявку @silent».
Минимум 1 ★, максимум 1 000 000 ★, значение по умолчанию — 500 ★.
Также работает команда /buy 500 в чате с ботом.
Сценарий:
https://sgq.me/silent с уже готовым
текстом заявки (сумма и ID игрока). Игроку остаётся отправить сообщение./give).ADMIN_IDS не настроен, игрок всё равно может написать
администратору @silent напрямую.Самостоятельная оплата звёздами отключена: /api/topup больше не создаёт
счёт и отвечает 410 topup_via_admin. Старые оплаченные счета по-прежнему
зачисляются через webhook, чтобы не потерять уже проведённые платежи.
Ссылки на бота в ShuzaGram имеют вид https://sgq.me/kazbot; ссылки t.me
ведут в другой клиент и в проекте не используются.
В приложении: баланс → «Вывод звёзд». Игрок указывает сумму (минимум
500 ★). Контакт для связи берётся из профиля ShuzaGram: имя, @username
и ID попадают в заявку администратору. Ручной ввод контакта не используется.
Сумма сразу списывается с серверного баланса и резервируется, а бот присылает
заявку администратору с кнопками «Выплачено» / «Отклонить». При отклонении
звёзды автоматически возвращаются игроку.
/id у бота.ADMIN_IDS (несколько — через запятую).
В Vercel: Project → Settings → Environment Variables → Production.
Локально — в .env.ADMIN_IDS=111111111,222222222
В карточке заявки администратор видит кнопки «✅ Выплачено» и
«❌ Отклонить», а рядом с ShuzaGram ID — ссылку «открыть профиль»
(sg://user?id=...). После нажатия карточка обновляется, а игрок получает
уведомление о решении.
Найти игрока по юзернейму: /id @username — бот покажет ID и баланс.
Команды /give @username 500 и /balance @username тоже работают.
Юзернейм сохраняется в профиле, когда игрок открывает приложение; если игрок
ещё не открывал KAZ, попросите его сделать это и повторите поиск.
Можно использовать и старый вариант ADMIN_ID=111111111 для одного админа.
Если ADMIN_ID/ADMIN_IDS не задан, бот сообщит игроку, что администраторы
не подключены. Пополнение при этом всё равно оформляется через чат с
администратором @silent.
Nichkolai/site, ветка main.team-6d62/site.api/telegram.py на том же домене. Постоянный ПК
или VPS для приёма заявок не нужен.В репозитории лежат:
index.html
styles.css
games.css
js/
.nojekyll
.python-version
api/telegram.py
api/topup.py
bot.py
vercel.json
bot.py содержит общую логику бота и не запускает сервер при импорте.
api/telegram.py проверяет секрет webhook и передаёт update в bot.handle_update.
Добавьте в Production:
| Переменная | Тип | Значение |
|---|---|---|
BOT_TOKEN | Secret | токен бота |
ADMIN_IDS | Config | ID администраторов через запятую (сюда входит @silent) |
TOPUP_ADMIN | Config | имя администратора для пополнений, по умолчанию silent |
WEBAPP_URL | Config | https://site-ten-sepia-56.vercel.app |
SHUZA_API_BASE | Config | https://api.shuzagram.com |
WEBHOOK_SECRET | Secret | случайная строка, обязательна: проверяется в X-Telegram-Bot-Api-Secret-Token, без неё webhook отвечает 503 |
SESSION_SECRET | Secret | отдельный ключ подписи сессионных токенов (случайная строка). Без него используются WEBHOOK_SECRET/BOT_TOKEN. Старые токены остаются валидными; SESSION_REJECT_LEGACY=1 отключает их через 30 дней после задания ключа |
BLOB_STORE_ID | Config | ID Blob-хранилища kaz-payments в team-6d62 |
BLOB_READ_WRITE_TOKEN | Secret | добавляется автоматически при подключении Blob-хранилища; хранится только в Vercel |
VERCEL_OIDC_TOKEN | Runtime | выдаётся Vercel автоматически; используется Python SDK vercel-blob |
Хранилище kaz-payments создано в новом team team-6d62 (private, регион
iad1) и подключено к Production/Preview проекта site. Vercel добавил
BLOB_STORE_ID и BLOB_READ_WRITE_TOKEN; дублировать их в репозитории не нужно.
Старое хранилище из team-6309 не используется. Не добавляйте .env в Git и не
коммитьте значения секретов. Локальный .env остаётся только на машине
разработчика.
Автоматические Git-деплои для этого проекта отключены. Кроме того, на Hobby
Vercel разрешает деплой только если автор коммита совпадает с владельцем team.
Коммиты репозитория сделаны от Nichkolai, а новый team принадлежит
[email protected], поэтому деплой прямо из репозитория блокируется
(commit author doesn't have permission). Рабочий способ — деплой из копии
без .git и .env:
$src = "C:\Users\Admin\Documents\KAZ"
$dst = Join-Path $env:TEMP "kaz-deploy"
Remove-Item -Recurse -Force $dst -ErrorAction SilentlyContinue
New-Item -ItemType Directory -Force $dst | Out-Null
Get-ChildItem $src -File -Force | Where-Object { $_.Name -ne '.env' } | Copy-Item -Destination $dst
Get-ChildItem $src -Directory -Force | Where-Object { $_.Name -notin @('.git','.vercel','.pytest_cache','__pycache__','tests','.github') } | Copy-Item -Destination $dst -Recurse
$env:VERCEL_ORG_ID = "team_1XG2QveDl9UAd4BMV9IxJBt7"
$env:VERCEL_PROJECT_ID = "prj_I4cH6nkY7iRWWRZXw1FwChbrD7VH"
Set-Location $dst
vercel deploy --prod
Либо создайте новый коммит от имени владельца team ([email protected]) и
деплойте из репозитория обычным vercel deploy --prod.
Проверка функции:
GET https://site-ten-sepia-56.vercel.app/api/telegram
→ {"ok": true, "service": "kaz-telegram"}
GET https://site-ten-sepia-56.vercel.app/api/purchases
→ {"ok": true, "service": "kaz-purchases"}
GET https://site-ten-sepia-56.vercel.app/api/topup
→ {"ok": true, "service": "kaz-topup", "mode": "admin", "admin": "silent"}
Webhook уже включён. Если нужно включить его заново после смены домена:
import bot
bot.api("setWebhook", {
"url": "https://site-ten-sepia-56.vercel.app/api/telegram",
"secret_token": "значение_WEBHOOK_SECRET",
"allowed_updates": ["message", "callback_query", "pre_checkout_query"],
})
getWebhookInfo должен показывать этот URL и отсутствие ошибок. Не запускайте
одновременно локальный long polling и webhook: Telegram доставляет update только
одним способом.
Нужен Python 3.10+. Для локального запуска бота достаточно стандартной
библиотеки; для проверки пополнений установите vercel-blob из
requirements.txt.
cd "C:\Users\Admin\Documents\Default Project"
python bot.py
bot.py сам удаляет webhook и переключается на long polling. Поэтому после
локального запуска не забудьте снова включить webhook, если возвращаетесь на
Vercel. Без BOT_TOKEN запустится только локальный веб-сервер:
http://127.0.0.1:8080/
Для Telegram нужен публичный HTTPS-адрес.
index.html разметка, SVG-спрайт, экраны и модалки
styles.css мобильная оболочка, лобби, история, модалки
games.css стили игр
theme.css зелёная тема и оформление апгрейда
js/core.js состояние, навигация, история, Telegram, звук
js/slots.js слоты
js/blackjack.js блэкджек
js/roulette.js рулетка
js/mines.js мины
js/crash.js краш
js/upgrader.js апгрейд
bot.py логика ShuzaGram-бота + локальный статический сервер
payments.py проверка initData, Telegram Stars и Vercel Blob
api/telegram.py Vercel webhook entrypoint
api/purchases.py синхронизация подтверждённых пополнений
api/topup.py отключение самостоятельных счетов, пополнение через @silent
requirements.txt Python-зависимость Vercel Blob
vercel.json настройки функций
telegram-web-app.js не хранится в проекте: он подгружается с telegram.org
только при запуске внутри Telegram. Без него интерфейс и игры работают, но
нативные BackButton и вибро-отклик недоступны.
localhost — только для
локальной проверки..env исключён в .gitignore.