如何基于Selenium获取的下拉选项动态生成pyTelegramBotAPI内联键盘?
解决Selenium下拉选项转pyTelegramBotAPI动态内联键盘的问题
我来帮你搞定这个动态生成内联键盘的需求!核心思路是先从Selenium拿到下拉选项,再把这些选项逐个转换成Telegram内联按钮,最后发送带键盘的消息。以下是具体步骤和代码调整:
1. 调整select_aff函数,返回下拉选项列表
首先,我们需要让select_aff能返回获取到的选项(之前的代码只是在内部处理,没有对外返回)。另外,建议把集合换成列表,这样能保留下拉选项原本的顺序,用户体验更好:
def select_aff(): # 获取<select>元素 select = Select(browser.find_element_by_xpath( '//*[@id="formly_1_vAffiliateNetwork_affiliate_network_id_1"]')) # 提取所有非空的选项文本,返回列表 options = [o.text.strip() for o in select.options if o.text.strip()] return options
2. 在消息处理函数中动态生成内联键盘
接下来,在handle_select_affnetwork里调用上面的函数拿到选项,然后用pyTelegramBotAPI的InlineKeyboardMarkup和InlineKeyboardButton来构建键盘:
注意:要先导入telebot的types模块,不然会报错:
from telebot import types
然后修改消息处理函数:
@bot.message_handler(func=lambda message: get_state(message) == OFFER_SELECT_AFFNETWORK) def handle_select_affnetwork(message): if message.text == 'Select': # 先发送提示文本 bot.send_message(message.chat.id, 'Select affiliate network') # 获取下拉选项列表 aff_options = select_aff() # 动态生成内联按钮列表 keyboard = [] for option in aff_options: # 每个按钮对应一个选项,回调数据可以自定义(这里用前缀区分联盟网络的选择) button = types.InlineKeyboardButton(option, callback_data=f"aff_select_{option}") # 每行一个按钮(如果想每行多个,可以把多个按钮放在同一个列表里,比如[button1, button2]) keyboard.append([button]) # 创建内联键盘标记 reply_markup = types.InlineKeyboardMarkup(keyboard) # 发送带内联键盘的消息 bot.send_message(message.chat.id, "Choose your affiliate network:", reply_markup=reply_markup)
3. 处理用户的键盘点击回调
最后,别忘了添加一个回调处理函数,用来响应用户点击内联按钮的操作,比如用Selenium选择对应的下拉选项:
@bot.callback_query_handler(func=lambda call: call.data.startswith('aff_select_')) def handle_affiliate_selection(call): # 从回调数据中提取选中的联盟网络名称 selected_aff = call.data.replace('aff_select_', '') # 用Selenium选择对应的选项 select = Select(browser.find_element_by_xpath( '//*[@id="formly_1_vAffiliateNetwork_affiliate_network_id_1"]')) select.select_by_visible_text(selected_aff) # 回复用户操作成功 bot.answer_callback_query(call.id, f"Successfully selected: {selected_aff}") bot.send_message(call.message.chat.id, f"You've selected the affiliate network: {selected_aff}")
这样整个流程就通了:用户发送"Select"后,Bot会拉取网页下拉选项,生成内联键盘,用户点击按钮后,Bot用Selenium完成选择并反馈结果。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

