Как получить доступ к URL-адресу, по которому щелкнули, в приложении-обработчике URL-адресов, созданном в Automator

В настоящее время я пытаюсь изменить поведение обработки URL-адресов по умолчанию в OS X. Я хотел бы при нажатии на любую ссылку вне веб-браузера скопировать этот URL-адрес на монтажный стол, а не открывать его в веб-браузере по умолчанию, например , щелчок по ссылке в беседе Skype должен скопировать этот URL-адрес на монтажный стол OS X, а не открывать его в Firefox (который в настоящее время является моим веб-браузером по умолчанию).

Я думал о решениях, но в настоящее время не могу их реализовать. Если я смогу создать приложение, которое помещает URL-адреса в монтажный стол, которые отправляются ему, и смогу установить это приложение в качестве веб-браузера по умолчанию, я смогу достичь своей цели.

Я создал приложение с помощью Automator, которое выполняет команду оболочки pbcopy, и установил это приложение в качестве веб-браузера по умолчанию, но не получил ожидаемого результата. Я провел некоторое тестирование и могу подтвердить, что приложение запускается при нажатии на ссылку, однако я не могу передать URL-адрес в сценарий приложения/оболочки. Я пробовал как стандартный ввод, так и переданный аргумент, но безуспешно.

Есть ли способ для приложения, созданного с помощью Automator, получить щелкнутый URL-адрес и отправить его pbcopy, когда это приложение установлено в качестве обработчика (по умолчанию) для URL-адресов?

В качестве альтернативы, есть ли лучший способ создать поддельный веб-браузер, который принимает ввод и помещает его в монтажный стол, чем Automator? Или есть другой способ, которым я могу достичь своей цели без специального приложения/скрипта?

Не называя это ответом, поскольку это не полное решение, но это начало - я использовал rubicode.com/Software/RCDefaultApp , чтобы установить приложение-автомат в качестве браузера по умолчанию. В Automator есть действие «Копировать в буфер обмена». Я просто не могу ввести текст в приложение-автомат.
То же самое, но я использовал Choosy. Я провел достаточное количество тестов и обнаружил следующее: 1) Приложение Automator работает. 2) Кажется, что он вообще не получает никакого ввода. 3) Следовательно, когда браузеру отправляется «ссылка», ему не отправляется URL-адрес в виде открытого текста. Это должно быть обработано каким-то другим способом, и это действительно вопрос после.

Ответы (2)

Способ открытия URL в Mac OS X на самом деле сложнее, чем вы думаете. Когда вы щелкаете URL-адрес, Mac OS X не просто передает браузеру URL-адрес для открытия; вместо этого он отправляет ему событие Apple с идентификатором kAEGetURL, содержащим URL-адрес.

Я никогда не использовал Automator (он слишком медленный и ограниченный для моего обычного использования), поэтому я не уверен в этом, но я сомневаюсь, что он способен обрабатывать события Apple. Поэтому вы не сможете использовать Automator для достижения желаемого.

Поэтому вам придется прибегнуть к обычному приложению Objective-C в Xcode.

Вам нужно сделать две основные вещи:

  1. зарегистрируйте свое приложение для получения события kAEGetURL и установите CFBundleURLTypesв Info.plist вашего приложения включение httpи https.

  2. Реализуйте метод, обрабатывающий событие kAEGetURL, и заставьте его копировать URL-адрес в буфер обмена.

Эти две вещи относительно просто сделать в Objective-C; чтобы проиллюстрировать это, я создал пример приложения, которое делает это. Вы можете просмотреть его по адресу https://github.com/houbysoft/short/tree/master/Copy%20URL%20to%20Clipboard . Самый важный файл https://github.com/houbysoft/short/blob/master/Copy%20URL%20to%20Clipboard/Copy%20URL%20to%20Clipboard/AppDelegate.m , там можно посмотреть как зарегистрироваться на событие (это делается в методе applicationWillFinishLaunching:) и как его скопировать в буфер обмена (это делается в методе getUrl:withReplyEvent:).

Если вам лень и вы просто хотите убедиться, что это работает, возьмите этот файл , извлеките из него приложение, установите его в качестве веб-браузера по умолчанию (откройте настройки Safari и найдите это приложение в поле «Веб-браузер по умолчанию»). Затем нажмите на свою ссылку в Skype, и она должна быть скопирована прямо в буфер обмена.

Спасибо за ваш ответ. Я не знал, как работает URL в OSX. Я взглянул на ваш код, но я не очень хорошо знаю Objective-C. Но ваше полученное приложение работает как шарм, и это то, чего я хотел с самого начала. Еще раз спасибо!
Хорошая работа над приложением (пусть). Я бы с удовольствием предоставил награду, но мне не хватает определенной информации по вопросу, можно ли (или нельзя) заставить Automator подтвердить событие kAEGetURL для этого.
@kopischke: я только что искал в справке Automator любое упоминание о событиях Apple, но ничего не нашел. Я думаю, справедливо предположить, что Automator не поддерживает это.
Это можно сделать с помощью AppleScript, что было бы «логичным» способом расширить рабочий процесс Automator, не углубляясь в XCode/ObjC и не компилируя собственное приложение. (не то, чтобы это было так уж сложно, но, вероятно, AppleScript был бы проще.)
Кажется, это не работает на 10.11. «/Applications/Копировать URL-адрес в буфер обмена. Приложение недоступно в качестве HTTP-браузера»

Шаг 1: Установите открытый исходный код и активно поддерживаемый https://github.com/johnste/finicky . Finicky — это приложение, которое позволяет направлять ссылки в разные браузеры на основе заданных вами правил. Чтобы это работало, Finicky должен быть вашим браузером по умолчанию.

Шаг 2: Откройте редактор сценариев, вставьте следующий код и сохраните его как приложение. Давайте назовем это UrlHandler.app:

on open location input
    set the clipboard to input
end open location

Шаг 3: Укажите, в какой браузер Finicky должен отправлять ссылки по умолчанию. В ~/.finicky.js измените defaultBrowser на UrlHandler.app на шаге 2.

module.exports = {
  defaultBrowser: "com.apple.ScriptEditor.id.UrlHandler",
  ...

Вот альтернативная конфигурация, которая отправляет ссылки в UrlHandler.app только при нажатии на ссылку с нажатой клавишей Command:

module.exports = {
  defaultBrowser: "Firefox",
  handlers: [
    {
      match: ({ keys }) => keys.command,
      browser: "com.apple.ScriptEditor.id.UrlHandler"
    }
  ]
};