Ответы пользователя по тегу Боты
  • В чем заключаеться ошибка?

    @o5a
    вместо "select ..", q= ... прибавлять сумму в самом SQL:
    cursor.execute("UPDATE users SET cash = cash + ? WHERE id = ?", (arg, member.id))
    Ответ написан
    Комментировать
  • Как сделать чтобы в sqlite id людей бота не повторялись?

    @o5a
    Для SQL базы правильнее будет объявить уникальность поля (UNIQUE/PRIMARY KEY), и затем при вставке можно не делать самостоятельных проверок, дубликаты итак не будут заноситься.

    При создании таблицы:
    CREATE TABLE users (
    user_id INTEGER PRIMARY KEY # чтобы заполнялся автоматически, тогда вообще не нужно указывать id, он всегда будет проставляться автоматом новый
    user_name TEXT);

    Тогда при вставке не нужно вообще использовать user_id, оно будет проставляться автоматически
    cur.execute('''INSERT INTO users(user_name) VALUES(?)''', (user_name, ))


    или
    CREATE TABLE users (
    user_id INTEGER UNIQUE, # если планируется самостоятельно заносить id
    user_name TEXT);

    Тогда user_id нужно проставлять самому, но проверку дубликатов делать тоже не придется, если указать OR IGNORE
    cur.execute('''INSERT OR IGNORE INTO users(user_id, user_name) VALUES(?, ?)''', (user_id, user_name))
    Ответ написан
  • Почему выдает ошибку когда пишешь боту старт?

    @o5a
    https://core.telegram.org/bots/api#sendsticker

    Вторым параметром метода должен идти сам стикер (file_d или url)
    Ответ написан
    Комментировать
  • Что делать с ошибкой "connection"?

    @o5a
    Потому что для выбора языка нельзя просто передать единственное значение language, нужен полный словарь настроек (в котором уже меняем язык).
    from pyowm.utils.config import get_default_config
    
    # создаем словарь настроек по умолчанию и в нем уже меняем язык
    config_dict = get_default_config()
    config_dict['language'] = 'ru'
    owm = pyowm.OWM("ключ", config_dict)


    И не забывайте, что на скриншотах тоже видны ключи.
    Ответ написан
    Комментировать
  • При вызове общий сбор, имя выходит левое. Как исправить?

    @o5a
    Потому что построение команды не понятно на что рассчитано

    getting_api.users.get(user_ids=from_id > 0)[0]
    равносильно
    getting_api.users.get(user_ids=True)[0]

    Что же нам выдает API при user_ids=True ?
    https://vk.com/dev/users.get?params[user_ids]=True...
    Ответ написан
    4 комментария
  • Как записать данные которые отправляются боту?

    @o5a
    Список заполняется, просто в текущем коде возвращается он только один раз (в самом начале, когда он еще пустой), т.к. main() запускается только один раз.

    Можно увидеть, добавив например команду /info
    @bot.message_handler(commands = ['info'])
    def send_info(message):
      bot.send_message(message.chat.id, f'data={data}')


    Так что не нужно все эти функции оборачивать в main, они просто должны идти на глобальном уровне.
    Ответ написан
    2 комментария
  • Discord sqlite3.OperationalError: near "m", откуда этот Error?

    @o5a
    Значит имя того пользователя содержит кавычки, в результате при такой текстовой подстановке оно разбивается на куски, вызывая ошибку синтаксиса.
    Используйте для запросов передачу параметров вместо текстового форматирования
    cursor.execute("INSERT INTO users VALUES (?, ?, 52, 0, 0, 0, 0, ?)", (member.name, member.id, member.guild.id))
    Ответ написан
    5 комментариев
  • Python(telebot) как можно сделать активацию переменной при вызове определённой функции или? Нужно для проверки в боте активна ли клавиатура или нет!?

    @o5a
    Не зная, как у вас реализовано, сложно сказать. Насколько понял речь все еще про ReplyKeyboardMarkup. Можно использовать например словарь (или класс для хранения данных) для хранения состояний. И для каждой клавиатуры проставлять состояние. Условно
    states = {"kb":None}
    
    def ... клавиатура1
        keyboard = telebot.types.ReplyKeyboardMarkup(resize_keyboard=True)
        button1 = telebot.types.KeyboardButton(f'Да')
        button2 = telebot.types.KeyboardButton(f'Нет')
        keyboard.row(button1, button2)
        states["kb"] = "kb1"
        bot.send_message(message.chat.id, message, reply_markup=keyboard)
    
    def ... клавиатура2
        keyboard = telebot.types.ReplyKeyboardMarkup(resize_keyboard=True)
        button1 = telebot.types.KeyboardButton(f'Да')
        button2 = telebot.types.KeyboardButton(f'Нет')
        keyboard.row(button1, button2)
        states["kb"] = "kb2"
        bot.send_message(message.chat.id, message, reply_markup=keyboard)
    
    @bot.message_handler(content_types=['text'])
    def echo_text(message):
        if states["kb"] == "kb1":
            if message.text == 'Да':
        elif states["kb"] == "kb2":
            if message.text == 'Да':
    Ответ написан
  • Как запуститть бота на pythonanywhere.com но выдает ошибку No module named 'telebot?

    @o5a
    Нужно ставить для конкретной версии питона с учетом --user
    pip3.7 install --user pytelegrambotapi
    Ответ написан
    Комментировать
  • Как сохранить видео которое отправил пользватель телеграмм боту?

    @o5a
    Простейший вариант. Стоит добавить проверки в виде try..except на случай ошибок.
    @bot.message_handler(content_types=['document'])
    def get_file(message):
        file_name = message.document.file_name
        file_info = bot.get_file(message.document.file_id)
        with open(file_name, "wb") as f:
            file_content = bot.download_file(file_info.file_path)
            f.write(file_content)
        bot.reply_to(message, f"OK. Сохранил {file_name}")


    Типы принимаемых файлов как раз прописываются в content_types, т.е. для видео надо будет использовать 'video' (добавить к списку или заменить).

    Я глянул, для видео нужно другие тэги использовать, и почему-то по аналогии с document не работает, но вот так должно
    @bot.message_handler(content_types=['video'])
    def get_file(message):
        file_name = message.json['video']['file_name']
        file_info = bot.get_file(message.video.file_id)
        with open(file_name, "wb") as f:
            file_content = bot.download_file(file_info.file_path)
            f.write(file_content)
        bot.reply_to(message, f"OK. Сохранил {file_name}")
    Ответ написан
  • Почему бот не работает так, как это планировалось?

    @o5a
    Можно просто проверять как пересечение двух множеств
    if set(white_list_roles) & set(message.author.roles):
        # я админ, могу ругаться
    else:
        # я холоп, ругаться нельзя
        if any(bad_word in message.content for bad_word in black_list):
            await message.delete()

    Для учета регистра нужно там же использовать содержимое сообщения в нижнем регистре message.content.lower()

    В данной постановке не совсем понятно, как именно должен учитываться список разрешенных слов?
    Ответ написан
    2 комментария
  • Как из текста пользователя в телеграмм сделать переменную?

    @o5a
    Судя по логике, хотите иметь возможность получить запрашиваемый после "Введите текст" текст?
    Тогда нужно использовать register_next_step_handler. В нем прописывается следующая функция, которая принимает уже ввод текста.

    bot.send_message(message.chat.id, 'Введите текст')
    bot.register_next_step_handler(message, get_text)
    
    def get_text(message):
        message.text будет как раз запрашиваемый текст
    Ответ написан
    Комментировать
  • Как сделать так чтобы пользователь вводил город в котором нужно найти погоду?

    @o5a
    По-простому можно запрашивать ввод команды с параметром - местом для погоды, забирая его из строки, например так

    @bot.message_handler(commands=['weather'])
    def start(message):
        if ' ' in message.text:
            place = message.text.split(maxsplit=1)[1]
            # работаем с нашим place
        else:
            bot.send_message(message.chat.id, 'Укажите город')


    Если нужна логика с последующим вводом города после запроса параметра, то смотрите на работу register_next_step_handler
    Ответ написан
  • Почему бот не работает?

    @o5a
    Не понятно, зачем бесконечный цикл. Если цель - обработать исключения, лучше делать это для отдельных блоков. Запрос погоды лучше вынести в отдельную функцию, там же обработать исключение на случай проблем с API погоды или неправильного города. Повторяющиеся создания owm удалил. Так должно работать.

    from pyowm.owm import OWM
    from pyowm.utils.config import get_default_config
    import telebot
    
    TOKEN = токен телеграм
    OWM_KEY = API ключ OWM
    
    config_dict = get_default_config()
    config_dict['language'] = 'ru'
    
    bot = telebot.TeleBot(TOKEN)
    
    def get_weather(location):
        try:
            owm = OWM(OWM_KEY, config_dict)
            mgr = owm.weather_manager()
            observation = mgr.weather_at_place(location)
            w = observation.weather
            temp = w.temperature('celsius')["temp"]
    
            answer = answer = f"В городе {location} сейчас {w.detailed_status}\n"
            answer += " Температура сейчас в районе "+ str(temp) + "\n\n"
    
            if temp < 5:
                answer += "Сейчас ОЧЕНЬ ХОЛОДНО!"
            elif temp < 10:
                answer += "Сейчас холодно, одевайся!"
            elif temp < 20:
                answer += "Температура средняя,оденься потеплее!"
            else:
                answer += "Температура нормальная, одевайcя как хочешь!"
        except Exception as e:
            print('Error:', e)
            answer = 'Ошибка такая-то' # или любой другой, на случай неправильного города
    
        return answer
    
    # что под функцией с ошибкой подразумевалось не понятно, но допустим так
    def do_something_erronous():
        1/0
    
    @bot.message_handler(content_types=['text'])
    def send_echo(message):
        # логику работы с OWM переносим в отдельную функцию
    
        # запрашиваем текст о погоде в указанном городе
        answer = get_weather(message.text)
    
        bot.send_message(message.chat.id, answer)
    
    # что осталось от изначального блока исключений, если он Вам еще зачем-то нужен
    try:
        do_something_erronous()
    except Exception as e:
        print('Error:', e)
    
    bot.polling(none_stop=True)
    Ответ написан
    Комментировать
  • Как отправить несколько фото в одном сообщении(Telegram-Bot)?

    @o5a
    нужно передавать список объектов InputMediaPhoto
    bot.send_media_group(message.chat.id,
        [telebot.types.InputMediaPhoto(open(photo, 'rb')) for photo in ['photo1', 'photo2']])
    Ответ написан
    Комментировать
  • Почему ctx.guild.id возвращает None в запросе?

    @o5a
    Отсутствует fetchall(). Сам по себе cursor.execute возвращает None.
    for row in cursor.execute(...).fetchall():
    И как уже тут заметили, не надо использовать форматирование строк для подстановки параметров SQL запроса, используйте нормальный синтаксис (через %s и передачу данных), в предыдущем вопросе ведь уже приводили пример.
    Ответ написан
  • Пишу программу для телеграмм бота через Python. Не могу понять в чем ошибка. Можете подсказать?

    @o5a
    5ec22dce5b582133495419.png
    в других местах тоже, проблемы с отступами
    Ответ написан
    Комментировать
  • Как добавить пакет в Heroku?

    @o5a
    Mожно в requirements.txt вместо строки с "instagram=" прописать ее путь в github, чтобы ставилось оттуда
    https://github.com/OlegYurchik/pyInstagram/archive/master.zip
    Ответ написан
    Комментировать
  • Можете помочь с ботом python?

    @o5a
    Потому что в print используется message.from_user.last_name который не всегда присутствует (т.е. может быть None).
    Ответ написан
    Комментировать
  • Как сделать чтобы бот в беседе реагировал на слова из контекста?

    @o5a
    Если задача в том, чтобы сравнить попадание слова в фразу, то надо было писать наоборот
    if 'гну' in event.object.text.lower():

    Если же проверить попадание любого слова из списка во фразу, то можно так:
    words = ['гну', 'сгиб']
    if any(word in event.object.text.lower() for word in words):

    Так сработает, если во фразе находится любое из сочетаний "гну", "сгиб".
    Ответ написан
    Комментировать