AppleScript: encoding arbitrary query-string values in URLs passed to Firefox

怎甘沉沦 提交于 2020-01-02 10:35:34

问题


I use firefox for a long time as my only browser on Pc or Mac. In a few words my problem: I want to create a service on mac with automator and Applescript for quite instant translation using translate.google.com. What works great with Safari or Chrome (below the 4 or 5 lines of script)

On run {input, parameters}
Tell application "Safari"
activate
try
Open location "https://translate.google.com/#auto/en/" & (the clipboard)
end try
end tell
end run

The same thing (script) does not work at all with Firefox, I try by different ways To circumvent the impossible problem

On run {input, parameters}
Set theProcess to "Firefox"
Set info to {}
Set y to 0
Set x to 0
Set n to 0

Tell application "Applications / Firefox.app"
activate
Open location "http://translate.google.com/#auto/en/"
end tell
Tell application "System events"
Repeat with theProcess in (process "Firefox")
try
Set info to info & (value of (first attribute whose name is "AXWindows") of theProcess)
end try
end repeats
Set n to count of info
info
end tell
Tell application "System Events" to tell process "Firefox"
Set x to "1"
Set frontmost to true
try
Click menu item "Paste" of menu "Edit" of menu bar 1
end try
Repeat while x is "1" -
If x is "1" then
Keystroke "V" using command down
Set x to "0"

end if
end repeat
end tell
end run

By copying and pasting, the actions take place before the complete loading of the page, even by slowing down the Copy and Paste procedure. After many observations there is a problem of formatting the text contained in the clipboard with the association of the URL, I improved this but it is not perfect yet.

tell application "Applications/Firefox.app" to activate
tell application "System Events" to tell process "Firefox"
    set frontmost to true
    set sentence to text of (the clipboard)
    set thesentences to paragraphs of sentence
    set thenewsentences to thesentences as string
    set the clipboard to thenewsentences
    keystroke "t" using command down
    keystroke "https://translate.google.com/#auto/fr/" & (the clipboard) & return
end tell

Anyway if it works with Safari without modifying anything, the problem is at the Firefox entry, so if you can look at this problem, that would be very useful to us all. Thank you for your attention. Thank you for your answers.


回答1:


Safari and Chrome perform the necessary encoding of reserved characters in the URL for you, but Firefox doesn't.

Therefore, you need to perform the encoding of the query-string value (the text to embed in the URL) explicitly.

The easiest (though not obvious) approach is to use perl, via a shell command, gratefully adapted from here:

# Example input that contains chars. that have special meaning in a URL ('&' and '?')
set the clipboard to "Non, Je ne regrette rien & rien ne va plus?"

# Get text from the clipboard and URL-encode it.
set encodedText to do shell script ¬
  "perl -MURI::Escape -lne 'print uri_escape($_)' <<<" & quoted form of (the clipboard)

# Now it's safe to append the encoded text to the URL template.
tell application "Firefox"
    activate
    open location "https://translate.google.com/#auto/en/" & encodedText
end tell

The above approach works with all three browsers mentioned: Firefox, Safari, and Google Chrome.

Note:

As of (at least) Firefox v50, Firefox opens the URL in in a new tab in the current front window by default.

You can make Firefox open the URL in a new window instead, by unchecking Open new windows in a new tab instead on the General tab of Firefox's preferences.

Note, however, that this is a persistent setting that affects all URLs opened from outside of Firefox.

For an ad-hoc solution for opening in a new window that doesn't rely on changing the setting, see this answer of mine.




回答2:


Hello below the service Automator with some version it is possible to encounter problems, I modified the script so that it works almost everywhere. A frequent system error is the permission to applications to control your computer that is handled by the system preferences tab Security and Privacy, the system asks if you allow Firefox, TexEdit and others using this service for its keyboard shortcuts. Also in Automator create service (to be General (and appear in all applications) no entry (up to Yosemite since El Capitan I saw that with Firefox for example all the services are usable), choose Execute a script Applescript paste the script below divided into 2 script or 1 script only.

on run

    set Sn to ""

    tell application "System Events"
        set Sn to the short name of first process whose frontmost is true --here we look for and find which application to launch the service

        tell process Sn

            set frontmost to true
            try
                click menu item "Copy" of menu "Edit" of menu bar 1 -- there is used the Copier of the menu Editing of the application
            end try
        end tell
    end tell
    return the clipboard

end run   

     In the script following the entry is done with the contents of the Clipboard
    On run {input}

on run {input}

    set input to (the clipboard) -- Here we paste the contents of the Clipboard into a variable
    try
        set input to do shell script "Perl -MURI :: Escape -lne 'print uri_escape ($ _)' <<< " & quoted form of input --To format the text to make it usable with Firefox and the url of translate.google.com

        tell application id "org.mozilla.firefox"
            activate
            open location "https://translate.google.com/#auto/en/" & input --here since version 50 of Firefox you must open a tab and not a new url window of translate.google.com, with option #auto automatic detection by google of the language, and fr to translate into French (these options are modifiable at will)
        end tell
    end try
end run -- end of the operation you have a tab open on translate, a text to translate and a translated text


来源:https://stackoverflow.com/questions/40726348/applescript-encoding-arbitrary-query-string-values-in-urls-passed-to-firefox

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!