Ответы пользователя по тегу Python
  • Как сделать меню InlineKeyboard которое будет переключаться как страницы (Telebot)?

    InternetMaster
    @InternetMaster
    Интернет
    Тут зависит от того, постоянный ли результат или динамический.

    Если постоянный (не изменяется если, например запрос был сделан сейчас и через 3 секунды), то можно просто указать, что стрелочка "вперед" перекинет на следующую страничку результатов.

    Для этого в callback нужно передать уникальный идентификатор запроса (например, результаты по поиску "как приготовить роллы" это уникальный идентификатор "1", запрос "как приготовить блины" уникальный идентификатор "2", и т.д.).
    Callback data может выглядеть как-то так: "result1_2" (где 1 - уникальный идентификатор запроса, а 2 - номер странички, куда перебросить при нажатии).
    Когда пользователь нажмет на эту кнопку, выдайте callback "result1_3", а в кнопку назад - "result1_1".

    Если динамическая система, например как у гугла или яндекса, где при каждом запросе уникальные результаты, то лучше сразу записать в базу все ответы, и уже от туда доставать, с уникальным идентификатором запроса для каждого конкретного запроса. Но это уже другой уровень, думаю что не в вашем случае.
    Ответ написан
    Комментировать
  • Почему не обрабатывается следующий handler?

    InternetMaster
    @InternetMaster
    Интернет
    Потому что у тебя обработчик команды /go находится ниже обработчика текста. Команда /go относится к тексту, если обработчик не ловит эту команду раньше текста. Просто поднимите обработчик команды.

    @bot.message_handler(commands=['start'])  
    def welcome(message):
        sti = open('imagine/sticker.webp', 'rb')
        bot.send_sticker(message.chat.id, sti)
    
        #КЛАВИАТУРА 1
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard =True)
        item = types.KeyboardButton("\N{world map}")
    
        markup.add(item)
    
        bot.send_message(message.chat.id, "Привет! /help".format(message.from_user,bot.get_me()),
                         parse_mode='html', reply_markup=markup)
    
    @bot.message_handler(commands=['help'])
    def hi1(message):
        bot.send_message (message.chat.id, "Наберите команду /go или /we")
            
    @bot.message_handler(commands=['go'])
    def go(message):
        
        #КЛАВИАТУРА 2
        markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard =True)
        item1 = types.KeyboardButton("\N{baby}")
        item2 = types.KeyboardButton("\N{girl}")
        item3 = types.KeyboardButton("\N{man}")
    
        markup.add(item1, item2, item3)
        
        bot.send_message(message.chat.id, "Возраст?", reply_markup=markup)
        bot.register_next_step_handler(go1)
    
    @bot.message_handler(content_types=['text'])
    def hi(message):
        if message.chat.type == 'private':
            if message.text == '\N{world map}':
                 mesg = bot.send_message(message.chat.id, 'наберите команду /go')
                 if message.text == '/go':
                     bot.register_next_step_handler(mesg, go)
            else:
                bot.send_message(message.chat.id, 'Не знаю, что и ответить \N{anguished face} \nНабери команду /help, чтобы ознакомиться со списком команд')
    
    
    def go1(message):
        if message.chat.type == 'private':
            if message.text == '\N{baby}':
    
                 #КЛАВИАТУРА 3
                markup = types.ReplyKeyboardMarkup(resize_keyboard=True, one_time_keyboard =True)
                item1 = types.KeyboardButton("игры")
                item2 = types.KeyboardButton("деньги")
                item3 = types.KeyboardButton("телки")
    
                markup.add(item1, item2, item3)
            
                bot.send_message(message.chat.id, 'Окей, кого вы любите больше?')
    Ответ написан
    Комментировать
  • Не работает меню и за Webhook, как исправить?

    InternetMaster
    @InternetMaster
    Интернет
    Не понял, зачем bot.polling() если у вас webHook?
    Это раз. Во вторых, вы хотите дать самоуничтожение серверам Telegram или что? Зачем вы в качестве своего url даете url сервера телеграма на который обычно нужно отправлять запросы, если телеграм с него и посылает вам (см. переменную APP_URL)?
    В третьих, хочу вам сказать, чтобы вы не забыли насчет слешей когда будете принимать запросы от телеграма, чтобы если ваш url был yourdomain.com/secrettoken/ вы указали @server.route('/secrettoken/'), а не @server.route('/secrettoken')

    Можно через домен (желательно), можно по IP, но указать ваш сервер куда телеграм будет посылать запросы, а не чтобы телеграм сам себе посылал запросы.

    Также не забудьте, про сертификат SSL, который требует от вас телеграм. Можно - нормальный, можно самоподписанный. Его отправьте в запросе setWebhook и добавьте к server.run в паре с секретным ключом.

    Если не хотите SSL, можно настроить Local Bot API Server, и чтобы он отсылал вам запросы по localhost и вы ему, но это куда запарнее, чем дать SSL.
    Ответ написан
    Комментировать
  • Как зациклить телеграм бота, написанного в питоне?

    InternetMaster
    @InternetMaster
    Интернет
    Необходимо строго соблюдать пункт правил 3.8!

    А по вопросу просто добавить else в text handler
    Ответ написан
  • Как определить количество фото в media group (pytelegrambotapi)?

    InternetMaster
    @InternetMaster
    Интернет
    Телеграм высылает все фото по отдельности (не важно, были они отправлены группой или по отдельности). Тут нужно пересчитать количество полученных от пользователя сообщений message photo. Или перед отправкой спросить у пользователя.
    Ответ написан
  • Как с помощью ботов отправлять видео в телеграмме которое весит больше 50 Мб?

    InternetMaster
    @InternetMaster
    Интернет
    Запустить telegram-bot-api на локальном сервере. Тогда отправлять можно будет до 2 гб.
    Ответ написан
    Комментировать
  • Как реализовать что б при нажатии кнопки клавиатуры в телеграм боте у вас открывался чат с человеком?

    InternetMaster
    @InternetMaster
    Интернет
    Можно Inline кнопкой в качестве url передать username пользователя с которым требуется открыть чат. Ссылка в формате t.me/username.
    Ответ написан
    Комментировать
  • Как сделать сертификат для Webhook Telegram на Windows 10??

    InternetMaster
    @InternetMaster
    Интернет
    При определенных обстоятельствах сертификат не нужен вообще.
    А если он нужен, то есть инструкция от самого Telegam. https://core.telegram.org/bots/self-signed
    Ответ написан
  • Почему Telegram Bot неполностью форматирует текст?

    InternetMaster
    @InternetMaster Автор вопроса
    Интернет
    Ответ написан
    Комментировать
  • Как реализовать поиск в sqlite на python?

    InternetMaster
    @InternetMaster
    Интернет
    Следует использовать нейронную сеть.
    Ее конечно надо натренировать (вряд ли есть готовые решения в сети "Интернет"), но можно обратиться и на фриланс и куда хочешь, хоть на YouTube по видеороликам.
    Ответ написан
    Комментировать
  • Как запустить параллельный процесс в боте Telegram на Python?

    InternetMaster
    @InternetMaster
    Интернет
    Гораздо лучше запустить этот процесс вообще на отдельном сервере. Например, арендовать сервер на 1 час (с почасовой оплатой) и уже на нем пройтись по базе пользователей. При этом основный скрипт работать будет.
    Ну или на этом же сервере, но в отдельном скрипте, правда это будет занимать ресурс от используемого сервера.
    Ответ написан
    Комментировать
  • Pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; Как исправить?

    InternetMaster
    @InternetMaster
    Интернет
    Скажите, зачем вы тег Telegram поставили у вопроса если ошибка в SQL запросе. При этом, даже не указав используемую СУБД.
    Вот код, если вы используете MySql:
    @bot.message_handler(commands=['roulete'])
    def send_rulet(message):
      us_id = str(message.chat.id) # или integer, смотря какой тип используется в базе данных
      cursor.execute('SELECT coins FROM users WHERE user_id = “' +us_id+'“') # защита от инъекций не нужна, потому что от телеграма не может поступить инъекция
      coins = str(cursor.fetchone())
      cursor.execute("SELECT * FROM 'users' WHERE 'user_id'='" + us_id + "'")
      info = cursor.fetchone()
      if info is None:
        bot.send_message(message.chat.id, "Используйте /login")
      else:
    Ответ написан
    1 комментарий
  • Как сделать что бы телеграм бот автоматически перезапускался после того как выдаст ошибку?

    InternetMaster
    @InternetMaster
    Интернет
    Зачем раз в 2 секунды проверять работоспособность скрипта, и если упал - перезапускать? Такой блевотины я давно не видел. Тут же надо сделать обработчик исключений (ошибок) стандартный.

    В Python за это отвечает try-except. Добавляешь бесконечный цикл, и в случае не истины (поломки) он вернется к действиям, которые должны будут исполниться при истине.

    while True:
        try:
            bot.polling()
        except:
            continue


    Вместо bot.polling() нужно добавить любой другой метод запускающий long polling, если в скрипте используется библиотека альтернативная PyTelegramBotAPI
    Ответ написан
    2 комментария
  • Можно ли получить id сообщения от бота (telegram)?

    InternetMaster
    @InternetMaster
    Интернет
    Если у вас есть id сообщения, то вы можете без проблем найти отправленное сообщение полностью!
    Суть в том, что вы используете forwardMessage

    await bot.forward_message(chat_id=<чат id КУДА ПЕРЕСЛАТЬ СООБЩЕНИЕ>, from_chat_id=<чат id ГДЕ БЫЛО ОТПРАВЛЕНО СООБЩЕНИЕ>, message_id<id сообщения>)


    В качестве chat_id можете использовать любой аккаунт. Вообще любой, это неважно, главное чтобы боту удалось сообщение отправить на этот аккаунт

    P.S. конечно, надо будет знать message_id сообщения где находится статус заказа, но message_id можно записывать во время отправки сообщения. В случае успеха (то есть если сообщение бот сможет отправить) он вернет Message. Для получения текста - message.text

    P.S.S. Этот метод ещё можно использовать для человеко-читаемого формата. То есть если кто-то будет стоять физически, например за пунктом выдачи заказов, то можно в chat_id передать chat_id работяги который выдает заказы, и ему уже придёт сообщение такое же как и пользователю.
    Ответ написан
  • Как сделать, чтоб он сначала задавал вопрос,а потом вызывал определенную функцию?

    InternetMaster
    @InternetMaster
    Интернет
    Так высунь функции из простого кода и используй их только в конце где "if".
    import pyshorteners
    import os
    import platform
    import qrcode
    
    
    class URL():
        
        action = int(input(" What to do? (1.QrCode 2.ShortUrl) "))
    
        def short_url():
    
            url = input(" URL: ")
            n = input(" Choice service ( 1:Os.db, 2:Chilp.it, 3:Da.gd, 4:Is.gd, 5:Qps.ru, 6:TinyURL.com):  ")
    
            if n == str(1):
                s = pyshorteners.Shortener()
                f = s.osdb.short(url)
                print(" Short URL: ",f)
            elif n == str(2):
                s = pyshorteners.Shortener()
                short_url = s.chilpit.short(url)
                print(" Short URL: ",short_url)
            elif n == str(3):
                s = pyshorteners.Shortener()
                abz = s.dagd.short(url)
                print(" Short URL: ",abz)
            elif n == str(4):
                s = pyshorteners.Shortener()
                abv = s.isgd.short(url)
                print(" Short URL: ",abv)
            elif n == str(5):
                s = pyshorteners.Shortener()
                abh = s.qpsru.short(url)
                print(" Short URL: ",abh)
            elif n == str(6):
                s = pyshorteners.Shortener()
                abk = s.tinyurl.short(url)
                print(" Short URL: ",abk)
            else:
                print(' Error ')
    
        def qr_code():
    
            URL = input(" URL: ")
            file = input(" Enter file name:")
    
            filename = file +".png"
    
            img = qrcode.make(URL)
            img.save(filename)
    
        if action == 1:
            qr_code()
        elif action == 2:
            short_url()
        else:
            print(" Error ")
    Ответ написан
  • Как мне вернуть текст, отправленный боту (Telebot)?

    InternetMaster
    @InternetMaster
    Интернет
    Нужно писать сообщение согласно HTML тегам!
    В конце не забыв приписать parse_mode!
    Например, чтобы отправился жирный либо подчеркнутый текст, нужно заточить их в соответствующие теги
    <b> это жирный текст </b>
    <u> это подчеркнутый текст </u>


    То есть, в итоге код будет выглядеть так:
    import telebot
    
    token = 'TOKEN'
    channel_name = '@CHANNEL'
    
    bot = telebot.TeleBot(token)
    
    @bot.message_handler(content_types=['text', 'audio'])
    def send_message_group(message):
        doc_id = message.audio.file_id
        bot.send_audio(channel_name, audio=doc_id, caption=message.text, parse_mode='HTML')
        print(f'\nСообщение успешно доставлено.\nText: {message.text}\nFile_Id: {doc_id}')
    
    if __name__ == '__main__':
        bot.infinity_polling()
    
    # При этом message.text должен быть составлен так "Это обычный шрифт <b> а тут уже жирный шрифт </b> тут снова обычный <u> а тут подчеркнутый текст </u>"
    Ответ написан
  • Можно создать такого Телеграм-бота?

    InternetMaster
    @InternetMaster
    Интернет
    Так это чат-бот стандартный. Таких миллионы, соответственно можно!

    Следует понимать, что надо изучать БД sqlite3 обязательно!

    Возвращайся с уже конкретными вопросами по отдельным реализациям твоего скрипта когда станешь по умнее.
    Ответ написан
    Комментировать
  • Есть способ вытащить названия треков и видео у пользователя?

    InternetMaster
    @InternetMaster
    Интернет
    Hcuy ну нельзя же быть таким ленивым.

    https://vk.com/dev.php?method=audio_object
    https://vk.com/dev/objects/video
    Ответ написан
    Комментировать
  • Как сделать кнопки и подсчёт голосов под сообщением на pytelegrambotapi?

    InternetMaster
    @InternetMaster
    Интернет
    Добро пожаловать на сильно неприятную сторону Telegram API!
    Тема затрагивает самую бесячую, сложную и вечно неработающую сторону Telegram Bot!
    Нам предстоит работать с edit_message_text еще и с call, и разумеется с БД!

    P.S. Следующий код подразумевает то, что ты прекрасно знаешь как работать с sqlite3 в python

    Вам следует создать таблицу в БД где вы будете записывать user_id всех кто нажал хотя бы на одну кнопку, и еще 2 столбца для каждой кнопки с общим результатом количества всех пользователей кто нажал на неё.

    Добавляешь сообщение с кнопкой
    def deffers():
        cursor.execute('SELECT obshee_1 FROM tablica')
        knopach1 = cursor.fetchone()
        cursor.execute('SELECT obshee_2 FROM tablica')
        knopach2 = cursor.fetchone()
        klava = types.InlineKeyboardMarkup()
        button1=types.InlineKeyboardButton(text='Всего: '+knopach1[0], callback_data='knopka1')
        button2=types.InlineKeyboardButton(text='Всего: '+knopach2[0], callback_data='knopka2')
        bot.send_message(message.text, 'Ваше абсолютно любое сообщение. Абсолютно любое.', reply_markup=klava)


    Теперь нужно обрабатывать нажатие кнопки пользователей.

    Потом, в обработчике вы должны вытащить значение сколько людей проголосовало за нажатую кнопку, прибавить к нему +1 и вернуть новое значение в БД, занеся user_id, потом с этим же user_id нажать на эту же или другую кнопку не получится.

    Потом нужно сделать bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text='Всего: [СКОЛЬКО БЫЛО+1]',reply_markup=klava)
    Ответ написан