我在 Telebot 上编写了一个机器人并制作了一个内联键盘,我是 Telebot 的新手,并不完全了解 call_back 的工作原理,我有一个菜单:观看新闻/设置。当我单击任何时,一切都很好,如果我转到设置,那么还有另一个键盘,但是当我单击它时,什么也没有发生。
import telebot
from newsapi import NewsApiClient
from telebot import types
bot = telebot.TeleBot('токен')
newsapi = NewsApiClient(api_key='токен')
language_var='ru'
category_var=''
country_var=''
@bot.message_handler(commands=["start"])
def main_menu(message):
markup=types.InlineKeyboardMarkup(row_width=1)
markup.add(types.InlineKeyboardButton('Смотреть новости',callback_data='CheckNews'),
types.InlineKeyboardButton('Настройки', callback_data='Settings'),
)
bot.send_message(message.chat.id, text='*Меню:*', reply_markup=markup,parse_mode="Markdown")
@bot.callback_query_handler(func=lambda call:True)
def news_settings_handler(call):
if call.data=='Settings':
settings_markup = types.InlineKeyboardMarkup(row_width=1)
settings_markup.add(types.InlineKeyboardButton('Язык', callback_data='Language_settings'),
types.InlineKeyboardButton('Категория', callback_data='Category_settings'),
types.InlineKeyboardButton('Страна', callback_data='Country_settings'),
)
bot.send_message(call.message.chat.id, text='*Настройки:*', reply_markup=settings_markup, parse_mode="Markdown")
@bot.callback_query_handler(func=lambda call: True)
def settings_handler(call):
if call.data == 'Language_settings':
language_markup = types.InlineKeyboardMarkup(row_width=1)
language_markup.add(types.InlineKeyboardButton('Русский', callback_data='ru'),
types.InlineKeyboardButton('Английский', callback_data='en'),
types.InlineKeyboardButton('Немецкий', callback_data='de'),
types.InlineKeyboardButton('Назад', callback_data='back')
)
bot.send_message(call.message.chat.id, text='*На каком языке вы хотите читать новости?*',
reply_markup=language_markup,parse_mode="Markdown")
@bot.callback_query_handler(func=lambda call: True)
def language_handler(call):
global language_var
if call.data=='ru':
language_var='ru'
elif call.data=='en':
language_var='en'
elif call.data=='de':
language_var='de'
elif call.data=='back':
main_menu(call.message)
elif call.data == 'Category_settings':
category_markup = types.InlineKeyboardMarkup(row_width=2)
category_markup.add(types.InlineKeyboardButton('Спорт', callback_data='sport'),
types.InlineKeyboardButton('Бизнес', callback_data='business'),
types.InlineKeyboardButton('Развлечения', callback_data='entertainment'),
types.InlineKeyboardButton('Общее', callback_data='general'),
types.InlineKeyboardButton('Медицина', callback_data='health'),
types.InlineKeyboardButton('Наука', callback_data='science'),
types.InlineKeyboardButton('Технологии', callback_data='technology'),
types.InlineKeyboardButton('Все категории', callback_data='Default'),
)
bot.send_message(call.message.chat.id, text='*Какие новости вы хотите читать?*',
reply_markup=category_markup, parse_mode="Markdown")
@bot.callback_query_handler(func=lambda call: True)
def category_handler(call):
global category_var
if call.data == 'sport':
category_var = 'sports'
if call.data == 'business':
category_var = 'business'
if call.data == 'entertainment':
category_var = 'entertainment'
if call.data == 'general':
category_var = 'general'
if call.data == 'health':
category_var = 'health'
if call.data == 'science':
category_var = 'science'
if call.data == 'technology':
category_var = 'technology'
if call.data == 'Default':
category_var = ''
elif call.data == 'Country_settings':
country_markup = types.InlineKeyboardMarkup(row_width=2)
country_markup.add(types.InlineKeyboardButton('Китай', callback_data='ch'),
types.InlineKeyboardButton('США', callback_data='us'),
types.InlineKeyboardButton('Россия', callback_data='ru'),
types.InlineKeyboardButton('Польша', callback_data='pl'),
types.InlineKeyboardButton('Украина', callback_data='ua'),
types.InlineKeyboardButton('Германия', callback_data='de')
)
bot.send_message(call.message.chat.id, text='*Новости из какой страны вы хотите читать?*',
reply_markup=country_markup, parse_mode="Markdown")
@bot.callback_query_handler(func=lambda call: True)
def country_handler(call):
global country_var
if call.data == 'ru':
country_var = 'ru'
elif call.data == 'us':
country_var = 'us'
elif call.data == 'de':
country_var = 'de'
elif call.data == 'ua':
country_var = 'ua'
elif call.data == 'ch':
country_var = 'ch'
elif call.data == 'pl':
country_var = 'pl'
elif call.data=='CheckNews':
global category_var
global language_var
global country_var
titles = []
descriptions = []
if category_var!='' and country_var!='':
top_headlines = newsapi.get_top_headlines(category=category_var,language=language_var,country=country_var)
for article in top_headlines['articles']:
titles.append(article['title'])
descriptions.append(article['description'])
elif category_var!='' and country_var=='':
top_headlines = newsapi.get_top_headlines(category=category_var, language=language_var)
for article in top_headlines['articles']:
titles.append(article['title'])
descriptions.append(article['description'])
elif category_var=='' and country_var!='':
top_headlines = newsapi.get_top_headlines(language=language_var,country=country_var)
for article in top_headlines['articles']:
titles.append(article['title'])
descriptions.append(article['description'])
elif category_var=='' and country_var=='':
top_headlines = newsapi.get_top_headlines(language=language_var)
for article in top_headlines['articles']:
titles.append(article['title'])
descriptions.append(article['description'])
for i in range (len(titles)):
try:
bot.send_message(call.message.chat.id, text='*'+titles[i]+'*\n'+'\n'+descriptions[i],parse_mode="Markdown")
except:
pass
if __name__ == '__main__':
bot.polling(none_stop=True)
改变了一切...