Ссылки beam://
Весь профиль в одной ссылке.
По ссылке BEAM покажет «Добавить профиль?» и после подтверждения добавит профиль.
beam://import/<payload>
payload = base64url( gzip( JSON профиля ) )| Ссылка | Что делает |
|---|---|
beam://import/<payload> | профиль из ссылки |
beam://import?data=<payload> | то же самое |
beam://import?url=https://... | добавить подписку по адресу |
- JSON — UTF-8 без пробелов, так ссылка короче.
- base64url (
-и_), паддинг=можно не ставить. Обычный base64 в ссылках ломается. - Обрезанная ссылка даст ошибку, а не битый профиль.
Закодировать
Node.js / TypeScript
import { gzipSync } from "node:zlib"
export function beamLink(profile: object): string {
return "beam://import/" + gzipSync(JSON.stringify(profile), { level: 9 }).toString("base64url")
}Python
import base64, gzip, json
def beam_link(profile: dict) -> str:
raw = json.dumps(profile, ensure_ascii=False, separators=(",", ":")).encode()
return "beam://import/" + base64.urlsafe_b64encode(gzip.compress(raw, 9)).decode().rstrip("=")Go
func BeamLink(profile any) (string, error) {
raw, err := json.Marshal(profile)
if err != nil {
return "", err
}
var buf bytes.Buffer
w, _ := gzip.NewWriterLevel(&buf, gzip.BestCompression)
w.Write(raw)
w.Close()
return "beam://import/" + base64.RawURLEncoding.EncodeToString(buf.Bytes()), nil
}Разные gzip-библиотеки дают разные байты, так что ссылки из разных языков не совпадут посимвольно — это нормально.
Длина
| Канал | Сколько влезает |
|---|---|
| QR-код | ~2 КБ, уверенно читается до ~1,5 КБ |
| Сообщение Telegram | 4096 символов |
| Запуск из браузера | ~32 000 символов |
| BEAM | 256 КБ payload |
Профиль из трёх серверов с брендингом — около 600 символов, каждый следующий сервер +100–150. Не влезает — отдавайте beam://import?url=....
Ссылка не шифруется: у кого ссылка — у того серверы, как с vless://. Без подтверждения пользователя BEAM ничего не импортирует.
