Быстрый старт
Эта страница проходит через минимальное полезное Mini App: инициализация SDK, получение инстанса WebApp, сигнал готовности, чтение данных запуска и показ MainButton.
1. Инициализация SDK и получение инстанса
init_sdk() разбирает initData и themeParams из Telegram.WebApp и
сохраняет их в глобальном контексте. После этого получите живой хендл WebApp.
Есть два аксессора:
TelegramWebApp::instance()возвращаетOption<TelegramWebApp>(None, если код запущен не внутри Telegram) — удобно для graceful degradation.TelegramWebApp::try_instance()возвращаетResult<TelegramWebApp, JsValue>— удобно внутри функций, использующих?.
use telegram_webapp_sdk::{core::init::init_sdk, webapp::TelegramWebApp};
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub fn main() -> Result<(), JsValue> {
init_sdk()?;
let app = TelegramWebApp::try_instance()?;
app.ready()?; // сообщаем Telegram, что интерфейс инициализирован
app.expand()?; // разворачиваем Mini App на полную высоту
Ok(())
}
Если нужен запуск без паники, используйте try_init_sdk() — он возвращает
Ok(false), когда Telegram недоступен:
use telegram_webapp_sdk::core::init::try_init_sdk;
match try_init_sdk() {
Ok(true) => { /* запущено внутри Telegram */ }
Ok(false) => { /* обычный браузер — используем фолбэк */ }
Err(e) => eprintln!("ошибка инициализации: {e}")
}
2. Чтение init data и пользователя
Разобранные данные запуска лежат в глобальном TelegramContext. Доступ — через
геттер на основе замыкания:
use telegram_webapp_sdk::core::context::TelegramContext;
TelegramContext::get(|ctx| {
if let Some(user) = &ctx.init_data.user {
web_sys::console::log_1(&format!("Привет, {}", user.first_name).into());
}
let _ = ctx.init_data.auth_date;
let _ = ctx.init_data.start_param.as_deref();
});
Для серверной проверки подписи возьмите сырую URL-кодированную строку и отправьте её на бэкенд (проверяйте там, с токеном бота — никогда на клиенте):
use telegram_webapp_sdk::TelegramWebApp;
let raw_init_data = TelegramWebApp::get_raw_init_data()?;
// POST /auth { "init_data": raw_init_data }
Ok::<(), Box<dyn std::error::Error>>(())
3. Минимальный MainButton
Задайте подпись, покажите кнопку и зарегистрируйте колбэк клика. Колбэк
возвращает EventHandle, который позже можно передать в
remove_main_button_callback.
use telegram_webapp_sdk::webapp::TelegramWebApp;
fn run() -> Result<(), wasm_bindgen::JsValue> {
let app = TelegramWebApp::try_instance()?;
app.set_main_button_text("Отправить заказ")?;
app.set_main_button_color("#2481cc")?;
app.enable_main_button()?;
app.show_main_button()?;
let handle = app.set_main_button_callback(|| {
if let Some(app) = TelegramWebApp::instance() {
let _ = app.send_data("order-confirmed");
}
})?;
// позже, когда кнопка больше не нужна:
app.remove_main_button_callback(handle)?;
app.hide_main_button()?;
Ok(())
}
Что дальше
- WebApp API — полная покрытая поверхность: диалоги, хранилища, сенсоры
- Интеграция с фреймворками — реактивные хуки и компоненты кнопок для Leptos/Yew
- Мок и тестирование — запуск этого кода вне Telegram