Twitterminal – A Terminal-based Twitter client in Python

So, I’ve just started looking at Python, and I love it. Last night I was playing around with django, which is ridiculously cool, and tonight I started a Terminal twitter client – I’m dubbing it Twitterminal. Imaginitive, eh?

It’s crazy-simple, and I’m not bothered about people using it or ripping it off so go for your life! The Twitter class, twit.py:

import urllib2 as urllib
import base64
import xml.dom.minidom

class Twitter:
	public = 'http://twitter.com/statuses/public_timeline.rss'
	friends = 'http://www.twitter.com/statuses/friends_timeline.xml'
	action = 'public'
	actions = ['public','friends']
	items = []

	def __init__(self):
		pass

	def auth(self,username,password):
		self._username = username
		self._password = password
		self._b64 = base64.encodestring('%s:%s' % (self._username,self._password))
		self._authhead = 'Basic %s' % self._b64

	def setAction(self,action):
		if action not in self.actions:
			return False
		self.action = action

	def fetch(self):
		if self.action == 'public':
			url = self.public
			self._req = urllib.Request(url)
			self._handler = urllib.urlopen(self._req)
			self.parsePublic()
		elif self.action == 'friends':
			url = self.friends
			self._req = urllib.Request(url)
			self._req.add_header('Authorization',self._authhead)
			try:
				self._handler = urllib.urlopen(self._req)
			except IOError, e:
				return False
			self.parseFriends()

	def parsePublic(self):
		txt = self._handler.read()
		feed = xml.dom.minidom.parseString(txt)
		statuses = feed.getElementsByTagName('item')
		for status in statuses:
			self.items.append(status.getElementsByTagName('description')[0].childNodes[0].data)

	def parseFriends(self):
		feed = xml.dom.minidom.parseString(self._handler.read())
		statuses = feed.getElementsByTagName('status')
		for status in statuses:
			self.items.append('%s: %s' % (
				status.getElementsByTagName('screen_name')[0].childNodes[0].data,
				status.getElementsByTagName('text')[0].childNodes[0].data))

	def printall(self):
		for item in self.items:
			print '%sn' % item

and twitter.py

#!/usr/bin/python
import sys
from twit import Twitter

twit = Twitter()
if len(sys.argv) == 1:
	twit.setAction('public')
else:
	twit.setAction(sys.argv[1])
if (twit.action == 'friends'): # needs authentication - check sys - 2 is username - 3 is password
	if len(sys.argv) == 4:
		twit.auth(sys.argv[2],sys.argv[3])
	else:
		twit.setAction('public')
if twit.fetch() is False:
	print 'Username or password was incorrect'
twit.printall()

To use it, you’ll need to go to the directory that twit.py and twitter.py are in and run chmod +x ./twitter.py so that you can execute it, then use the following commands to access it:

./twitter.py # this will retrieve the last 20 results from the public timeline

./twitter.py public # as ./twitter.py

./twitter.py friends username password # retrieves the last 20 tweets by your friends

there is pretty rudimentary functionality for checking if you’ve put the correct username or password in, and hopefully it will become more friendly once I get a bit more used to sys.argv and lists in general. This has only been used in python2.5.2 in OSX, so YMMV in other environments. Let me know in comments!

Also, follow me on twitter.

Also also, I’ve just noticed that the code is too wide for my layout. It’s only temporary anyway – copying still works.

boredom code internet python terminal twitter twitterminal

code, internet

Gnarlodious

It works! Very cool, this is way better than a browser.

Jasper Tandy

I totally forgot I’d actually posted the code for this! Glad you like it.

Micke

Works for me in Ubuntu 9.04 as well, but since it’s python that’s not so surpricing perhaps :) . Thanks!

Mickes blogg » Blog Archive » Twitter i bash

[...] jspr.tndy.me/2008/05/twitterminal-a-terminal-based-twitter-client-in-python/ [...]

Oshan

hy somethings wrng in ma terminal it says

File “./twitter.py”, line 11
2 is username – 3 is password
^
IndentationError: expected an indented block

and whre exsactly do i have to type the username and password

Jasper Tandy

Looks like you’ve let a comment go onto a new line. This:

# needs authentication – check sys – 2 is username – 3 is password

Should all be on the same line after its corresponding line in the code. Alternatively, just delete it.

You enter your username and password when typing the command:

./twitter.py friends type_username_here type_password_here