• Как отключить ошибку из консоли браузера?

    Vindicar
    @Vindicar
    RTFM!
    По-моему, ты перепутал. Сообщение говорит, что уведомления об ошибках сокетов не выводятся, и сообщает что это поведение можно отключить (тогда они будут выводиться). А опция - не в браузере, это одна из настроек redux-devtools. Читай доки на эту библиотеку, как их задавать, так как я с ней не знаком.
    Ответ написан
    Комментировать
  • Как отправить ссылку без вложения 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!
    О, сколько нам открытий чудных готовит официальная документация...
    Смотрим GuildChannel.permissions_for(), видим
    Return type: Permissions

    Клик. Читаем (выделено мной):
    Wraps up the Discord permission value.

    The properties provided are two way. You can set and retrieve individual bits using the properties as if they were regular bools. This allows you to edit permissions.

    Т.е. у объекта этого класса есть указанные выше свойства, и значительная доля из них - это логические значения (bool). Тебе нужно manage_channels? Тогда проверка должна выполняться примерно так: if perm.manage_channels:
    Ответ написан
    2 комментария
  • Добавление реакций ботом на новые сообщения в канале, как это сделать?

    Vindicar
    @Vindicar
    RTFM!
    Из документации
    The emoji may be a unicode emoji or a custom guild Emoji.

    Т.е. самый простой способ - скопировать и вставить в эту строку нужный юникодный символ ("????"), либо указать его код ("\U0001F4B5"). Найти и то и то можно на этом сайте.
    Примечание: так как этот сайт использует HTML разметку для текста, нужно указывать юникод-символы как сущности XML: &#x0001F4B5; даст ????
    Ответ написан
    Комментировать
  • Можно ли в терминале отобразить кликабельный путь к файлу?

    Vindicar
    @Vindicar
    RTFM!
    xterm и совместимые терминалы умеют обрабатывать события мыши. На том же stackoverflow можно найти вот такой код:
    echo -e "\e[?1000;1006;1015h" # Enable tracking
    echo -e "\e[?1000;1006;1015l" # Disable tracking

    Это на баше, разумеется. Выводишь правильную escape-последовательность, и терминал будет слать тебе соыбтия мыши как другие escape-последовательности на стандартный вход программы.
    Mouse click looks like \e[<0;3;21M and a release \e[<0;3;21m. Where 3 is x and 21 is y, from top-left 1-based. (Note that it is x-y and not row-col).

    Но такой подход оставляет проблему отслеживания положения кликабельного текста, и требует, чтобы твоя программа продолжала работать.

    Предположительно, некоторые терминалы могут также переварить вот такое:
    echo -e '\e]8;;http://example.com\aThis is a link\e]8;;\a'

    Но для твоей задаче потребуется, чтобы система имела схему URL для открытия папки с файлом, типа file:// или еще чего-то подобного.

    Ну а виндовый терминал очень ограниченный, так что кроссплатформенность малореальна. Хотя какие-то реализации curses под винду всё же есть.
    Ответ написан
    1 комментарий
  • Загрузка файла с облачного хранилища?

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

    Vindicar
    @Vindicar
    RTFM!
    Никак. Разработка discord.py остановилась, и автор не стал добавлять slash команды. Используй другие либы.
    Ответ написан
    Комментировать
  • Актуально ли сейчас делать и продавать телеграмм ботов, написанных на Python?

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

    Vindicar
    @Vindicar
    RTFM!
    Ну ты хоть понял, что он от тебя хочет?
    Ты добавляешь поле в таблицу. Значит, нужно решить, какое значение это новое поле примет в уже существующих строках.
    По умолчанию при таком добавлении уже существующие строки в таблице получат в эти поля NULL. Но ты указал, что поле не может принимать значение NULL.
    Тогда следует использовать значение по умолчанию. Но ты не указал значение по умолчанию в описании модели.
    И скрипт тебе предлагает два варианта.
    1. Ввести значение, которое скрипт здесь и сейчас подставит в уже существующие строки в БД вместо NULL. Модель не будет изменена.
    2. Вручную в модели прописать значение по умолчанию и перезапустить скрипт. Он использует это значение по умолчанию для существующих строк вместо NULL.
    Решай сам, что лучше.
    Ответ написан
    2 комментария
  • Как сделать запись в файл после определенного метода?

    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-метка времени. Тогда можно будет понять, когда был послан запрос, и периодически удалять "старые" записи из списка.
    Ответ написан