История следующая.
Лежу я тут недавно, в 5 утра, а сам понимаю, что вставать-то мне в 9. А сплю я ну очень крепко. И в целом мне сложно проснуться.
И я осознаю, что нужна тяжёлая артиллерия! Что-то из давно себя зарекомендовавшего. А единственное, что меня стабильно хорошо будило - это AIMP на ноуте, который запускал мой плейлист на полную катушку в заданное время. А теперь у меня Macbook, а вместо скачанного архива музыки - Яндекс Музыка.
Решение, казалось бы, найдено. Открой приложение, да настрой запуск по таймеру, да? А вот как бы не так! В ЯМузыке такой фичи нет, крутитесь как хотите.
Настроить что-то такое через Календарь и другие штатные приложения мне не удалось.
Потраченные в пустую пол часа моего драгоценного сна! Чёрт! Надо решать как это сделать, это уже дело принципа!
-Что же, что мы умеем?
-Мы умеем писать автотесты на Java!
-Как нам это тут может помочь?
-Ну хз...
Ага! Фреймворк Robot. Вроде штатная Java либа. Давайте раскручивать с чем умеем работать. Вооружаемся гуглом и Perplexity. Ещё пол часика умствований и у нас уже запускается приложение Яндекс Музыка.
Теперь остался вопрос, а как заставить его запускаться в нужное время и включать воспроизведение музыки?
Ну с запуском по времени не сложно Calendar и Timer. А вот как запустить воспроизведение вообще не тривиально. Клик на пробел - не работает, на enter - не работает. После прокликивания всех кнопок вычисляем, что запускается по клику на "K". Ну всё, теперь-то вообще нет проблем, да? Робот кликнет на любую кнопку - только скажи, что тыкнуть. Дописываем, компилим, запускаем - хрен там плавал а вот вы и не угадали, не работает! Клик по кнопке происходит не в последнем открытом окне, а на рабочем столе.
Да за шо!?
Решение? Надо как-то "активировать" окно ЯМузыки. Честно, вот тут я уже не придумал ничего умнее, чем просто тыкнуть на центр экрана(примерно по центру окно открывается). Бинго! Теперь работает всё. Тестируем, выставляем нужное время запуска на 9 утра - ложимся спать. Времени 6:45....
Просыпаемся в ~9:15....музыка не играет. Какого хера!? - спросите вы. А всё просто, а экран заблокировался. Вывод - тыкать на заблокированном экране можно до посинения - не поможет:D
Отключаем блокировку экрана - теперь задача решена.
А код этого решения прилагаю к посту:D
Спасибо за внимание)
package org.example;
import java.awt.*;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Main {
public static void main(String[] args) {
// Установите время запуска (например, сегодня в 15:30)
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 9);
calendar.set(Calendar.MINUTE, 00);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Date launchTime = calendar.getTime();
// Если время уже прошло сегодня, сдвигаем на следующий день
if (launchTime.before(new Date())) {
calendar.add(Calendar.DAY_OF_MONTH, 1);
launchTime = calendar.getTime();
}
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
try {
String appPath = "/Applications/Яндекс Музыка.app";
// Запускаем приложение
ProcessBuilder pbOpen = new ProcessBuilder("open", appPath);
pbOpen.start();
System.out.println("Яндекс Музыка запущена в " + new Date());
// Ждем, чтобы приложение успело открыться
Thread.sleep(5000);
// Активируем окно приложения через AppleScript
String appleScriptCommand = "osascript -e 'tell application \"Яндекс Музыка\" to activate'";
ProcessBuilder pbActivate = new ProcessBuilder("bash", "-c", appleScriptCommand);
pbActivate.start();
// Небольшая пауза, чтобы окно точно стало активным
Thread.sleep(1000);
// Используем Robot для нажатия клавиши K (Play/Pause)
Robot robot = new Robot();
// Переместить курсор в координаты окна (примерно центр экрана, подкорректируйте)
robot.mouseMove(500, 300);
// Клик левой кнопкой мыши
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
// Небольшая пауза
Thread.sleep(500);
// Нажать клавишу K
robot.keyPress(KeyEvent.VK_K);
robot.keyRelease(KeyEvent.VK_K);
System.out.println("Окно активировано и нажата клавиша K для воспроизведения.");
} catch (IOException | InterruptedException | AWTException e) {
e.printStackTrace();
}
}
}, launchTime);
System.out.println("Запуск Яндекс Музыки с фокусом и воспроизведением запланирован на: " + launchTime);
}
}
Комментарии (8)
40kTons
27.09.2025 01:09Я не пользуюсь ЯМ. Если под ЯМ подразумевается сайт, на который надо зайти и нажать проигрывание музыки, то просто возьмите аналог селениума и напишите скрапер, который будет заходить на данный сайт. Понятно что это скрипт на коленке, но если делаете что-то серьёзное и надёжное, то за "таймеры для синхронизации" надо давать по рукам
aamonster
27.09.2025 01:09#!/bin/bash say "AnToha96, turn music on!" say "Mwa-ha-ha!"
Да что ж такое с хабраредактором, почему код съедает? С трудом добавил.
Интересно, получится ли так управлять Алисой?
GenkaOk
27.09.2025 01:09Не пробовали Hammerspoon для таких вещей?
По моему отличная вещь для таких автоматизаций и готовое lua-API на все случаи жизни
AnToha96 Автор
27.09.2025 01:09Даже не слышал о таком) Но теперь обязательно познакомлюсь, спасибо!
На самом деле мне и в голову раньше не приходило такие автоматизации делать самому. Большая часть таких штук - уже есть готовые решения. А тут вот не нашёл. А искать что-то новое из инструментов - было бы дольше, как мне кажется. По этому тут скорее решение из разряда "как применить свои навыки быстро без регистрации и смс". Решение, очевидно, не идеальное, но работает уже довольно долго(где-то с мая месяца) и ни разу не подвело
FreeNickname
Спасибо за статью и решение) если Вам будет интересно, подобные вещи на macOS плюс-минус легко сделать на AppleScript. Кстати, некоторые приложения даже предоставляют своего рода API, который доступен в AppleScript. Но даже если нет – там можно открывать приложения, окна в приложениях и обращаться к контролам внутри приложений. В этом случае самое сложное – выяснить, как добраться до нужного контрола. Кстати, вроде бы, можно "записать" действия, но уже точно не помню.
AppleScript – забавный язык) код пишется практически просто как предложения английского языка. Но можно делегировать LLM, конечно)
Ещё можно Shortcuts посмотреть) но на неё у меня меньше надежды.
AnToha96 Автор
Спасибо, за совет) Не знал про такое, обязательно почитаю
aamonster
Кажется, AppleScript можно только делегировать LLM: попытка сделать язык с синтаксисом английского, чтобы на нём могла писать каждая домохозяйка, привела к тому, что программисты на нём писать уже не могут (а домохозяйки – ещё не могут).
Ну или генерить через Automate или как его там и править.
Кстати, всё то же самое доступно через JavaScript (одним ключом в командной строке osascript), но документация вся по AppleScript, а перевод не всегда очевиден.