Привет, Хабр! ? Хочу поделиться небольшим проектом, который я разработал для решения личной задачи. Возможно, кому-то он тоже пригодится.

Что это такое?

WorkStarter - это простая утилита для Windows, которая позволяет автоматически запускать программы и открывать веб-сайты при старте компьютера. Основная идея заключается в том, чтобы упростить процесс подготовки рабочего окружения после включения ПК.

Основные возможности
- ?️ Автоматический запуск программ
- ? Открытие веб-сайтов
- ⏱️ Настройка задержки для каждой задачи
- ? Графический интерфейс для управления задачами
- ? Хранение конфигурации в JSON-формате

Как это работает?

WorkStarter состоит из двух основных компонентов:

1. WorkStarter Configuration - графический интерфейс для настройки задач.
2. WorkStarterAgent - фоновый процесс, который запускается при старте системы и выполняет настроенные задачи.

Конфигурация хранится в файле config.json в пользовательской директории приложения.

Технические детали

Проект написан на Python с использованием следующих библиотек:
- PyQt6 для создания графического интерфейса
- asyncio для асинхронного выполнения задач
- appdirs для управления директориями приложения

Установка и использование

1. ⬇️ Скачайте последнюю версию WorkStarter
2. Запустите установщик и следуйте инструкциям
3. После установки запустите "WorkStarter Configuration" из меню "Пуск"
4. Добавьте нужные задачи через графический интерфейс
5. WorkStarterAgent будет автоматически запускаться при старте системы

Ограничения и планы на будущее

На данный момент утилита работает только на Windows и имеет ограниченный функционал. В будущем планируется:

- ? Добавить поддержку macOS и Linux
- ? Расширить типы поддерживаемых задач
- ? Улучшить пользовательский интерфейс

Заключение

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

Исходный код доступен на GitHub. Буду благодарен за обратную связь и предложения по улучшению. ?

Лучшая благодарность, которую Вы можете оказать - подписаться на мой IT канал, буду рад Вас там видеть

Комментарии (22)


  1. theGrove
    21.10.2024 10:50

    Кому это интересно вообще?


    1. yasinovskiye
      21.10.2024 10:50

      Кому-то и может быть интересно, автор просто поделился своей тулзой, зачем быть таким токсичным? А вот другой вопрос зачем нужна эта тулза, если в каждой оси и так есть настройка автозапуска приложений, и в том числе запуск сайтов через URL в терминале\cmd. Стоит ли ради нечастых изменений в этих самых параметрах автозапуска разрабатывать для этого отдельный гуи ?


      1. Sazonov
        21.10.2024 10:50

        Автор поделился, ок. Но этому точно место на Хабре, а не на каком нибудь stackexchange?

        Выглядит как обычная лабораторная работа 1-2 курса. Там кода на ~200 строк включая GUI. Задачи стартуются самим приложением, а не помещаются в стандартный планировщик ОС. Бизнес логика перемешана с UI. Само приложение помещается в автозапуск инсталлятором. Нет настроек для переключения между all users / current user. Думаю можно не продолжать.


        1. IvanNoskov Автор
          21.10.2024 10:50

          О, спасибо что напомнили про stackexchange. Про юзеров тоже полезно, думаю добавлю в список фич на следующие обновления


      1. IvanNoskov Автор
        21.10.2024 10:50

        Спасибо за Ваш комментарий. С данным функционалом действительно можно было бы обойтись без интерфейса и сделать все в скрипте на пару кб. Но у меня есть идеи по добавлению более комплексных и полезных задач при старте системы, вроде отправки нужных сообщений/писем, автоклики по нужным кнопкам и прочее. В таком случае хотелось бы иметь хороший ui с дополнительными настройками. (идеи могут прозвучать немного утопичными или излишними, но этот проект я делаю исходя из своих практик и опыта и хочу привнести по больше полезных фич)


      1. Andrey_Solomatin
        21.10.2024 10:50

        Есть некоторый диссонанс между качеством и полезностью инструмента и попыткой его представить как готовый продукт продать свой телеграм канал.


        Я за проекты, которые позволяют получить опыт. Сам делал много бесполезной фигни.


        1. IvanNoskov Автор
          21.10.2024 10:50

          Канал я не продаю, у меня там проектики и личная жизнь, продавать там нечего. Я понимаю Вас, понимаю о чем Вы, но этот проект оказался полезным нескольким знакомым и я захотел поделиться им. Так уж я преподношу то что делаю, стараюсь рассказать по красочнее. Думаю в этом нет чего-то сугубо плохого, я ничего никому не втюхиваю и не продаю, у меня нет ни одного ресурса который я мог бы здесь монетизировать, это лишь pet проектики которые я пилю в свободное от работы время

          Спасибо за Ваш комментарий


    1. sten65
      21.10.2024 10:50

      неинтересно - не читай и, тем более, не комментируй. в следующих комментариях нормально отнеслись к материалу. человек может быть первый раз что-то написал, что и другим пригодилось. поправит/подсказать - это норм, а с токсиком - на пикабу :)


    1. UnknownCat
      21.10.2024 10:50

      Мне, а есть сайт где такие разработки люди выкладывают? Я бы посмотрел, я на хабр только из-за этого захожу.

      • Чтобы смотреть, как люди пишут код, и объясняют свою логику того почему так.

      • Чтобы пополнять свои знания


  1. sshmakov
    21.10.2024 10:50

    1. C:\Users\%USERNAME%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

    2. Управление компьютером - Планировщик заданий


  1. Ksaverri
    21.10.2024 10:50

    Тоже думал софтину написать на расте поначалу, но, ришел к выводу, что это тупая затея. Каждый раз, когда нужно внести изменения в запуск конкретной программы, нужно перекомпилировать. В итоге, сделал скрипт на питоне с меню, блекджеком и распутными функциями.


    1. IvanNoskov Автор
      21.10.2024 10:50

      Не плохо, есть репозиторий? Было бы интересно глянуть


      1. Ksaverri
        21.10.2024 10:50

        Не думаю, что там для Вас будет что-то интересное, так как писалось под себя. Мне к примеру не нужен автозапуск и не нужна оболочка. Со мной путешествует внешний SSD с моими проектами и программами. Ну и пара команд для личного комфорта.

        import subprocess
        import psutil
        import os
        import pathlib
        
        print("-------------------------------------------------------------------------")
        print("")
        print("1 - Запустить все приложения")
        print("")
        print("2 - Запустить приложения, кроме торрент-клиента")
        print("3 - Запустить приложения, кроме приложений на диске А")
        print("4 - Запустить приложения, кроме приложений на диске А и торрент-клиента")
        print("")
        print("5 - Завершить все приложения")
        print("")
        print("6 - Перезагрузить Проводник")
        print("")
        print("7 - Выключить компьютер через...")
        print("8 - Отменить выключение компьютера")
        print("")
        print("-------------------------------------------------------------------------")
        print("")
        
        choice = input("Выберете пункт меню: ")
        
        print("")
        print("-------------------------------------------------------------------------")
        print("")
        
        pathToScript = os.path.dirname(__file__)
        localAppData = os.getenv('localappdata')
        
        apps = [\
        	["ShareX.exe", "Y:\\Programs\\ShareX --- видео и снимки экрана.pyw", "1 2 3 4"], \
        	["thunderbird.exe", "Y:\\Programs\\Thunderbird --- почтовый клиент.pyw", "1 2 3 4"], \
        	["XYplorer.exe", "Y:\\Programs\\Apps\\XYplorer\\XYplorer.exe", "1 2 3 4"], \
        	["RoyalTS.exe", "A:\\Software\\RoyalTS\\RoyalTS.exe", "1 2"], \
        	["rutview.exe", "A:\\Software\\RMS\\rutview.exe", "1 2"], \
        	["Telegram.exe", "Y:\\Programs\\Apps\\Telegram\\Telegram.exe", "1 2 3"], \
        	["Todoist.exe", "Y:\\Programs\\Todoist (Тудуист) --- планировщик задач.pyw", "1 2 3"], \
        	["qbittorrent.exe", "Y:\\Programs\\Apps\\qBittorrent\\qbittorrent.exe", "1 3"], \
        	["vivaldi.exe", "c:\\Vivaldi\\Application\\vivaldi.exe", "1 2 3 4"], \
        	["vivaldi.exe", f"{localAppData}\\Vivaldi\\Application\\vivaldi.exe", "1 2 3 4"], ]
        
        def runApp(x):
        	runningApps = []
        
        	for proc in psutil.process_iter():
        		runningApps.append(proc.name())
        		
        	for app in apps:
        		i = 0
        		if not app[i] in runningApps:
        			if app[2].find(x) >= 0 and os.path.exists(app[1]):
        				fileExtension = pathlib.Path(app[1]).suffix
        				if fileExtension == ".pyw" or fileExtension == ".py":
        					subprocess.Popen(["python", app[1]], cwd=os.path.dirname(app[1]))
        				else:
        					subprocess.Popen(app[1], cwd=os.path.dirname(app[1]))
        				i += 1
        
        	subprocess.run('taskkill /IM "explorer.exe" /F')
        	subprocess.Popen('C:\\Windows\\explorer.exe')
        
        def taskKill(x):
        	subprocess.run(f'taskkill.exe /fi "ImageName eq {x}"', check=True, shell=True)
        
        def taskKillHard(x):
        	subprocess.run(f'taskkill.exe /F /fi "ImageName eq {x}"', check=True, shell=True)
        
        match choice:
        	case "1":
        		runApp("1")
        
        	case "2":
        		runApp("2")
        
        	case "3":
        		runApp("3")
        
        	case "4":
        		runApp("4")
        
        	case "5":
        		taskToKill = ["thunderbird.exe", "RoyalTS.exe", "rutview.exe", "winbox.exe", "winbox64.exe", "Telegram.exe", "Todoist.exe", "vivaldi.exe"]
        
        		taskToKillHard =["qbittorrent.exe", "ShareX.exe", "whatsapp.exe", "ktalk.exe", "Pipette.exe", "steamwebhelper.exe", "steam.exe", "LagoFast.exe", "t1client-vc142e.exe", "vhui64.exe"]
        
        		for task in taskToKill:
        			taskKill(task)
        
        		for task in taskToKillHard:
        			taskKillHard(task)
        
        	case "6":
        		subprocess.run('taskkill /IM "explorer.exe" /F')
        		subprocess.Popen('C:\\Windows\\explorer.exe')
        
        	case "7":
        		shutdownTime = int(input("Через сколько минут выключить компьютер: ")) * 60
        		subprocess.run('shutdown /s /t ' + str(shutdownTime), check=True, shell=True)
        
        	case "8":
        		subprocess.run('shutdown -a', check=True, shell=True)
        
        	case _:
        		print("Такого варианта не существует")


        1. IvanNoskov Автор
          21.10.2024 10:50

          Понял, спасибо что поделились


        1. Andrey_Solomatin
          21.10.2024 10:50

          Гляньте на модуль https://docs.python.org/3/library/cmd.html#cmd.Cmd с помощью него можно упростить работу с меню. У него есть лучшие альтернативы, но их надо устанавливать.

          А еще винда поддерживает и прямые и обратные слэши. Можно использовать линуксовый стиль, чтобы не эскейпить из в строках.

          'C:\\Windows\\explorer.exe' -> 'C:/Windows/explorer.exe'


          1. Sazonov
            21.10.2024 10:50

            А ещё винду не обязательно ставить в c:/windows :)

            И для работы с системными путями есть соответствующий API.


          1. Ksaverri
            21.10.2024 10:50

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


            1. Sazonov
              21.10.2024 10:50

              В большинстве текстовых редакторов есть удобная фича - replace in selection, если уж очень хочется экономить нажатия. А в студии можно даже на 1 хоткей повесить исправление слешей в путях. Плюс такой путь с двойными обратными не получится скопировать и вставить в проводник.

              И обратные слеши - это не кросс-платформенно.


              1. Ksaverri
                21.10.2024 10:50

                С поиском и заменой все понятно, но мне все это неудобно. Если бы мне нужно было прочесать стену текста и сделать там замену обратных слэшей, то я бы конечно так и поступил. В моем случае, проще экранировать.

                Да, это не кросс-платформенно, но мне это и не требуется. У меня было много попыток использования как линуксов (самых разных), так и macos и для меня это была сущая пытка. Я с этим завязал) Линукс использую только на серверах.


  1. russeljo
    21.10.2024 10:50

    Мне вспомнилась тулза, которая переключает цвет панели задач в зависимости от выбранной раскладки клавиатуры, но она платная. Если бы данный функционал появился здесь или отдельным приложением - цены бы ей не было.