What hooks exist into Notification Center / twitter so that I can tweet programmatically?
Solution 1:
Apps can hook into the sharing options with the new NSSharingService API. It sounds like custom LaunchBar actions can be made with any UNIX executable file, so you could probably write a small command line tool (or you may need to build an actual app — you'll have to test it out) which activates this API (using NSSharingServiceNamePostOnTwitter
), and that should display the tweet dialog.
Update: to initiate a tweet from AppleScript, you can do the following:
tell application "System Events"
tell process "Notification Center"
-- activate notification center
if (count of UI elements) is 1 then click first menu bar's first menu bar item
-- click the tweet button
click button 1 of UI element 1 of row 2 of table 1 of scroll area 1 of window "Window"
end tell
end tell
Furthermore, you can toggle the "Show Alerts and Banners" / do not disturb mode:
tell application "System Events"
tell process "Notification Center"
key down option
click first menu bar's first menu bar item
key up option
end tell
end tell
(This is all very specific to the current window layout of Notification Center and is likely to break with future OS X updates — but there will probably be easy fixes.)
Solution 2:
None that I know of (and in fact I think that having a Twitter/Facebook quick post area inside the notifications area is actually dumb (should be a widget really), and I have turned it off) but you can use the command line to both send a read tweets, as mentioned in this webpage, extracts below:
To display a list of tweets (replace osxdaily with a twitter username of your choice):
curl -s http://twitter.com/osxdaily | grep '' | cut -d">" -f2 | cut -d"<" -f1
To update your twitter status:
curl -u your_user:your_password -d status='This is My update' https://twitter.com/statuses/update.xml
Solution 3:
Taking this all one step further and putting together what we've learned so far, here's a fully programatic tweet:
tell application "System Events"
tell process "Notification Center"
click menu bar item 1 of menu bar 1
click button 1 of UI element 1 of row 2 of table 1 of scroll area 1 of window "window"
keystroke "Content of the tweet"
keystroke "D" using {command down, shift down}
end tell
end tell
Of course this is fragile, but for now, it works. I'd love to find a real hook, but UI Scripting is a workaround.
Solution 4:
Brilliant command shift D.
Adding:
display dialog "Tweet?" default answer "" buttons {"OK"} default button 1
set mytweet to text returned of result
tell application "System Events"
tell process "Notification Center"
click menu bar item 1 of menu bar 1
click button 1 of UI element 1 of row 2 of table 1 of scroll area 1 of window "window"
keystroke mytweet
keystroke "D" using {command down, shift down}
keystroke space
end tell
end tell
Solution 5:
I wrote another script that fixes some issues in the script posted by Ewwis:
- There was no way to close the dialog at the start.
- The second click action didn't work if Notification Center hadn't been shown after the last login.
- The script didn't work when there was a delay before the view for composing a tweet was shown. If it already contained some text, it wasn't cleared.
- The keystroke command only works for inserting characters that can be entered with the current input method.
- The Notification Center sidebar wasn't closed at the end.
It doesn't work when the Notification Center sidebar is open though.
set answer to text returned of (display dialog "" default answer "")
try
set old to the clipboard as record
end try
try
set text item delimiters to linefeed
set the clipboard to paragraphs of answer as text
tell application "System Events"
tell process "Notification Center"
click menu bar item 1 of menu bar 1
try
windows
on error
click menu bar item 1 of menu bar 1
click menu bar item 1 of menu bar 1
end try
click button 1 of UI element 1 of row 2 of table 1 of scroll area 1 of window 1
delay 0.1
keystroke "av" using command down
keystroke "d" using {shift down, command down}
repeat 100 times
try
delay 0.1
click menu bar item 1 of menu bar 1
exit repeat
end try
end repeat
end tell
end tell
end try
try
set the clipboard to old
end try
It would be easier to just use the API.