You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 03:51:00