Задать вопрос
Ответы пользователя по тегу Python
  • Почему не работает find_all при парсинге сайта?

    Vindicar
    @Vindicar
    RTFM!
    for posts in oholoshennja:
                post = oholoshennja.find(.........

    Ну правильно же говорит - зачем делать цикл, если ты posts не используешь, а используешь полученную коллекцию? Может, всё-таки post = posts.find()?
    Ответ написан
  • Как настроить соединение двух ПК(библиотека socket)?

    Vindicar
    @Vindicar
    RTFM!
    У сервера должен быть внешний (белый) IP, либо непосредственно, либо через настроенный NAT (т.е. внешний IP достаётся роутеру, а тот уже пробрасывает подключения снаружи куда надо).
    Если сервер за NAT, пробить его уже не вполне тривиально, хотя и возможно. Но может потребоваться сервер-посредник, у которого белый IP есть.
    Есть вариант "попросить вежливо" по UPnP, но опять же сработает со своим роутером - но не с провайдерским железом.
    Ответ написан
  • Почему Сайт не видит отправленые сообщения?

    Vindicar
    @Vindicar
    RTFM!
    Причины может быть две.
    1. .tiktok-19dw2t5-DivLayoutContainer выглядит как сгенерированное имя стиля, оно может меняться хоть при каждом открытии страницы.
    2. Более вероятно, аккаунт бота был тихо помечен как спамерский, и теперь его сообщения видит только он сам. Учитывая действия бота, заслуженно, скорее всего.
    Ответ написан
    3 комментария
  • Как отключить ошибку из консоли браузера?

    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!
    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()
    Ответ написан