I'm specifically looking to design a custom action for LaunchBar so that I can initiate a tweet from that utility. Since Notification Center has a "Click to tweet" button, I wondered if Notification Center has any hooks that would allow me to script this without waiting for the developer of the program add a function to perform this action.
-
2Notification Center has no AppleScript Dictionary, no Automator actions, and sadly little in the way of obvious hooks that show up when poking around the executable bundle.– Daniel ♦Commented Jul 27, 2012 at 5:14
-
1A strings dump of the suggests there's something called "ShareKit", various sharingService functions, and something called a "Share Widget" — perhaps some subset of that might be helpful somehow.– Daniel ♦Commented Jul 27, 2012 at 5:20
-
I'll have time to dig into the great answers tomorrow but I wanted to bounty this for any additional exposure it might gain.– bmike ♦Commented Jul 28, 2012 at 17:48
6 Answers
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.)
-
2And a
keystroke
command can start the Tweet out with text. Now to programmatically complete the Tweet…– Daniel ♦Commented Jul 27, 2012 at 6:10 -
I've been trying unsuccessfully to update this to work with Yosemite. Any suggestions?– wstCommented Feb 3, 2015 at 22:06
-
1@wst Hm, looks tricky. It seems clicking the exposed menu bar item doesn't do anything anymore — might make a good bug report.– jtbandesCommented Feb 4, 2015 at 7:08
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
-
The text entry area was the bit I was hoping to use. I'll have to dig into the launchbar docs and see if the curl idea has any legs.... I thought they disabled that sending of a password in the clear - so thanks for that!– bmike ♦Commented Jul 26, 2012 at 17:32
-
I think they disabled the use of password sending for clients that use the API (replacing it with the key authentication method), but this is, in effect, using the website not a client, so using the username/password is likely fine. In fact, if you are already logged in with an active session and cookie etc, it may even work without them... (guesswork)– stuffeCommented Jul 26, 2012 at 17:34
-
I don't think cookies are shared between Safari &
curl
. And they shouldn't be, anyway.– olivierCommented Jul 27, 2012 at 9:20 -
2Twitter fully switched to OAuth-based logins and disabled basic authentication on June 30, 2010. The second command in your answer hasn’t worked since then. Commented Aug 2, 2012 at 17:47
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.
-
Oh, neat. It's logical that ⇧⌘D would send the tweet (that's the shortcut for Send in Mail).– jtbandesCommented Jul 28, 2012 at 3:51
-
1
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
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.
-
Hmm - I'll have to look into the API. That plus my launcher, Launchbar would be much better than UI scripting. +1 and possibly a new best answer.– bmike ♦Commented Dec 5, 2012 at 19:55
Fantastic! Thanks for showing the world another way.
My solution worked for ME, but so does yours.
I'm not an Applescript expert by FAR, but I do love fiddling with it.
Thanks!
Using what I've learned from you, here is another way that works for me. This doesn't address some of your concerns about alternate keyboards or errors, but maybe it will shed a light for someone dabbling in AS.
display dialog "Tweet?" default answer "" buttons {"OK"} default button 1 with icon 2
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}
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