Ответы пользователя по тегу Telegram
  • Как добавить функцию сразу при старте бота telebot?

    @Alexa2007
    class Mybot(telebot.TeleBot):
        def __init__(self,arg, *args, **kwargs):
            super().__init__(arg, *args, **kwargs)
    
        def loop_poop(self):
            while True:
                time.sleep(15)
                print(time.ctime())
    
        def polling(self, *args, **kwargs):
            thread = threading.Thread(target=self.loop_poop)
            thread.start()
            super().polling(*args, **kwargs)
    Ответ написан
  • Можно ли удалить Inline клавиатуру в телеграм боте?

    @Alexa2007
    Для удаления клавиатуры есть специальный метод в апи. Но это не всегда надо, только если её необходимо удалить. Но в твоем случае необходимо просто посылать новую. И она сама поменяется.
    Ответ написан
    Комментировать
  • Всё время ли придётся создавать новую функцию, чтобы заполучить message.text с bot.register_next_step_handler()?

    @Alexa2007
    Как вариант зациклить функцию саму на себя, но это не для каждого случая, Если сделать опросник имя, фамилия, возраст, то на легке.
    Вот один из вариантов Дана строка из слова и перевода. Бот спрашивает слово, а мы должны написать перевод. Но бот не ждет нашего ответа и двигается по коду дальше.?
    Ответ написан
    Комментировать
  • Дана строка из слова и перевода. Бот спрашивает слово, а мы должны написать перевод. Но бот не ждет нашего ответа и двигается по коду дальше.?

    @Alexa2007
    # -*- coding: utf-8 -*-
    import telebot
    
    bot = telebot.TeleBot('11111111111')
    
    en = ['one','two','three']
    ru = ['один','два','три']
    
    @bot.message_handler(commands=[ 'start'])
    def send_welcome(message):
        msg = bot.send_message(message.chat.id,f'Переведи слово {ru[0]}')
        bot.register_next_step_handler(msg, process_name_step, 0 )
    
    
    def process_name_step(message, count=0):
        print(message.text, count, len(en))
        if message.text == en[count]:
            if count<len(en)-1:
                msg = bot.send_message(message.chat.id,f'Молодец,\nПереведи слово {ru[count+1]}')
                bot.register_next_step_handler(msg, process_name_step, count+1)
            else:
                bot.send_message(message.chat.id,'Вопросы закончились')
                count=0
        else:
            if count<len(en)-1:
                msg = bot.send_message(message.chat.id,f'Неугадал,\nПереведи слово {ru[count+1]}')
                bot.register_next_step_handler(msg, process_name_step, count+1)
            else:
                bot.send_message(message.chat.id,'Вопросы закончились')
                count = 0
        
    
    bot.enable_save_next_step_handlers(delay=2)
    bot.load_next_step_handlers()
    
    bot.polling()
    Ответ написан
    Комментировать
  • Почему удалённый хост принудительно разрывает соединение?

    @Alexa2007
    Запись пользователя в бд
    @bot.message_handler(func=lambda message: message.text == "start")
    @bot.message_handler(commands=['start'])
    def start_message(message):
        bot.send_message(message.chat.id, 'Добро пожаловать в бот Агрегатор новостей! Здесь вы можете подписаться на рассылку '
                                          'интересующих вас новостей, которые бот будет вам отправлять. '
                                          'Для вывода новостных источников напишите команду /news', reply_markup = start_buttons())
        Base().add_user(message.from_user.id, message.chat.id)


    Унаследованный, модифицированный бот
    class Mybot(telebot.TeleBot):
        def __init__(self,arg, *args, **kwargs):
            super().__init__(arg, *args, **kwargs)
    
        def loop_poop(self):
            while True:
                parse_all_news(self)
                time.sleep(15)
                print(time.ctime())
    
        def polling(self, *args, **kwargs):
            thread = threading.Thread(target=self.loop_poop)
            thread.start()
            super().polling(*args, **kwargs)


    Один декоратор вместо десятка elif
    @bot.callback_query_handler(func=lambda call: call.data in news_sources.values())
    def callback_worker(call):
        news_source = ''
        for k,v in news_sources.items():
            if call.data == v:
                news_source = k
        try:
            Base().add_subscribe(call.from_user.id, call.data) 
            bot.edit_message_text(f'Вы подписались на новости {news_source}', call.message.chat.id, call.message.message_id, reply_markup=subscribe_news_buttons())
        except Exception as e:
            bot.send_message(call.message.chat.id, f'Подписка на новости {news_source} не удалась')


    Создание колбек кнопок согласно подписок
    def subscribe_news_buttons():
        keyboard = types.InlineKeyboardMarkup()
        for btn_text, callback in news_sources.items():
            keyboard.add(types.InlineKeyboardButton(text=btn_text, callback_data=callback))
        return keyboard
            
    def get_user_subscribes(user_id):
        keyboard = types.InlineKeyboardMarkup()
        sc = Base().get_subscribes(user_id)
        for chanel,sbs in sc:
            if sbs == '1':
                news_source = ''
                for k,v in news_sources.items():
                    if chanel == v:
                        news_source = k
                keyboard.add(types.InlineKeyboardButton(text='Отписаться от '+news_source, callback_data=f'del_{chanel}'))
        return keyboard

    Получение подписок из базы
    def get_subscribes(self,user_id):
            r1,r2=[],[]
            sql = f"SELECT * FROM {self.table} WHERE {user_id} = user_id"
            try:
                res = self.cursor.execute(sql).fetchall()
                rows = self.cursor.execute(sql).description
                x=0
                for row in rows[2:]:
                    r1.append(row[0])
                for _ in res[0][2:]:
                    r2.append(_)
                result = zip(r1,r2)
                return list(result)
            except Exception as e:
                return False, e


    Полный код
    Ответ написан
  • Как сделать проверку на закрытие кода?

    @Alexa2007
    Вообщем, мне нужен код

    Он тебе не нужен! Но давай сначала.
    Юзер нажимает старт и в это время информация о нем должна попасть в базу данных юзеров. А когда тебе надо остановить сервер ты берешь эту базу и всем по очереди начинаешь писать что ты закрыся. Это ответ на твой вопрос.
    Но это так не делается. Никому не интересно, что твой бот сейчас не работает и согласись если у тебя нет конкретной задачи и ты просто тренируешься то и тысячь посещений в минуту у твоего бота тоже не будет. А вот к тому моменту когда твой бот будет настолько крут ты и сам сможешь ответить на твой вопрос. Поэтому не забивай голову ненужной информацией, а лучше подучи питон и набивай своего бота полезным функционалом.
    Вот к примеру в питоне есть такая штука как list, и с его помощью можно делать крутые вещи. К примеру возьмем твоего бота:
    это твой код
    @bot.message_handler(commands=["start"])
    def welcome(message):
      #Сделаем клавиатуру
      markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
      item1 = types.KeyboardButton("Как дела?")
      item2 = types.KeyboardButton("Я знаю что ты вор!")
      item3 = types.KeyboardButton("Есть хочешь?")
      item4 = types.KeyboardButton("А спать хочешь?")
      item5 = types.KeyboardButton("Что-то секретное...")
      markup.add(item1, item2, item5)
      
      bot.send_message(message.chat.id, "Привет, {0.first_name}!\nЯ - <b>{1.first_name}</b>. Напиши мне что-то, может познакомимся, да?".format(message.from_user, bot.get_me()),
        parse_mode='html', reply_markup=markup)

    А это тоже самое только с использованием list:
    start_page_buttons=["Как дела?","Я знаю что ты вор!","Есть хочешь?","А спать хочешь?", "Что-то секретное..."]
    
    def start_buttons_create():
        keyboard = types.ReplyKeyboardMarkup(resize_keyboard=True)
        for _ in start_page_buttons:
            keyboard.add(_)
        return keyboard
    
    
      
      bot.send_message(message.chat.id, "Привет, {0.first_name}!\nЯ - <b>{1.first_name}</b>. Напиши мне что-то, может познакомимся, да?".format(message.from_user, bot.get_me()),
        parse_mode='html', reply_markup=start_buttons_create())

    И самое главное это то, что ту функцию которую я написал, ты можешь перенести в отдельный файл и в результате у тебя не будет оооооочень длинный код. А будет несколько файлов, каждый из которых отвечает за свой функционал
    Ответ написан
    3 комментария
  • Сallback_data. Python. Ошибка TypeError: send_message() got an unexpected keyword argument 'callback_data'?

    @Alexa2007
    Это БРЕД!!!
    bot.send_message (message.chat.id, 'Напиши, и я запомню', callback_data = 'i know')

    Надо примерно вот так:
    markup4 = types.InlineKeyboardMarkup()
        item1 = types.InlineKeyboardButton("Разозлиться", callback_data='good1')
        item2 = types.InlineKeyboardButton("Вытереть слезки", callback_data='bad1')
     
        markup4.add(item1, item2)
     
        bot.send_message(message.chat.id, text='Выбрать действие:', reply_markup=markup4)
    Ответ написан
  • Как прекратить "слушать" bot.*_handler?

    @Alexa2007
    В данном варианте думаю вместо декораторов, следует использовать знакомый тебе метод bot.register_next_step_handler(massage,save_name). В примере с гитхаба видно как задается вопрос какой пол? и добавляется две кнопки м и ж, а в том сообщении куда они передаются, удаляются, а ответ обрабатывается как текст.
    def process_age_step(message):
        try:
            chat_id = message.chat.id
            age = message.text
            if not age.isdigit():
                msg = bot.reply_to(message, 'Age should be a number. How old are you?')
                bot.register_next_step_handler(msg, process_age_step)
                return
            user = user_dict[chat_id]
            user.age = age
            markup = types.ReplyKeyboardMarkup(one_time_keyboard=True)
            markup.add('Male', 'Female')
            msg = bot.reply_to(message, 'What is your gender', reply_markup=markup)
            bot.register_next_step_handler(msg, process_sex_step)
        except Exception as e:
            bot.reply_to(message, 'oooops')
    
    
    def process_sex_step(message):
        try:
            chat_id = message.chat.id
            sex = message.text


    Еще хотел бы предложить внести изменения в код, в таких случаях:
    keybord = keybord_yes_or_no()
        bot.send_message(massage.from_user.id, text= quest, reply_markup=keybord)


    Если генерировать кнопки таким способом, будет на одну строчку меньше:
    def day_btns():
      days = types.InlineKeyboardMarkup(row_width=7)
      days.add(*[types.InlineKeyboardButton(text='Day '+str(i),callback_data='call'+str(i)) for i in range(1,8)])
      return days
    
    #Пример использования
    bot.send_message(message.chat.id,'Days of week',reply_markup=day_btns())
    #Хватает и одной строки

    Так же если интересно вот полный образец моего тестового бота
    Ответ написан
    2 комментария
  • Как интегрировать программу на python в telegram бота?

    @Alexa2007
    Во первых советую вам разделить бота на несколько файлов и избавиться от кучи elif. Потому что, когда вы уберете pass и напишете код это будет оооооочень длинный код. Во вторых: как вариант переписать класс бота дополнив своими методами, а инфа будет гоняться через self.
    import telebot
    import time
    import threading
    API_TOKEN = '11111111111111111111111111111111'
    class my_bot(telebot.TeleBot):
        def loop_poop(self):
            while True:
                print(time.ctime())
                time.sleep(1)
    
        def start_action(self):
            thread = threading.Thread(target=self.loop_poop)
            thread.start()
    
    bot = my_bot(token = API_TOKEN, threaded=False)
    
    @bot.message_handler(commands=['start'])
    def wellcome(message):
        if message.chat.type == 'private':
            bot.send_message(message.chat.id,'Hello')
    bot.start_action()
    bot.polling()

    Но это я походу загнул. думаю вам необходимо на пальцах объяснить, что вы хотите сделать, потому как нифига не понятно
    @bot.message_handler(content_types=['text']) сделать вычисления, а потом в @bot.callback_query_handler(func=lambda call: True) эти вычисления отправлять.

    Допустим в @bot.message_handler(content_types=['text']) вы напишете х=2+2 затем в @bot.callback_query_handler(func=lambda call: True) необходимо сделать х+=2 и в консоли вы ждете 6. Я так понимаю... Если да то думаю проблема в логике... Такое возможно с использованием глобал, но прикол в том что эта глобал для всех пользователей и если три человека одновременно будут плюсовать, там будет *опа. Поэтому как вариант создавать 17854346.json для каждого пользователя и с каждым событием считывать данные
    Ответ написан
    Комментировать
  • Time.sleep() Как поставить значение пользователя?

    @Alexa2007
    А что значит
    1 лошадь
    5 лошадь

    kb2 = types.InlineKeyboardButton('1 horse', callback_data = '1h')
          kb3 = types.InlineKeyboardButton('5 horse', callback_data = '10h')


    def inline (call):
      if call.message:
        if call.data == '10':
          time.sleep(10)

    Ты так остановишь всего бота. Необходимо создать базу, а в неё записывать юзер, время старта паузы, длинна паузы.
    А вторым циклом сравнивать нынешнее время с данными из базы. И в результате небольшой математики отпрвлять сообщение юзеру из базы внужное время. И работать это будет на компе или впс. Бесплатные хостинги или не запустят код или за пару часов потратишь лимит на день.

    Вот пример двух потоков в боте:
    import telebot
    import time
    import threading
    API_TOKEN = '11111111111111111111111111111111'
    class my_bot(telebot.TeleBot):
        def loop_poop(self):
            while True:
                print(time.ctime())
                time.sleep(1)
    
        def start_action(self):
            thread = threading.Thread(target=self.loop_poop)
            thread.start()
    
    bot = my_bot(token = API_TOKEN, threaded=False)
    
    @bot.message_handler(commands=['start'])
    def wellcome(message):
        if message.chat.type == 'private':
            bot.send_message(message.chat.id,'Hello')
    bot.start_action()
    bot.polling()
    Ответ написан
  • Как добавить sqlite3 в teleboy python?

    @Alexa2007
    С базой легче(и правильнее) работать примерно вот так
    Внизу закоментирован пример того как он работает

    А бот можете тоже создать сразу с легкой масштабируемостью вот так

    И если есть необходимость задавать вопросы и ожидать ответа (введите логин, введите пароль), то вот пример того, как это реализовуется. Тут разжовуется
    Ответ написан
  • Как исправить соотношение видео в боте telebot?

    @Alexa2007
    Когда отправляешь что-то через телегу, она сохраняет это на своих серверах.
    Отправь боту один раз видео, а потом отправляй всем ID этого видео, А телега сама всё сделает, а файл с телефона можно даже удалить...он на сервере
    @bot.message_handler(content_types=["video"])
    def confirming(message):
        if message.content_type == 'video':
            print(message.video.file_id) #ID видео файла на сервере 
            bot.send_video(message.chat.id, message.video.file_id)# Отправляешь его сам себе
        else:
            pass
    Ответ написан
    Комментировать
  • Как отправить свой контакт через sendContact?

    @Alexa2007
    Так проще
    @bot.message_handler(commands=['start'])
    def start_m(message):
        kkb = types.ReplyKeyboardMarkup()
        bbt = types.KeyboardButton('Отправить контакт',request_contact=True)
        kkb.add(bbt)
        bot.send_message(message.chat.id,'Нажми на кнопку, чтобы отправить контакт', reply_markup = kkb)
    Ответ написан
    1 комментарий
  • Почему не работает Handler в Телеграм боте?

    @Alexa2007
    Вот так должен выглядеть хендлер, который сработает:
    @bot.message_handler(commands=['sos'])
    def wellcome(message):
        if message.chat.type == 'private':
            bot.send_message(message.chat.id,'Hello')


    И чтоб он сработал, необходимо в телеге отправить боту "/sos", а не просто sos
    Ответ написан
    Комментировать
  • Как от имени бота телеграм написать в чат?

    @Alexa2007
    Чтобы писать от имени бота необходимо использовать токен бота. Более точно без кода вашего бота Вам никто не поможет
    Ответ написан
  • Как оптимизировать моего телеграм-бота, написанного на Python?

    @Alexa2007
    Ну на первый взгляд можно просто раскидать минимум на три файла:
    1.py
    import telebot
    from telebot import types
    token = bottoken
    bot = telebot.TeleBot(token)
    bot.polling()


    2.py
    #Все хендлеры
    
    @bot.message_handler(commands=['start'])
    def welcome(message):


    2.py
    #Все коллбеки без elif а нормально читаемые
    
    @bot.callback_query_handler(func=lambda call: call.data == '7')
    def seven(call):
        bot.send_message(call.message.chat.id,text = 'seven')
    
    @bot.callback_query_handler(func=lambda call: call.data == '1')
    def one(call):
        bot.send_message(call.message.chat.id,text = 'one')
    Ответ написан
    3 комментария
  • Что нужно сделать чтобы процедура password_generator выводилась в самом телеграме, а не в той проге где я её запустил?

    @Alexa2007
    print(password) замени на return password

    А это тоже в телеге надо вводить?
    type_of_choice = int(input('Type: '))
    
    num = int(input("Quantity of passwords: "))
    
    length = int(input("Length of password: "))

    Если да :Пошагово задавать вопросы
    Ответ написан