JavaScript захватывает мир программирования. Оглянитесь вокруг, и вы увидите JavaScript в местах, где десять лет назад никто и не ожидал его встретить. JavaScript работает на серверах. Существует больше фронтенд-фреймворков на JavaScript, чем можно сосчитать. И даже на моей собаке есть JavaScript! Мне повезло, ведь я обожаю JavaScript.
Несколько месяцев назад на BrooklynJS я с огромным энтузиазмом обнаружил новый способ использования JavaScript. Алан Муиман провел отличную презентацию, показав, как можно автоматизировать Mac с помощью JavaScript. После его выступления я задумался: можно ли написать скрипт, который будет выполнять действия на моем Mac через SMS от Twilio? Спойлер: да, можно!
Эта статья посвящена тому, как автоматизировать Mac с помощью SMS-сообщений. Задача, которую мы автоматизируем, может быть одной из множества вариантов, но для простоты мы создадим приложение, которое отправляет сообщение в iMessage при получении SMS.
**Наши инструменты**
— Node.js – мы будем использовать Node для получения входящих SMS от Twilio.
— JavaScript для автоматизации – это как AppleScript, но на JavaScript.
— OSX >= 10.10 – JavaScript для автоматизации требует Yosemite или новее.
— Twilio – нужна учетная запись? Зарегистрируйтесь бесплатно!
**Отправка iMessage с помощью JavaScript**
Начнем с автоматизации нашего приложения. Мы будем использовать JavaScript для автоматизации. Этот инструмент позволяет делать то же самое, что и AppleScript, но на JavaScript. Довольно круто, правда?
Написание кода в редакторе скриптов Apple облегчит быстрое тестирование. Если вы, как и я, любите Vim, знаю, будет сложно, но вы справитесь!
Открыв редактор скриптов, нужно переключить язык с AppleScript на JavaScript.
Теперь можно приступать к написанию кода. Поскольку мы делаем все просто, нам понадобится всего три строки кода:
Убедитесь, что вы заменили первый элемент на адрес электронной почты, который используете для iMessage, но сохраните префикс «E:». Например, у меня это будет «E:ricky@twilio.com». Не знаете свой iMessage email? В приложении «Сообщения» нажмите «cmd ,» и перейдите на вкладку «Учетные записи». Замените второй элемент на адрес друга, которому хотите отправить сообщение, или, если не хотите спамить друга во время тестирования, отправьте сообщение себе.
Прежде чем запускать этот код, давайте разберем его. В первой строке мы получаем объект, ссылающийся на приложение «Сообщения». Во второй строке получаем ссылку на друга, которому хотим отправить сообщение. В последней строке вызываем метод send и передаем ему текст сообщения и получателя.
Теперь, когда код готов, можно запустить его, нажав большую кнопку воспроизведения в редакторе скриптов (или, если хотите быть крутым, нажмите cmd r). Вы увидите, как откроется приложение «Сообщения» и отправится сообщение указанному другу. Отлично!
**Подключение к Twilio**
Теперь, когда мы автоматизировали отправку iMessage с Mac, пора написать код, который будет запускать эту автоматизацию при получении SMS через Twilio.
Сначала создадим новое приложение на Node. Откройте терминал и начните:
Мы будем использовать hapi.js для этого приложения. Если вы раньше не работали с hapi, это фреймворк, который значительно упрощает создание веб-приложений на Node.js. Если вы работали с express, это очень похоже! Чтобы использовать hapi, нужно установить его:
Теперь создадим файл index.js, который будет содержать код нашего базового приложения:
Мы написали код для базового сервера, но пока он ничего не делает. К счастью, нам понадобится всего один маршрут для нашего приложения. Назовем его `incoming`:
Запустим наш сервер и протестируем новый маршрут:
Вы могли заметить, что наш маршрут отвечает только на POST-запросы. Мы можем протестировать его с помощью curl:
Теперь мы видим ответ «hello world». Но мы хотим сделать так, чтобы приложение получало информацию о входящем сообщении и затем выполняло наш JavaScript для отправки сообщения. Для этого нам понадобится функция *exec()*. Внимание! Функция exec выполняет команду оболочки на вашем локальном компьютере, поэтому будьте осторожны и убедитесь, что пользователи не смогут сделать ничего вредоносного, если вы откроете доступ к этому приложению извне.
Чтобы использовать *exec()*, нужно подключить несколько стандартных библиотек в начале файла index.js:
Прежде чем писать следующий фрагмент кода, вернемся в редактор скриптов и сохраним написанный ранее код в той же директории, где находится наше Node.js приложение. Сохраним его как «sendmessage.scpt». Сохранение файла звучит просто, но диалоговое окно редактора скриптов может быть запутанным. При сохранении нужно нажать на стрелку вниз рядом с полем «Сохранить как» и выбрать нужную папку.
До сих пор мы запускали наш скрипт автоматизации через редактор скриптов, но его также можно запустить из командной строки. Перейдите в терминале в директорию, где мы только что сохранили файл, и выполните команду:
Снова вы увидите, как приложение «Сообщения» отправило наше iMessage. Эта команда довольно простая, но я хотел бы обратить внимание на аргумент `-l`. Он указывает, что запускаемый скрипт написан на JavaScript, иначе команда подумает, что мы запускаем код на AppleScript, и завершится с ошибкой.
Теперь у нас есть все необходимое для вызова этого скрипта из нашего Node.js приложения. Вернемся в index.js и добавим следующий код для вызова скрипта на JavaScript для автоматизации:
Этот маршрут будет вызываться Twilio каждый раз, когда кто-то отправляет SMS нашему приложению. Мы хотим ответить на это сообщение, указав, что SMS получено. Для этого используем TwiML. TwiML позволяет давать базовые инструкции Twilio о том, что делать с входящим сообщением или звонком. Мы могли бы использовать библиотеку-помощник Twilio для Node.js для генерации TwiML, но поскольку TwiML — это просто XML, мы просто жестко закодируем наш ответ, чтобы избежать добавления еще одной зависимости:
Twilio должен иметь доступ к нашему приложению, поэтому нужно открыть наш локальный хост для внешнего мира. К счастью, мы можем использовать один из моих любимых инструментов — ngrok. Если вы еще не пользовались этим инструментом, скачайте и установите ngrok.
После установки ngrok выполните следующую команду, чтобы открыть локальный хост для внешнего мира:
Запомните URL, который создал ngrok для вашего приложения, затем перейдите в панель управления Twilio. Если у вас еще нет номера телефона для приложения, купите новый номер. После того как у вас будет номер, установите URL запроса SMS на маршрут `/incoming` нашего приложения:
Момент истины. Отправьте SMS на ваше приложение и наблюдайте, как открывается приложение «Сообщения» и отправляется iMessage. Время праздновать!
Готовый код нашего приложения можно найти на GitHub.
**Хакеры будут хакать**
Теперь вы создали базовый пример, показывающий, как можно автоматизировать Mac через SMS. И все это с помощью JavaScript! Что вы создадите, обладая такой возможностью? Вот несколько идей:
— Отправьте SMS, чтобы ваш компьютер открыл Photobooth, сделал снимок и отправил его вам через MMS
— Отправьте SMS своему компьютеру, чтобы он что-то сказал (используя команду say в терминале) и напугал людей в вашем доме
Хотите улучшить приложение для iMessage, которое мы создали сегодня? Попробуйте заменить жестко закодированный текст, который мы отправляем каждый раз, на текст входящего SMS.
Есть вопросы или хотите показать последний проект, который вы собрали? Оставьте комментарий ниже или напишите мне в Twitter (@rickyrobinett).