Cómo acceder a una URL en la que se hizo clic en una aplicación de controlador de URL creada en Automator

Actualmente estoy tratando de modificar el comportamiento de manejo de URL predeterminado en OS X. Me gustaría, al hacer clic en cualquier enlace fuera de un navegador web, copiar esta URL en el área de trabajo en lugar de abrirla en el navegador web predeterminado, por ejemplo. , hacer clic en un enlace en una conversación de Skype debería copiar esta URL en el tablero de OS X en lugar de abrirlo en Firefox (que actualmente es mi navegador web predeterminado).

He pensado en soluciones, pero actualmente no puedo implementar una. Si puedo crear una aplicación que coloque las URL en el área de trabajo que se le envían, y puedo configurar esta aplicación como el navegador web predeterminado, podría lograr mi objetivo.

Creé una aplicación con Automator que ejecuta el comando de shell pbcopyy configuré esta aplicación como mi navegador web predeterminado, pero no obtuve el resultado esperado. Hice algunas pruebas y puedo confirmar que la aplicación se ejecuta al hacer clic en un enlace; sin embargo, no puedo pasar la URL a la aplicación/script de shell. Probé tanto stdin como un argumento pasado, pero sin éxito.

¿Hay alguna forma de que una aplicación creada con Automator recupere una URL en la que se hizo clic y la envíe a pbcopy, cuando esa aplicación está configurada como un controlador (predeterminado) para las URL?

Alternativamente, ¿hay una mejor manera de crear un navegador web falso que tome la entrada y la coloque en la mesa de trabajo que Automator? ¿O hay alguna otra forma de lograr mi objetivo sin una aplicación/secuencia de comandos personalizada?

No pongo esto como respuesta ya que no es una solución completa, pero es un comienzo: usé rubicode.com/Software/RCDefaultApp para configurar una aplicación de automatización como navegador predeterminado. En Automator, hay una acción para Copiar al Portapapeles. Simplemente no puedo obtener ninguna entrada de texto para una aplicación de automatización.
Lo mismo, pero usé Choosy. He realizado una buena cantidad de pruebas y he encontrado lo siguiente: 1) La aplicación Automator se ejecuta. 2) No parece recibir ningún tipo de entrada. 3) Ergo, cuando se envía un "enlace" a un navegador, no se envía una URL en texto sin formato. Esto debe manejarse de alguna manera diferente, y eso es realmente lo que busca la pregunta.

Respuestas (2)

La forma en que se abre la URL en Mac OS X es en realidad más complicada de lo que piensas. Cuando hace clic en una URL, Mac OS X no solo pasa al navegador la URL para abrir; en su lugar, le envía un evento de Apple, con el ID kAEGetURL, que contiene la URL.

Realmente nunca usé Automator (es demasiado lento y limitado para mi uso típico), así que no estoy seguro de esto, pero dudo que tenga la capacidad de manejar Apple Events. Por lo tanto, no podrá usar Automator para lograr lo que desea.

Por lo tanto, tendrá que recurrir a una aplicación Objective-C normal en Xcode.

Las dos cosas básicas que debes hacer son:

  1. registre su aplicación para recibir el evento kAEGetURL y configure el CFBundleURLTypesInfo.plist de su aplicación para incluir httpy https.

  2. Implemente un método que maneje el evento kAEGetURL y haga que copie la URL en el portapapeles.

Estas dos cosas son relativamente sencillas de hacer en Objective-C; para ilustrar, he creado una aplicación de muestra que hace esto. Puede verlo en https://github.com/houbysoft/short/tree/master/Copy%20URL%20to%20Clipboard . El archivo más importante es https://github.com/houbysoft/short/blob/master/Copy%20URL%20to%20Clipboard/Copy%20URL%20to%20Clipboard/AppDelegate.m , allí puede ver cómo registrarse para el evento (esto se hace en el método applicationWillFinishLaunching:) y cómo copiarlo en el portapapeles (esto se hace en el método getUrl:withReplyEvent:).

Si se siente perezoso y solo quiere ver que esto funciona, tome este archivo , extraiga la aplicación de él, configúrelo como el navegador web predeterminado (abra Preferencias de Safari y busque esa aplicación en el campo Navegador web predeterminado). Luego haga clic en su enlace en Skype, y debería copiarse directamente en su portapapeles.

Gracias por su respuesta. No sabía cómo se procesaba la URL en OSX. He echado un vistazo a tu código, pero no conozco mucho Objective-C. Pero, su aplicación resultante funciona de maravilla y eso es lo que quería desde el principio. ¡Gracias de nuevo!
Buen trabajo en la aplicación (let). Me encantaría otorgar la recompensa, pero me falta información definitiva sobre la cuestión de si Automator puede (o no) ser obligado a reconocer un evento kAEGetURL para hacerlo.
@kopischke: Acabo de buscar en la ayuda de Automator cualquier mención de eventos de Apple, y no encontré nada. Creo que es justo asumir que Automator no es compatible con esto.
Es posible hacer esto con AppleScript, que sería la forma "lógica" de extender un flujo de trabajo de Automator, sin profundizar en XCode / ObjC y compilar su propia aplicación. (No es que sea tan complicado, pero es probable que AppleScript sea más fácil).
Esto no parece funcionar en 10.11. "/Aplicaciones/Copiar URL a Clipboard.app no ​​está disponible como navegador HTTP"

Paso 1: instale el código abierto y mantenga activamente https://github.com/johnste/finicky . Finicky es una aplicación que le permite enrutar enlaces a diferentes navegadores según las reglas que especifique. Para que esto funcione, Finicky debe ser su navegador predeterminado.

Paso 2: Abra el Editor de secuencias de comandos, pegue el siguiente código y guárdelo como una aplicación. Llamemos a este UrlHandler.app:

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

Paso 3: especifica a qué navegador Finicky debe enviar los enlaces de forma predeterminada. En ~/.finicky.js, cambie el navegador predeterminado a UrlHandler.app en el paso 2.

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

Aquí hay una configuración alternativa que envía enlaces a UrlHandler.app solo cuando se hace clic con el botón Comando en un enlace:

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