#!/usr/bin/env python # A simple Twitter posting client # Copyright 2009 by Akkana Peck -- share and enjoy under the GPL v2 or later. import os, sys import twitter import gtk # It might be nice to allow more characters sometimes, # if there's a long URL that Twitter is going to map to a tinyurl. # But even in that case the Twitter API won't accept >140 chars. maxchars = 140 # # Read username and password from ~/.twit # It should look like this: #username = "username" #passwd = "passwd" # Optionally you can also set max_entries and sleep_seconds. # execfile(os.path.join(os.environ["HOME"], ".twit")) import sys def post(widget, buffer) : widget.set_sensitive(False) if (buffer.get_char_count() > maxchars) : print "More than", maxchars, "characters!" return 0 poststr = buffer.get_text(buffer.get_start_iter(), buffer.get_end_iter()) api = twitter.Api(username=username, password=passwd) try : api.PostUpdate(poststr) except Exception, e : print "Couldn't post!", str(e) print "Post string was: '" + poststr + "'" sys.stdout.flush() widget.set_sensitive(True) return print "Posted:", poststr gtk.main_quit() def changed(buffer, label, postbtn) : count = buffer.get_char_count() labelstr = str(count) + " chars (" + str(maxchars-count) + " left)" label.set_label(labelstr) if count > 0 and count <= maxchars : postbtn.set_sensitive(True) else : postbtn.set_sensitive(False) win = gtk.Window() win.connect("destroy", gtk.main_quit) vbox = gtk.VBox(spacing=3) win.add(vbox) vbox.show() label = gtk.Label("0 chars (" + str(maxchars) + " left)") vbox.pack_start(label) label.show() textview = gtk.TextView(buffer=None) textview.set_wrap_mode(gtk.WRAP_WORD) textview.set_size_request(420, 60) vbox.pack_start(textview) textview.show() textbuffer = textview.get_buffer() buttonbox = gtk.HBox(spacing=3) vbox.pack_start(buttonbox) buttonbox.show() postbtn = gtk.Button("Post") postbtn.connect("clicked", post, textbuffer) postbtn.set_sensitive(False) buttonbox.pack_start(postbtn) postbtn.show() quitbtn = gtk.Button("Quit") quitbtn.connect("clicked", gtk.main_quit) buttonbox.pack_start(quitbtn) quitbtn.show() textbuffer.connect("changed", changed, label, postbtn) # Put contents of argv into textbuffer as initial text if len(sys.argv) > 1 : textbuffer.insert_at_cursor(' '.join(sys.argv[1:])) win.show() gtk.main()