aiogram开发Telegram Bot如何实现选货币后更新默认菜单按钮文本
实现方案
核心实现逻辑
- 新增用户货币偏好存储模块,测试场景可直接用内存字典存储,生产环境建议替换为Redis/关系型数据库做持久化
- 修改Inline货币选择键盘的回调数据,直接绑定货币代码便于后续处理
- 编写回调查询处理函数,捕获用户货币选择操作后更新用户偏好,动态生成新的底部常规菜单覆盖原有菜单
- 将原硬编码的常规菜单改造为动态生成函数,根据用户当前选择的货币自动拼接
BTC/xxx格式的按钮文本
示例代码
依赖导入及全局变量初始化:
from aiogram import Bot, Dispatcher, types from aiogram.contrib.fsm_storage.memory import MemoryStorage from aiogram.dispatcher.filters import Command from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton, ReplyKeyboardMarkup, KeyboardButton API_TOKEN = '你的Bot Token' bot = Bot(token=API_TOKEN) storage = MemoryStorage() dp = Dispatcher(bot, storage=storage) # 存储用户货币偏好,key为用户id,value为货币代码 user_currency = {} # 默认货币 DEFAULT_CURRENCY = 'RUB'
动态生成常规菜单的函数,替换原硬编码的staye:
def get_main_keyboard(user_id: int) -> ReplyKeyboardMarkup: # 获取用户当前选中的货币,无记录则用默认值 current_currency = user_currency.get(user_id, DEFAULT_CURRENCY) staye = ReplyKeyboardMarkup(row_width=2, resize_keyboard=True) course = KeyboardButton(text=f"BTC/{current_currency}") course1 = KeyboardButton(text="test1") course2 = KeyboardButton(text="test2") staye.add(course, course1, course2) return staye
修改后的Inline货币选择键盘:
set_menu = InlineKeyboardMarkup(row_width=1, inline_keyboard=[ [ InlineKeyboardButton( text="RUB", callback_data='RUB' ), InlineKeyboardButton( text="UAH", callback_data='UAH' ), InlineKeyboardButton( text="USD", callback_data='USD' ), InlineKeyboardButton( text="KZT", callback_data='KZT' ), InlineKeyboardButton( text="BYN", callback_data='BYN' ), ] ])
调整后的设置菜单处理函数:
@dp.message_handler(Command(commands=['set'])) async def setting_menu(message: types.Message): # 调用动态函数生成当前用户的常规菜单 await message.answer("⚙ 设置", reply_markup=get_main_keyboard(message.from_user.id)) await message.answer(f"{message.from_user.first_name},你已进入设置页。\n\n" f"请在下方菜单中选择需要使用的货币。\n" reply_markup=set_menu)
新增货币选择回调处理函数:
@dp.callback_query_handler(lambda c: c.data in ['RUB', 'UAH', 'USD', 'KZT', 'BYN']) async def process_currency_choice(callback: types.CallbackQuery): user_id = callback.from_user.id # 更新用户货币偏好 selected_currency = callback.data user_currency[user_id] = selected_currency # 回应回调,消除按钮加载状态 await callback.answer(f"已切换为{selected_currency}") # 推送新的常规菜单替换原有菜单 await callback.message.answer(f"已成功将结算货币切换为{selected_currency}", reply_markup=get_main_keyboard(user_id))
Bot启动代码:
if __name__ == '__main__': from aiogram import executor executor.start_polling(dp, skip_updates=True)
内容的提问来源于stack exchange,提问作者Creobit
相关产品推荐
相关产品推荐

