RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1431619
Accepted
Utsiye
Utsiye
Asked:2022-07-21 05:51:20 +0000 UTC2022-07-21 05:51:20 +0000 UTC 2022-07-21 05:51:20 +0000 UTC

机器人不响应电报点击

  • 772

我在 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)
python telebot
  • 1 1 个回答
  • 36 Views

1 个回答

  • Voted
  1. Best Answer
    oleksandrigo
    2022-07-21T14:41:36Z2022-07-21T14:41:36Z

    改变了一切...

    # делаем словарь с юзерами
    users = {}
    
    
    # делаем функцию для более удобного получения данных из словаря
    def get_data(user_id: int, data: str, default=None):
        users.setdefault(user_id, {"state": "", "language_var": "ru"})
        return users[user_id].get(data, default)
    
    
    @bot.message_handler(commands=["start"])
    def start(message: types.Message):
        # при старте делаем запись юзера в словарь
        users.setdefault(message.from_user.id, {"state": "", "language_var": "ru"})
    
        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: call.data == "Settings")
    def news_settings(call: types.CallbackQuery):
        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: call.data == "CheckNews")
    def check_news(call: types.CallbackQuery):
        # пользуемся нашим словарем, если данных в нем не будет, то вернет пустую строку
        category_var = get_data(call.message.from_user.id, "category_var", '')
        language_var = get_data(call.message.from_user.id, "language_var", '')
        country_var = get_data(call.message.from_user.id, "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=f'*{titles[i]}*\n{descriptions[i]}',
                                 parse_mode="Markdown")
            except Exception:
                pass
    
    
    @bot.callback_query_handler(func=lambda call: call.data == "Language_settings")
    def lang_settings(call: types.CallbackQuery):
        language_markup = types.InlineKeyboardMarkup(row_width=1)
    
        # я поменял колбек дату, для того чтобы понимать откуда именно был колбек
        # в этом случае я добавил префикс choise_lang чтобы бот реагировал на их всех, но не на другие
        language_markup.add(types.InlineKeyboardButton('Русский', callback_data='choise_lang:ru'),
                            types.InlineKeyboardButton('Английский', callback_data='choise_lang:en'),
                            types.InlineKeyboardButton('Немецкий', callback_data='choise_lang:de'),
                            types.InlineKeyboardButton('Назад', callback_data='choise_lang:back'))
        bot.send_message(call.message.chat.id,
                         text='*На каком языке вы хотите читать новости?*',
                         reply_markup=language_markup,
                         parse_mode="Markdown")
    
    
    # такие колбеки ловим вот так
    @bot.callback_query_handler(func=lambda call: call.data.startswith("choise_lang"))
    def language_handler(call: types.CallbackQuery):
        # к слову колбек дата ведь уже другая и её нужно обработать, мы разбиваем стоку по : и берем правую часть
        result = call.data.split(":")[1]
        # сразу обработаем вариант с кнопкой назад
        if result == "back":
            main_menu(call.message)
            return
        # если же это была нажата не кнопка назад, то тогда просто запишите колбек в дату, не вижу смысла в куче ифов
        users[call.message.from_user.id]['language_var'] = result
    
    
    @bot.callback_query_handler(func=lambda call: call.data == "Category_settings")
    def category_choise(call: types.CallbackQuery):
        category_markup = types.InlineKeyboardMarkup(row_width=2)
        category_markup.add(types.InlineKeyboardButton('Спорт', callback_data='choise_category:sport'),
                            types.InlineKeyboardButton('Бизнес', callback_data='choise_category:business'),
                            types.InlineKeyboardButton('Развлечения', callback_data='choise_category:entertainment'),
                            types.InlineKeyboardButton('Общее', callback_data='choise_category:general'),
                            types.InlineKeyboardButton('Медицина', callback_data='choise_category:health'),
                            types.InlineKeyboardButton('Наука', callback_data='choise_category:science'),
                            types.InlineKeyboardButton('Технологии', callback_data='choise_category:technology'),
                            types.InlineKeyboardButton('Все категории', callback_data='choise_category:Default'))
        bot.send_message(call.message.chat.id,
                         text='*Какие новости вы хотите читать?*',
                         reply_markup=category_markup,
                         parse_mode="Markdown")
    
    
    @bot.callback_query_handler(func=lambda call: call.data.startswith("choise_category"))
    def category_handler(call: types.CallbackQuery):
        result = call.data.split(":")[1]
        if result == "Default":
            users[call.message.from_user.id]['category_var'] = ''
            return
    
        users[call.message.from_user.id]['category_var'] = result
    
    
    @bot.callback_query_handler(func=lambda call: call.data == "Country_settings")
    def category_choise(call: types.CallbackQuery):
        country_markup = types.InlineKeyboardMarkup(row_width=2)
        country_markup.add(types.InlineKeyboardButton('Китай', callback_data='choise_lang:ch'),
                           types.InlineKeyboardButton('США', callback_data='choise_lang:us'),
                           types.InlineKeyboardButton('Россия', callback_data='choise_lang:ru'),
                           types.InlineKeyboardButton('Польша', callback_data='choise_lang:pl'),
                           types.InlineKeyboardButton('Украина', callback_data='choise_lang:ua'),
                           types.InlineKeyboardButton('Германия', callback_data='choise_lang:de'))
        bot.send_message(call.message.chat.id,
                         text='*Новости из какой страны вы хотите читать?*',
                         reply_markup=country_markup,
                         parse_mode="Markdown")
    
    
    @bot.callback_query_handler(func=lambda call: call.data.startswith("choise_category"))
    def category_handler(call: types.CallbackQuery):
        result = call.data.split(":")[1]
        users[call.message.from_user.id]['category_var'] = result
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5