Сохраните источник открытой веб-страницы из Safari с AppleScript - PullRequest
5 голосов
/ 03 октября 2011

Как я могу написать скрипт, который сохраняет открытую в Safari веб-страницу по какому-либо пути?

(Код будет использоваться для более сложного сценария позже, поэтому неуместное решение, использующее системные события, не подойдет.) Много поисков в поиске сценария, использующего функцию сохранения исходного кода, оставило меня довольно не информированным, поэтому ответ Это может быть первым в интернете. Я вставил некоторые вещи, которые могут быть полезны ниже.

Потенциально полезные вещи

Эти две записи из словаря AppleScript для Safari выглядят полезными:

document n [см. Также Standard Suite]: документ Safari, представляющий активную вкладку в окне.

свойства:

  • source (text, r / o): исходный HTML-код веб-страницы, загруженной в данный момент в документе.
  • text (text, r / o): текст веб-страницы, загруженной в данный момент в документе. Изменения в тексте не отображаются на веб-странице.
  • URL (текст): текущий URL документа.

и позже:

save v : сохранить объект.

сохранить спецификатор: объект для команды

  • [ как текст]: тип файла для сохранения данных.
  • [ in alias]: файл, в котором сохраняется объект.

Сценарий, который почти делает то, что я хочу

Этот скрипт сохраняет документ HTML, но вывод выглядит некорректно по сравнению с файлами, сохраненными с помощью функции Safari «Экспорт как источник страницы» вручную:

tell application "Safari"
(* Get a reference to the document *)
set myDoc to document of front window

(* Get the source of the page *)
set mySrc to source of myDoc

(* Get a file name *)
set myName to "Message_" & "0001" & ".html" -- the # will be modified later

tell application "Finder"
    (* Get a path to the front window *)
    set myPath to (target of front window) as string

    (* Get a file path *)
    set filePath to myPath & myName

    (* Create a brand new file *)
    set openRef to open for access (myPath & myName) with write permission

    (* Save the document source *)
    write mySrc to openRef

    (* Close the file *)
    close access openRef
end tell

Это то, что я написал до сих пор:

Сценарии, которые я написал до сих пор

  1. Это моя первая попытка:

    tell application "Safari"
        set pageToSaveSafariWindowIn to "Q:Ø:"
        set pageToBeSaved to front window
        save document pageToBeSaved as source in alias pageToSaveSafariWindowIn
    end tell
    

    Вот полученные журналы:

    tell application "Safari"
        get window 1
            --> window id 6017
        save document (window id 6017) as source in alias "Q:Ø:"
            --> error number -1700 from window id 6017 to integer
    

    и

    error "Safari получил ошибку: невозможно преобразовать идентификатор окна 6017 в тип integer". число -1700 из идентификатора окна 6017 в целое число

  2. И еще одна попытка:

    tell application "Safari"
        save source of document in "Q:Ø:"
    end tell
    

    , который выдает журнал результатов:

    ошибка "Не удается получить источник документа". номер -1728 из «класса conT» документа

Ответы [ 5 ]

4 голосов
/ 23 ноября 2013

Я нашел то, что считаю лучшим / более легким решением:

tell application "Safari"
activate
set URL of document 1 to "http://www.apple.com"
delay 5
set myString to source of document 1
end tell
set newFile to POSIX file "/Users/myUsername/test.html"
open for access newFile with write permission
write myString to newFile
close access newFile

Примечания:

  • «Источник документа 1», похоже, заполнентолько с правильным исходным текстом ПОСЛЕ полной загрузки веб-страницы.Таким образом, необходимость задержки.Может быть, вы можете использовать более низкую задержку.

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

  • Вышеописанное работает на OSX 10.8.4.Не проверено для других версий.

2 голосов
/ 10 июля 2014
set hyperlink to "http://www.google.com/"

set sourceCode to (do shell script "curl " & hyperlink)

do shell script "echo " & quoted form of sourceCode & " >> /Users/name/Desktop/test.csv"

Вы можете добавить это в повторе, и он добавит каждый исходный код из каждого перечисленного элемента в конец вашего созданного документа.то есть

set hyperlink to "http://www.aRepetitivePageSite.com/2014?page="
set your_count to 1
repeat until your_count = 10
  set sourceCode to (do shell script "curl " & (hyperlink & your_count as string as text))
  do shell script "echo " & quoted form of sourceCode & " >> /Users/name/Desktop/test.csv"
  set your_count to your_count + 1
end repeat
2 голосов
/ 04 декабря 2012

Это способ сохранить окно, полное вкладок. Оригинальный обработчик пользовательского интерфейса был написан StefanK aka. Стефан Климе из Macscripter славы. Он учитывает окончания файлов вебархивов. Когда Safari сомневается, вы можете настроить, хотите ли вы перезаписать или проигнорировать уже записанные файлы. Он не сохраняет повторяющиеся вкладки, и вы можете установить свойство, чтобы решить, будет ли оно закрывать вкладку при сохранении.

Пожалуйста, посмотрите на MacScripter, прямая ссылка в скрипте, для любых обновлений.

Вы можете использовать wget, но я остановился на сценариях пользовательского интерфейса, так как wget имеет загружаемую информацию, которая уже есть в вашем браузере, и также полезен для программирования.


    property tlvl : me
    # Release 1.0.1
    # © 2012 McUsr and  put in Public Domain under GPL 1.0
    # Please refer to this post: http://macscripter.net/post.php?tid=30892
    property shallClose : false # set this to false if you don't want to close the windows, just saving them
    property dontOverWriteSavedTabs : false # set this to true if you don't want to overwrite already saved tabs in the folder 
    script saveTabsInSafariWindowsToFolder
        property parent : AppleScript

        property scripttitle : "SafariSaveTabs"
        on run
            if downloadWindowInFront() then return 0 # activates Safari

            local script_cache
            set script_cache to my storage's scriptCache()

            set saveFolder to POSIX path of (getHFSFolder({theMessage:"Choose or create folder to save Safari-tabs in.", hfsPath:DefaultLocation of script_cache as alias}))
            if saveFolder = false then return 0 -- we were obviously mistaken, about what we wanted to do.

            my storage's saveParenFolderInScriptCache(saveFolder, script_cache)

            tell application "Safari"
                tell its window 1
                    local tabc, oldidx
                    set tabc to count tabs of it
                    if not tlvl's shallClose then
                        set oldidx to index of current tab
                        tell tab tabc to do JavaScript "self.focus()"
                    end if
                    local saveCounter
                    set saveCounter to 1 -- regulates setting of save folder to only first time in Safari.
                    repeat while tabc > 0
                        local theUrl, theIdx, theProtocol, alreadyClosed

                        set {theUrl, theIdx, alreadyClosed} to {URL of its current tab, index of its current tab, false}

                        if my isntAduplicateTab(theIdx, it) then

                            set theProtocol to my urlprotocol(theUrl)
                            if theProtocol is in {"http", "https"} then
                                # save it
                                set saveCounter to my saveCurrentTab(saveFolder, saveCounter)
                            else if theProtocol is "file" then
                                # make an alias of it 
                                my makeAliasForAFurl(saveFolder, theUrl)
                            end if
                        else
                            if tlvl's shallClose then
                                close current tab
                                set alreadyClosed to true
                            end if
                        end if

                        if not alreadyClosed and tlvl's shallClose then
                            close current tab of it
                            set tabc to tabc - 1
                        else if not tlvl's shallClose then
                            set tabc to tabc - 1
                            if tabc > 0 then tell tab tabc to do JavaScript "self.focus()"
                        end if
                    end repeat
                    # move forwards
                    if not tlvl's shallClose then
                        tell tab oldidx to do JavaScript "self.focus()"
                    end if
                end tell
            end tell
        end run


        to makeAliasForAFurl(destinationFolder, furl)
            local ti, tids, thefilePath
            set ti to "file://"
            set {tids, AppleScript's text item delimiters} to {AppleScript's text item delimiters, ti}
            set thefilePath to text item 2 of furl
            set AppleScript's text item delimiters to tids
            set theFile to POSIX file thefilePath as alias
            set theFolder to POSIX file destinationFolder
            tell application "Finder"
                make alias at theFolder to theFile
                # I don't care if there was one there from before, as it could equally
                # be a file with the same name.
            end tell
        end makeAliasForAFurl

        to saveCurrentTab(destinationFolder, timeNumber)
            tell application id "sfri" to activate
            tell application "System Events"
                set UI elements enabled to true
                tell process "Safari"
                    keystroke "s" using {command down}
                    tell window 1
                        repeat until exists sheet 1
                            delay 0.2
                        end repeat
                        tell sheet 1
                            if timeNumber = 1 then -- We'll set the savepath upon first call
                                keystroke "g" using {command down, shift down}
                                repeat until exists sheet 1
                                    delay 0.2
                                end repeat
                                tell sheet 1
                                    set value of text field 1 to destinationFolder
                                    click button 1
                                    delay 0.1
                                end tell
                            end if
                            keystroke return
                            delay 0.2
                            if exists sheet 1 then -- We are being asked if we want to overwrite already saved tab
                                if dontOverWriteSavedTabs then
                                    keystroke return # if it was already saved. We don't overwrite it
                                    click button 3
                                else
                                    keystroke tab
                                    keystroke space # we are  to overwrite
                                end if
                            else
                                try
                                    set dummy to focused of sheet 1
                                on error
                                    # click button 1 of panel of application "Safari"
                                    keystroke return

                                    delay 0.2
                                    if exists sheet 1 then -- We are being asked if we want to overwrite already saved tab
                                        if dontOverWriteSavedTabs then
                                            keystroke return # if it was already saved. We don't overwrite it
                                            click button 3
                                        else
                                            keystroke tab
                                            keystroke space # we are  to overwrite
                                        end if
                                    end if
                                end try
                            end if
                        end tell
                    end tell
                end tell
            end tell
            set timeNumber to timeNumber + 1
            return timeNumber
        end saveCurrentTab

        on downloadWindowInFront()
            tell application "Safari"
                activate
                set tabCount to count tabs of its window 1
                if tabCount  0 then set colons to true
            if (offset of "/" in aPath) > 0 then set slashes to true

            if colons and slashes then
                return null
            else if colons then
                set origDelims to ":"
            else if slashes then
                set origDelims to "/"
            else
                return null
            end if
            local tids
            set {tids, AppleScript's text item delimiters} to {AppleScript's text item delimiters, origDelims}
            if aPath = "/" then
                -- we return root when we get root
                set AppleScript's text item delimiters to tids
                return "/"
            end if
            local theParentFolder
            if text -1 of aPath is in {":", "/"} then
                set theParentFolder to text items 1 thru -2 of text 1 thru -2 of aPath
            else
                set theParentFolder to text items 1 thru -2 of aPath
            end if
            set theParentFolder to theParentFolder as text
            if slashes and theParentFolder = "" then set theParentFolder to "/"
            -- sets the root path if we got a folder one level below it
            if colons and (":" is not in theParentFolder) then set theParentFolder to theParentFolder & ":"
            -- we return volumename, if we are given volumename 
            set AppleScript's text item delimiters to tids
            return theParentFolder
        end parentfolder


        script storage
            property cachespath : ((path to library folder from user domain as text) & "caches:" & "net.mcusr." & scripttitle)

            on scriptCache()

                local script_cache
                try
                    set script_cache to load script alias (my cachespath)
                on error
                    script newScriptCache
                        property DefaultLocation : (path to desktop folder as text)
                        # edit any of those with default values
                    end script

                    set script_cache to newScriptCache
                end try
                return script_cache
            end scriptCache

            to saveScriptCache(theCache)
                store script theCache in my cachespath replacing yes
            end saveScriptCache

            to saveParenFolderInScriptCache(theFolderToSaveIn, script_cache)
                local containingFolder
                set containingFolder to (parentfolder of saveTabsInSafariWindowsToFolder for theFolderToSaveIn) & "/"
                local theLoc
                set theLoc to POSIX file containingFolder as alias
                set DefaultLocation of script_cache to theLoc
                my saveScriptCache(script_cache)
            end saveParenFolderInScriptCache
        end script
    end script
    tell saveTabsInSafariWindowsToFolder to run

Наслаждайтесь

2 голосов
/ 27 октября 2011

Automator сделает это.Вот рабочий процесс - http://cl.ly/450m0Q21463p16322P1i.

Automator -> Действия -> Интернет -> Get Current Webpage from Safari -> Download Urls.

0 голосов
/ 23 января 2016

Если бы вы делали эту задачу вручную, вам бы пришлось просмотреть исходный текст в Safari, скопировать исходный код в буфер обмена, перейти в редактор исходного кода HTML и создать новый документ, вставить исходный код в, выбрать «Сохранить» и перейти кпапку «Документы», назовите документ, а затем сохраните его.

Поэтому, когда вы хотите написать AppleScript для выполнения этой задачи, ключевым моментом является то, что вы все еще хотите использовать те же приложения, но вместо запускаих вручную, вы будете запускать их с AppleScript.Отличным редактором исходного кода HTML AppleScriptable является TextWrangler, который можно бесплатно загрузить в Mac App Store.

Как только у вас есть веб-браузер (Safari) для получения исходного кода HTML из сети и редактор исходного кода HTML (TextWrangler)) для создания и сохранения документа HTML вы можете написать очень маленький, очень простой в написании, очень легкий для чтения, очень простой в обслуживании AppleScript, как этот:

tell application "Safari"
    activate
    if document 1 exists then
        set theDocumentTitle to the name of document 1
        set theDocumentSource to the source of document 1
        tell application "TextWrangler"
            activate
            set theNewDocument to make new document with properties {name:theDocumentTitle, text:theDocumentSource}
            set theDocumentsFolderPath to the path to the documents folder as text
            set theSaveFilePath to theDocumentsFolderPath & theDocumentTitle & ".html"
            save theNewDocument to file theSaveFilePath
        end tell
    end if
end tell

…, который просто спросит Safariпредоставить имя и исходный код самого переднего документа, а затем попросить TextWrangler использовать эту информацию для создания и сохранения соответствующего HTML-документа в папке «Документы».Это те задачи, в которых эти два приложения очень хороши.Вы вроде не должны спрашивать дважды или делать много объяснений.

...