Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
696 views
in Technique[技术] by (71.8m points)

macos - OSX : Defining a new URL handler that points straight at a Python script

I'm trying to define a new URL handler under OSX that will point at a python script.

I've wrapped the Python script up into an applet (right-clicked on the .py, and gone Open With -> Build Applet)

I've added the following into the applet's Info.plist:

<key>CFBundleURLTypes</key>
<array>
    <dict>
        <key>CFBundleURLName</key>
        <string>Do My Thing</string>
        <key>CFBundleURLSchemes</key>
        <array>
            <string>dmt</string>
        </array>
    </dict>
</array>

I've also used the More Internet preferences pane to specify "dmt" as a protocol, but when I try to get it to link the protocol to my applet, it says that "There was a problem setting the app as the helper"

Anyone know where I should go from here?

Thanks

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

After a lot of messing around, I've managed to get this working under OSX...

This is how I'm doing it:

in the AppleScript Script Editor, write the following script:

on open location this_URL
    do shell script "/scripts/runLocalCommand.py '" & this_URL & "'"
end open location

If you want to make sure you're running the Python from a certain shell (in my case, I'm using tcsh generally, and have a .tcshrc file that defines some environment variables that I want to have access to) then that middle line might want to be:

do shell script "tcsh -c "/scripts/localCommand.py '" & this_URL & "'""

I was wanting to do all of my actual processing inside a python script - but because of the way URL handers work in OSX, they have to call an application bundle rather than a script, so doing this in AppleScript seemed to be the easiest way to do it.

in the Script Editor, Save As an "Application Bundle"

Find the saved Application Bundle, and Open Contents. Find the Info.plist file, and open it. Add the following:

<key>CFBundleIdentifier</key>
<string>com.mycompany.AppleScript.LocalCommand</string>
<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLName</key>
    <string>LocalCommand</string>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>local</string>
    </array>
  </dict>
</array>

Just before the last two lines, which should be:

</dict>
</plist>

There are three strings in there that might want to be changed:

com.mycompany.AppleScript.LocalCommand
LocalCommand
local

The third of these is the handler ID - so a URL would be local://something

So, then this passes over to the Python script.

This is what I've got for this:

#!/usr/bin/env python
import sys
import urllib
arg = sys.argv[1]
handler, fullPath = arg.split(":", 1)
path, fullArgs = fullPath.split("?", 1)
action = path.strip("/")
args = fullArgs.split("&")
params = {}
for arg in args:
    key, value = map(urllib.unquote, arg.split("=", 1))
    params[key] = value

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...