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

    botermain
    @botermain
    Многопоточность - залог успеха, советую почитать эту статью, уверен, что ни раз пригодится

    Тем не менее, решение твоей проблемы довольно простое, с помощью модуля multiprocessing в отдельном процессе запускаешь функцию, которая будет слушать нажатия клавиш и завершать процесс по его PID:

    import os
    import signal
    import keyboard
    import multiprocessing
    
    
    def hook(pid):
        while True:
            if keyboard.is_pressed('ctrl + 1'):
                os.kill(pid,signal.SIGTERM)
                os._exit(1)
    
    
    if __name__ == '__main__':
        pid = os.getpid()
        multiprocessing.Process(target=hook,args=[pid]).start()
        #-----------------------------------------------------#
        #Здесь располагай свой код
        # -----------------------------------------------------#

    Конечно, можно также использовать модуль threading, но я более чем уверен , что будут проблемы с GIL, поэтому multiprocessing - это лучший вариант
    Ответ написан
    2 комментария
  • Как получить все id подписчиков в VK через API?

    botermain
    @botermain
    Цикл с шагом, проще некуда:
    count = m['members_count']
    
    for i in range(0,count+1,1000):
        response_for_getMembers = requests.get('https://api.vk.com/method/groups.getMembers',
                                params={
                                    'access_token':token,
                                    'v': version,
                                    'group_id': group_id,
                                    'count': 1000,
                                    'offset': i
        })
    Ответ написан
    Комментировать
  • Как обойти ошибку и-за длинного пути до файла?

    botermain
    @botermain
    Для начала, я бы предложил обновить Python хотя - бы до версии 3.6, потому что начиная с этой версии манифесты спокойно позволяют использовать длинные пути без танцев с бубном

    Однако, если же обновлять Python не вариант, то должно помочь обращение к файлам по UNC путям с помощью префикса \\?\ или же в случае обычной строки Python \\\\?\\:
    import os
    
    prefix = '\\\\?\\'
    path = 'C:\Program Files (x86)'
    print(os.listdir(prefix+path))

    UNC не поддерживает релативные пути, значение path должно быть абсолютным
    Ответ написан
    Комментировать
  • Как сделать так, чтобы при появлении нового файла в папке, он отправлялся в telegram bot?

    botermain
    @botermain
    Я далеко не программист

    Поручи эту работу тому, кто в этом разбирается, ибо то, что ты хочешь сделать не для обычного пользователя пк

    Ну, а если серьёзно, тебе нужно как минимум подключать многопоточность, если требуется постоянная работа в чате после команды, после чего в бесконечном цикле запрашиваешь имена файлов и если появляется новое, берешь и подставляешь его:
    import telebot
    import threading
    import os
        
    bot = telebot.TeleBot('...................')
    
    def voiceloop(bot,chatId):
        files = set(os.listdir())
        while True:
            new = set(os.listdir())
            if new != files:
                try:
                    send = list(new.difference(files))[0]
                    bot.send_voice(chatId, open(send, 'rb'))
                    files = new
                except:
                    pass
    
    
    @bot.message_handler(commands=['start'])
    def start(massage):
        chatId = massage.chat.id
        text = massage.text.lower
        t = threading.Thread(target=voiceloop, args = (bot,chatId))
        t.start()
    
    
    bot.polling()

    Код не тестил, но должно работать.
    Ответ написан
    1 комментарий
  • Как сделать чтобы TelegramClient редактировал сообщение?

    botermain
    @botermain
    Всё достаточно просто, советую хотя бы бегло глянуть на документацию к Telethon, прежде чем задавать такие вопросы

    Чтобы менять сообщение, надо понимать какое именно, а для этого следует записать его в переменную и после вытащить из неё его ID:
    with TelegramClient (api_hash, api_id)as client:
        msg = client.send_message(group, 'test')
        edit.message(group, msg.id, 'текст')
    Ответ написан
    Комментировать
  • Как сделать ВК бота который читает данные с google sheet?

    botermain
    @botermain
    Да, это возможно!

    Работал много раз с Google Sheets, так что подскажу небольшой, но очень хороший гайд, тут рассказано всё, от того как создать ключ, до того, как получать и загружать данные в таблицу

    По поводу бота для ВК, можно использовать модуль vk_api, также отличный гайд для него
    Ответ написан
    Комментировать
  • Как выглядит ID сообщения в телеграмме?

    botermain
    @botermain
    ID выглядит правильно, вопрос в том, правильный ли вы подставляете, давайте лучше получим ID отправленного нами сообщения и изменим его по нему, а не тыкая пальцем в небо. Расскажу на примере Telethon(Самая простая библиотека по моему мнению):

    Во первых, отправим сообщение и запишем его в переменную
    message = client.send_message(chat_id, text)

    После чего мы можем достать из переменной ID отправленного нами сообщения:
    message = client.send_message(chat_id, text)
    print("ID сообщения: ", message.id)


    И вот только теперь отредактируем его с помощью ID, который получили, вот пример рабочего кода:
    message = client.send_message(chat_id, text)
    client.edit_message(chat_id,message.id,text)


    Надеюсь, что объяснил понятно
    Ответ написан
    3 комментария
  • Не могу понять почему Selenium не может найти class?

    botermain
    @botermain
    Скажу сразу, мне не очень нравится код, поэтому вот несколько рекомендаций.

    Наученный опытом, скажу, что использовать XPATH намного целесообразнее, но только не абсолютный указатель пути, а индексы, вот ссылка на документацию

    Предлагаю организовать структуру поиска, немного иначе, вместо того, чтобы икать класс, в котором содержатся плитки, сразу искать их, это сэкономит время:
    tabs = browser.find_elements(By.XPATH,'//div[@class="col-12 col-md-6 col-lg-4 col-xl-3"]') #Ищем все товарные плитки


    Теперь, когда у нас есть список со всеми плитками, пройдемся по нему и подостаем все, что нам нужно:
    for i in tabs:
        image = i.find_element(By.XPATH,'//img') #Достаем из плитки изображение
        name = i.find_element(By.XPATH,'//a[@class="card-title item_title sp-line-2"]') #Достаем из плитки название
        price = i.find_element(By.XPATH,'//div[@class="price"]') #Достаем из плитки цену
        print('Изображение: ',image.get_attribute('src'),' Название: ',name.text,' Цена: ',price.text) #Выводим всю информацию

    Идея с отправкой кнопок для прокрутки, тоже не очень, лучше вместо этого запусти следующий скрипт, он автоматически прокрутит вниз на всю длину страницы:
    browser.execute_script("window.scrollTo(0, document.body.scrollHeight);")


    Вот полный скрипт для парсинга, который получился у меня, работает как часы, поэтому прошу к ознакомлению:
    from webdriver_manager.chrome import ChromeDriverManager #Для пакетов Хромиума
    from selenium import webdriver
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.common.by import By
    import time
    
    
    service_package = Service(ChromeDriverManager(log_level=0).install()) #Устанавливаю пакеты Хромиума
    
    options = webdriver.ChromeOptions()
    #options.add_argument('--headless')
    driver = webdriver.Chrome(service=service_package,options=options)
    
    driver.maximize_window() #Разворачиваем страницу, даже если в headless режиме, потому что не всё грузится
    
    driver.get("https://obnovi-oboi.ru/goods?category=oboi")
    
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # Скроллим до конца
    time.sleep(2)
    
    driver.find_element(By.XPATH,'/html/body/main/section/div/div[2]/button').click() # Кликаем кнопку
    time.sleep(5)
    
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # Скроллим до конца
    time.sleep(2)
    
    tabs = driver.find_elements(By.XPATH,'//div[@class="col-12 col-md-6 col-lg-4 col-xl-3"]') #Ищем все товарные плитки
    for i in tabs:
        image = i.find_element(By.XPATH,'//img') #Достаем из плитки изображение
        name = i.find_element(By.XPATH,'//a[@class="card-title item_title sp-line-2"]') #Достаем из плитки название
        price = i.find_element(By.XPATH,'//div[@class="price"]') #Достаем из плитки цену
        print('Изображение: ',image.get_attribute('src'),' Название: ',name.text,' Цена: ',price.text) #Выводим всю информацию


    Если будут ещё вопросы по поводу Selenium, обращайся !
    Ответ написан
    3 комментария
  • Как сохранить скачаный архив?

    botermain
    @botermain
    Максимально легкий код, не думаю, что можно проще
    send = requests.get('path.zip')
    with open("path.zip","wb") as f:
        f.write(send.content)
    Ответ написан
    2 комментария