1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
// examples/callback_demo.rs
use maxbot_rs::{
MaxClient, SendMessageParamsBuilder, Attachment,
InlineKeyboardBuilder, InlineKeyboardButton, GetUpdatesParams,
};
use serde_json::json;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let token = std::env::var("MAXBOT_TOKEN").expect("Missing MAXBOT_TOKEN");
let chat_id = std::env::var("CHAT_ID")
.expect("Missing CHAT_ID")
.parse::<i64>()?;
let client = MaxClient::new(token);
// 1. Отправляем сообщение с клавиатурой
let keyboard = InlineKeyboardBuilder::new()
.button(InlineKeyboardButton::link("е1.ru", "https://www.e1.ru"))
.button(InlineKeyboardButton::callback("Щёлк!", "callback_data"))
.build();
let builder = SendMessageParamsBuilder::new()
.text("Выбери действие:")
.chat_id(chat_id)
.attachment(Attachment::inline_keyboard(keyboard));
let mids = client.send_message_builder(builder).await?;
let msg_mid = mids.first().unwrap();
println!("📤 Сообщение с клавиатурой отправлено, mid = {}", msg_mid);
// 2. Ожидаем callback
println!("🔄 Ожидание нажатия кнопки (Ctrl+C для выхода)...");
let mut marker = None;
let limit = 10;
let timeout = 30;
let types = vec!["message_callback".to_string()];
loop {
let params = GetUpdatesParams {
marker,
limit: Some(limit),
timeout: Some(timeout),
types: types.clone(),
};
match client.get_updates(params).await {
Ok((updates, new_marker)) => {
marker = new_marker;
for update in updates {
if let Some(callback) = update.callback {
if callback.payload == "callback_data" {
println!("✅ Получен callback от пользователя {} (payload: {})",
callback.user.user_id, callback.payload);
// Формируем новое сообщение (убираем кнопку "Щёлк!", оставляем только ссылку)
let new_keyboard = InlineKeyboardBuilder::new()
.button(InlineKeyboardButton::link("е1.ru", "https://www.e1.ru"))
.build();
let new_message_body = json!({
"text": "Выбор сделан!",
"attachments": [
{
"type": "inline_keyboard",
"payload": {
"buttons": [
[
{
"type": "link",
"text": "е1.ru",
"url": "https://www.e1.ru"
}
]
]
}
}
]
});
// Отвечаем на callback: обновляем сообщение и показываем уведомление
let success = client.answer_callback_query(
&callback.callback_id,
Some(new_message_body),
Some("Кнопка была нажата!"),
).await?;
if success {
println!("✅ Callback обработан, сообщение обновлено.");
} else {
eprintln!("❌ Ошибка при обработке callback");
}
return Ok(());
}
}
}
}
Err(e) => {
eprintln!("Ошибка получения обновлений: {}", e);
tokio::time::sleep(tokio::time::Duration::from_secs(5)).await;
}
}
}
}