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.