Ответы пользователя по тегу Python
  • Как отправить ссылку без вложения telebot?

    Vindicar
    @Vindicar
    RTFM!
    Конкретный метод зависит от библиотеки, но API телеги предоставляет опцию disable_web_page_preview. Читай документацию на используемую либу, ищи ключевое слово preview.
    Ответ написан
    Комментировать
  • Как сделать что бы в боте сообщения отправлялись по айди указанному в базе данных sqlite3?

    Vindicar
    @Vindicar
    RTFM!
    Если работаешь с aiogram, то вроде там есть await bot.send_message(chat_id, message_text)
    Ответ написан
  • Как написать сообщение с помощью selenium, если в html коде нету тега input?

    Vindicar
    @Vindicar
    RTFM!
    Можно попробовать так:
    pseudo_input = driver.find_element_by_css_selector(".btn") # ну или что там у тебя за элемент
    ( selenium.webdriver.common.action_chains.ActionChains(driver)
        .move_to_element(pseudo_input)
        .click(pseudo_input)
        .send_keys_to_element(pseudo_input, *keys_to_send)
        .perform()
    )
    Ответ написан
    2 комментария
  • Как вытащить пример из чата и решить его?

    Vindicar
    @Vindicar
    RTFM!
    1. Определись, что считается выражением, а что не считается. (Задолбаешься уже на этом пункте.)
    2. Напиши регулярное выражение, которое вылавливает такие примеры. (Тоже та ещё задачка)
    3. Осознай, что проще заставить пользователей предварять пример ключевым словом/командой, например, "!реши 2*2"
    Ответ написан
    1 комментарий
  • Телебот.Как выполнить в основном файле .py команды из другого .py файла?

    Vindicar
    @Vindicar
    RTFM!
    Твоя проблема в том, что ты в каждом файле определил объект bot, и в итоге каждый файл подписывается на своего бота... но работает только бот из main.py, так как он определяется ПОСЛЕДНИМ и переписывает имя bot на себя. Так что bot.infinity_polling() в итоге запускает только бота из main.py, а остальные боты остаются незапущенными.
    Можно схитрить и заставить все файлы использовать один объект бота. Например, переписав вспомогательные файлы таким образом:
    # commands.py
    def register_commands(bot):
      # функция register_commands должна присутствовать в каждом файле,
      # и содержать вложенные объявления обработчиков событий.
      # bot - объект бота, на котором регаются обработчики. 
      # таким же способом можно пробросить другие глобальные объекты программы.
      # очень важно, чтобы функция вызывалась РОВНО один раз в программе!
      # дальше пошли обработчики...
      @bot.message_handler(commands=['version'])
      def version_message(message):
          bot.send_message(message.chat.id, 'Текущая версия бота 1.0')
          bot.send_message(message.chat.id, 'Что умеет эта версия?\n1.Что-то точно умеет')

    Тогда в main.py будет что-то вроде...
    import commands
    import weather
    
    bot = telebot.TeleBot(.................)
    
    # заставляем модули объявить и зарегистрировать свои обработчики
    commands.register_commands(bot)
    weather.register_commands(bot)
    
    # дальше идут местные обработчики
    @bot.message_handler(content_types=['text'])
    def send_text(message):
        if message.text.lower() in a:
            bot.send_message(message.chat.id, 'Привет, создатель')
        elif message.text.lower() =='ghbdtn':
             bot.send_message(message.chat.id, 'Тебе тоже привет, раскладку переключи')
        elif message.text.lower() in b:
            bot.send_message(message.chat.id, 'Прощай, создатель ')
    
    # ну и запускаем бота
    bot.infinity_polling()
    Ответ написан
    Комментировать
  • Как исправить ошибку потерянного соединения к MySQL?

    Vindicar
    @Vindicar
    RTFM!
    self.user_mydb.close()
    Вот как по твоему, что делает этот вызов?
    Ответ написан
    Комментировать
  • Как реализовать систему добавления в список: смотрю, буду смотреть и т.д зарегистрированным пользователем?

    Vindicar
    @Vindicar
    RTFM!
    С точки зрения БД, просто связная таблица или несколько. Это же классическое отношение "многие ко многим".
    Есть таблица "Пользователи" с каким-то первичным ключом.
    Есть таблица "Аниме" с каким-то первичным ключом.
    Если делаешь отдельную связную таблицу на каждый тип списка (т.е. одна для "просмотрел" и одна для "буду смотреть"), то они будут иметь вид "ID пользователя, ID аниме", и эти же два поля будут составным первичным ключом. Наличие строки в таблице будет означать, что указанный пользователь внёс указанное аниме в список, соответствующий таблице.

    Либо можно сделать общую таблицу "Списки", тогда её вид будет немного иным - "ID пользователя, ID аниме, Тип списка". Если пользователь может поместить одно аниме только в один список, то ключ будет как выше, а если в несколько одновременно, то ключ будет все три поля.

    А уж как это сделать с точки зрения моделей, читай документацию. Это одна из самых базовых вещей, если что.
    Ответ написан
    4 комментария
  • Как сделать что бы хандлер срабатывал каждые 10 секунд, aiogram, python?

    Vindicar
    @Vindicar
    RTFM!
    Ну как-то так, только имей ввиду, что контроль над тем, кто может выполнять команды, остаётся на тебе.
    Бот либо опрашивает новости, либо нет, и сделать это индивидуально для разных пользователей будет сложнее.
    stop_polling_site = None  # контролирует, продолжаем мы проверять новости или нет
    
    async def get_news(message: types.Message):
      "Эта функция только проверяет и отправляет новости, она не является обработчиком событий"
      fresh_news = chek_news_update() # ты выполняешь сетевую операцию синхронно. Зачем?!
    
      if len(fresh_news) >= 1:
        for k, v in sorted(fresh_news.items()):
          news = f'{hcode(v["dates_id_print"])}\n' \
               f'{hlink(v["aubl_title"], v["aubl_url_split_print"])}'
          await message.answer(news)  # <<< не лучший способ отправлять сообщения в канал, но это твое дело.
          print('ok news')
      else:
        print('no')
    
    @dp.message_handler(commands='startnews')
    async def start_polling_news(message: types.Message):
      "Эта функция обрабатывает команду для начала опроса и реализует цикл опроса."
      global stop_polling_site
      if stop_polling_site is not None:
        await message.answer("Мы уже проверяем новости.")
        return
      stop_polling_site = asyncio.Event()
      while True:  # цикл опроса новостей
        try:
            # реализуем ожидание без остановки остального бота. Таймаут - сколько ждем в секундах.
            # такой подход используется вместо asyncio.sleep(), 
            # чтобы можно было в любой момент остановить опрос новостей.
            await asyncio.wait_for(stop_polling_site.wait(), timeout=600)
        except asyncio.TimeoutError:
            # дождались таймаута - работаем.
            try:
              await get_news(message)
            except:
              pass # была ошибка при получении новостей, думай сам что тут делать
        else:
            # таймаута не было - значит, поступила команда на остановку цикла
            break
      stop_polling_site = None
    
    @dp.message_handler(commands='stopnews')
    async def stop_polling_news(message: types.Message):
      "Эта функция обрабатывает команду для окончания опроса."
      global stop_polling_site
      if stop_polling_site is None:
        # цикл и так не работает
        await message.answer("Мы и так не проверяем новости.")
      else:
        # говорим остановить цикл
        stop_polling_site.set()
    Ответ написан
  • Загрузка файла с облачного хранилища?

    Vindicar
    @Vindicar
    RTFM!
    egor_u, ну вот и ответ. Если немножечко почитать документацию, то увидим, что метод .write() возвращает количество прочитанных байт.
    Я не знаю, что ты ожидал получить в переменной wb перед выполнением wb = openpyxl.load_workbook(wb), но это явно не оно.
    И вообще, load_workbook() ожидает получить на вход путь и имя открываемого файла.
    Ответ написан
    Комментировать
  • Актуально ли сейчас делать и продавать телеграмм ботов, написанных на Python?

    Vindicar
    @Vindicar
    RTFM!
    Конструкторов ботов полно, в т..ч. бесплатных. Хочешь монетизировать знания - погуляй по фриланс-сайтам.
    Ответ написан
    Комментировать
  • Как сделать запись в файл после определенного метода?

    Vindicar
    @Vindicar
    RTFM!
    Ну самый лобовой способ - изменить файл-шаблон так (сокращено):
    class MainApp(App):
        def build(self):
            main_layout = FloatLayout()
            # INSERT CODE HERE
            return main_layout
     
    if __name__ == '__main__':
        app = MainApp()
        app.run()

    Тогда можно будет сделать просто
    with open('file.py', 'rt', encoding='utf-8') as src:
        data = src.read()
    with open('file2.py', 'wt', encoding='utf-8') as dest:
        dest.write(data.replace('# INSERT CODE HERE', 'тут твой код'))

    Разумеется, строка # INSERT CODE HERE не должна встречаться в других местах файла-шаблона.
    Также подразумевается, что файл-шаблон сам по себе, и не изменяется программно - вместо этого результат записывается в другой файл, который уже используется.
    Ответ написан
    6 комментариев
  • Как перенести бекс без \n в pdf?

    Vindicar
    @Vindicar
    RTFM!
    for i in range(0, len(text), 22):
        line = text[i:i+22]

    Ну и далее по тексту.
    Ответ написан
    1 комментарий
  • Как сделать что бы бот ожидал пока пользователь прикрепит файл, а потом сохранит его в discord.py?

    Vindicar
    @Vindicar
    RTFM!
    Отправленный файл - это ведь тоже сообщение, просто с прикреплённым аттачем. Почему бы не обрабатывать сообщения от пользователей и смотреть аттачи? Строго говоря, файл и команда могут вообще быть в одном сообщении, хотя это несколько менее удобно.
    А вообще ты встретился с необходимостью в машине состояний. В discord.py её вроде нет "из коробки", придётся самому реализовывать. Это не так сложно, просто нужно вести список или словарь пользователей, от которых мы ждём файл. При поступлении сообщения с файлом смотрим, есть ли отправитель в этом списке. Если есть, обрабатываем файл и убираем его оттуда, если нет - игнорируем сообщение.
    С таймаутом сложнее, но можно в списке хранить не id пользователя, а пары id-метка времени. Тогда можно будет понять, когда был послан запрос, и периодически удалять "старые" записи из списка.
    Ответ написан
  • Почему не обновляется текстовый виджет Tkinter?

    Vindicar
    @Vindicar
    RTFM!
    fan_gpu_info.after(1000, fan_gpu_info)
    Может, имелось ввиду это?
    fan_gpu_info.after(1000, fans_gpu)
    Ответ написан
    2 комментария
  • Как настроить голосование в боте дискорд?

    Vindicar
    @Vindicar
    RTFM!
    1. Оформи код как положено (</>)
    2. resactions = [reaction for reaction in message.reactions if reaction.emoji in ['✅', '❌']]

    Что тебе мешает адаптировать эту строку, чтобы считать реации отдельно?
    А то и проще, используй collections.Counter:
    from collections import Counter
    
    counts = Counter(reaction.emoji for reaction in message.reactions)
    if counts['✅'] > counts['❌']:
        KABOOM()
    Ответ написан
  • Как сделать вывод данных из базы данных в переменную python?

    Vindicar
    @Vindicar
    RTFM!
    В дополнение к написанному выше @Dr. Bacon, можно сделать так
    connect.row_factory = sqlite3.Row
    Тогда вместо простых кортежей будут возвращаться объекты, похожие на словари, и можно будет обращаться к полям по имени.
    cursor.execute("""SELECT OrderNumber FROM orders ORDER BY OrderNumber DESC LIMIT 1;""")
    row = cursor.fetchone()
    ID = row['OrderNumber']

    Единственное, смена row_factory затронет только курсоры, созданные позднее. Созданные ранее курсоры будут использовать предыдущую фабрику строк. Так что если хочешь это сделать, менять row_factory лучше сразу после открытия соединения.
    Ответ написан
    Комментировать
  • Какой вариант построения условий производительнее?

    Vindicar
    @Vindicar
    RTFM!
    Если у тебя не миллионы элементов в коллекции - разница вряд ли будет.
    А если так, то достаточно создать коллекцию один раз и переиспользовать её, а не делать это внутри if - и разницы не будет.
    Ответ написан
    Комментировать
  • Как вернуть результат работы декоратора?

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала, что ты понимаешь под "результатом работы декоратора"?
    Результат работы декоратора - это функция, если что!
    Т.е. код
    @app.on_message(filters.text)
    def message(client, message):
        msg = message.text

    Практически эквивалентен коду
    decorator = app.on_message(filters.text)
    
    def message(client, message):
        msg = message.text
    # функция заменяется на результат работы декоратора - на ту же самую или другую функцию
    message = decorator(message)

    А уж что возвращает декоратор, а также что еще он делает с функцией - это его дело.

    Более того, в твоем случае я сильно подозреваю что функция message() не должна ничего возвращать. Если тебе нужно сохранить введённое сообщение, используй глобальные переменные.
    Ответ написан
    Комментировать
  • Как поставить таймер на функцию в дискорд боте?

    Vindicar
    @Vindicar
    RTFM!
    1. В документации есть пример.
    2. Тебе не нужен контекст (ctx), ты можешь получить объект канала просто по его ID. Через него же можно получить и приватный канал с юзером. Получив объект канала, можешь писать просто в него.
    Ответ написан