Created
February 16, 2019 22:44
-
-
Save dylan-chong/bca0c6cecf2e634662c6b97e853a3ad2 to your computer and use it in GitHub Desktop.
Export safari 12 passwords
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- See the most up to date version here where it says "Download the mrc-converter-suite zip archive" https://discussions.agilebits.com/discussion/30286/mrcs-convert-to-1password-utility/p1 | |
-- | |
-- Exports Safari's saved passwords to a CSV file formatted for use with the convert_to_1p4's csv converter | |
-- | |
-- Version 1.4 | |
-- mike (at) cappella (dot) us | |
-- | |
use AppleScript version "2.5" -- runs on 10.11 (El Capitan) and later | |
use scripting additions | |
set csv_filepath to (path to desktop as text) & "pm_export.csv" | |
set invokedBy to "" | |
tell application "System Events" | |
set invokedBy to get the name of the current application | |
end tell | |
set Entries to {} | |
set Entries to FetchEntries() | |
set theResult to write_csv_file(Entries, csv_filepath) | |
if not theResult then | |
display dialog "There was an error writing the data!" | |
error number -128 | |
end if | |
tell application "System Events" to tell application process "Safari" | |
keystroke "w" using {command down} | |
end tell | |
tell application "Finder" | |
activate | |
make new Finder window | |
set target of Finder window 1 to path to desktop | |
reveal csv_filepath | |
end tell | |
tell application "System Events" to tell application process invokedBy | |
set frontmost to true | |
display dialog "All done! | |
There is now a file on your Desktop named: | |
pm_export.csv | |
You may now convert it to a 1PIF for import into 1Password using the csv converter in the converter suite." | |
end tell | |
-- handlers | |
on FetchEntries() | |
set tableEntries to {} | |
tell application "Safari" | |
activate | |
end tell | |
tell application "System Events" to tell application process "Safari" | |
set frontmost to true | |
keystroke "," using {command down} | |
set tb to toolbar 1 of window 1 | |
set buttonName to (name of button 4 of tb as string) | |
click button 4 of tb | |
set theResult to display dialog "Please unlock " & buttonName & " and press Continue when unlocked" buttons {"Cancel", "Continue"} default button "Continue" | |
if (button returned of theResult) is "Cancel" then | |
error number -128 | |
end if | |
tell application "System Events" to tell application process "Safari" | |
set frontmost to true | |
end tell | |
set prefsWin to window 1 | |
set theTable to table 1 of scroll area 1 of group 1 of group 1 of prefsWin | |
set nRows to the count of rows of table 1 of scroll area 1 of group 1 of group 1 of prefsWin | |
-- say "Dialog has " & nRows & "rows." | |
tell theTable | |
local row_index | |
set row_index to 1 | |
repeat while row_index ≤ nRows | |
local myRow | |
-- say "Row " & row_index | |
set myRow to row row_index | |
select row row_index | |
--delay 1 | |
set focused to true | |
-- open the sheet | |
keystroke return | |
set focused to true | |
tell application "System Events" to tell application process "Safari" | |
local theSite, theName, theUser, thePass, theURLs, urlList, rowValues, theSheet | |
set {theTitle, theSite, theUser, thePass, theURLs} to {"Untitled", "", "", "", ""} | |
set urlList to {} | |
set theSheet to 0 | |
try | |
set theSheet to sheet 1 of prefsWin | |
on error | |
say "Sheet for row " & row_index & "did not open - Skipping Entry" | |
end try | |
if theSheet is not 0 then | |
-- Any of the URL, Username or Password values be empty | |
set theURLtable to table 1 of scroll area 1 of theSheet | |
set nURLs to the count of rows of theURLtable | |
-- say "row " & row_index & "count " & nURLs | |
set url_index to 1 | |
repeat while url_index ≤ nURLs | |
local aURL | |
set aURL to (the value of static text of item 1 of UI element 1 of row url_index of theURLtable) as text | |
-- say "url row " & url_index | |
if url_index is equal to 1 then | |
if aURL is missing value or aURL is equal to "" then | |
-- say "site missing or empty" | |
else | |
-- say "site " & theSite | |
-- For the Title, just duplicate the URL field | |
copy aURL to theSite | |
copy aURL to theTitle | |
end if | |
else | |
-- push extra URLs to the notes area | |
set the end of urlList to aURL | |
end if | |
set url_index to url_index + 1 | |
end repeat | |
try | |
set theUser to value of attribute "AXValue" of text field 1 of theSheet | |
end try | |
try | |
set thePass to value of attribute "AXValue" of text field 2 of theSheet | |
end try | |
--if (count of urlList) is greater than 0 then | |
-- set beginning of urlList to "Extra URLs" | |
--end if | |
set theURLs to Join(character id 59, urlList) of me | |
local tmpList | |
set tmpList to {theTitle, theSite, theUser, thePass, theURLs} | |
copy tmpList to rowValues | |
set the end of tableEntries to rowValues | |
-- close the sheet | |
keystroke return | |
end if | |
end tell | |
set row_index to row_index + 1 | |
end repeat | |
end tell | |
end tell | |
return tableEntries | |
end FetchEntries | |
on write_csv_file(Entries, fpath) | |
local rowdata | |
set beginning of Entries to {"Title", "Login URL", "Login Username", "Login Password", "Additional URLs"} | |
set csvstr to "" | |
set i to 1 | |
repeat while i ≤ (count of Entries) | |
--say "Row " & i | |
set rowdata to item i of Entries | |
if csvstr is not "" then | |
set csvstr to csvstr & character id 10 | |
end if | |
set j to 1 | |
repeat while j ≤ (count of rowdata) | |
--say "Column " & j | |
set encoded to CSVCellEncode(item j of rowdata) | |
if csvstr is "" then | |
set csvstr to encoded | |
else if j is 1 then | |
set csvstr to csvstr & encoded | |
else | |
set csvstr to csvstr & "," & encoded | |
end if | |
set j to j + 1 | |
end repeat | |
set i to i + 1 | |
end repeat | |
set theResult to WriteTo(fpath, csvstr, «class utf8», false) | |
return theResult | |
end write_csv_file | |
on WriteTo(targetFile, theData, dataType, append) | |
try | |
set targetFile to targetFile as text | |
set openFile to open for access file targetFile with write permission | |
if append is false then set eof of openFile to 0 | |
write theData to openFile starting at eof as dataType | |
close access openFile | |
return true | |
on error | |
try | |
close access file targetFile | |
end try | |
return false | |
end try | |
end WriteTo | |
on CSVCellEncode(cellstr) | |
--say cellstr | |
if cellstr is "" then return "" | |
set orig to cellstr | |
set cellstr to "" | |
repeat with c in the characters of orig | |
set c to c as text | |
if c is "\"" then | |
set cellstr to cellstr & "\"\"" | |
else | |
set cellstr to cellstr & c | |
end if | |
end repeat | |
if (cellstr contains "," or cellstr contains " " or cellstr contains "\"" or cellstr contains return or cellstr contains character id 10) then set cellstr to quote & cellstr & quote | |
return cellstr | |
end CSVCellEncode | |
on SpeakList(l, name) | |
say "List named " & name | |
repeat with theItem in l | |
say theItem | |
end repeat | |
end SpeakList | |
on GetTitleFromURL(val) | |
copy val to title | |
-- applescript's lack of RE's sucks | |
set pats to {"http://", "https://"} | |
repeat with pat in pats | |
set title to my ReplaceText(pat, "", title) | |
end repeat | |
return item 1 of my Split(title, "/") | |
end GetTitleFromURL | |
on ReplaceText(find, replace, subject) | |
set prevTIDs to text item delimiters of AppleScript | |
set text item delimiters of AppleScript to find | |
set subject to text items of subject | |
set text item delimiters of AppleScript to replace | |
set subject to subject as text | |
set text item delimiters of AppleScript to prevTIDs | |
return subject | |
end ReplaceText | |
on Split(theString, theDelimiter) | |
set oldDelimiters to AppleScript's text item delimiters | |
set AppleScript's text item delimiters to theDelimiter | |
set theArray to every text item of theString | |
set AppleScript's text item delimiters to oldDelimiters | |
return theArray | |
end Split | |
on Join(delims, l) | |
local ret | |
set prevTIDs to AppleScript's text item delimiters | |
set AppleScript's text item delimiters to delims | |
set ret to items of l as text | |
set AppleScript's text item delimiters to prevTIDs | |
return ret | |
end Join |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thank you a lot: your script worked successfully on Mojave!