Scripting Twitter with Python

9 April 2008

Twitter is a social networking service where users can write a sentence (maximum 140 characters) about themselves. It is similar to the mood in myspace or the status line in Facebook (Zeth is ... ), except that in Twitter it takes centre stage. It somewhat like sending your friends random SMS text messages but in a website format instead. Indeed you can even use Twitter with a phone if you really want to.

You can choose to let the general public to view your 'updates', or decide to only grant access to those who have become your "friends". Here is my new Twitter page. I am still thinking about how open/closed I should be about it.

When discussing it on IRC, Andy asked me what it offers over other social networking sites, and having used Twitter for only one day I am not sure I have a good answer. However, it is fun while it lasts, at least until we all get bored and just move along to the next one (for more see my prediction that social networking will eventually just become a protocol).

One fun thing about Twitter is that is has an open API with all kinds of language bindings that people have written for it.

DeWitt Clinton's last Twitter entry is "Just spent $65 to register TextMate. 20 minutes later, back to emacs". Hilarious! Especially since I am now writing this very post in Emacs.

DeWitt has also written Python bindings for the Twitter API, available from the Cheeseshop.

This has lots of potential, you can take your info out of Twitter and feed them into another service or other software, and visa-versa. In this post, we will just focus on Twitter, and getting the information in and out of Twitter using Python.

If you want to test it out yourself along with me, go grab the Python module, get yourself a Twitter account, and then type (or copy and paste) the commands into the Python interpreter (start Python by typing python into the terminal).

# Lets start by importing the Twitter API Python bindings:
import twitter

# New lets login with your username and password.
# Don't forget to change them to your details!
api = twitter.Api(username='zeth0', password='lenna')

# Lets printout the timeline
for i in api.GetFriendsTimeline():
    print i.relative_created_at, "|", i.user.name, "|", i.text

# Lets print out only the last status message for each of our
friends:
for u in api.GetFriends():
    print u.GetStatus().relative_created_at, "|", u.name, "|" ,\
    u.GetStatus().text

# Lets print the replies to our own posts:
for i in api.GetReplies():
    print i.relative_created_at, "|", i.user.name, "|", i.text

# Lets print out the personal messages that we have been sent
for i in api.GetDirectMessages():
    print i.created_at, "|", i.sender_screen_name, "|", i.text

# Lets create a new update
api.PostUpdate("""I just read an interesting post about using the
Python programming language and Twitter at Command Line Warriors
- http://commandline.org.uk/ - cooler than salmon on a stick.""")

# Lets make a new friend
api.CreateFriendship('zeth0')

Pretty cool! In a future post, we will connect it to other software. Bye for now.

Discuss this post | Leave a comment

1 dbr says...

I was looking for a simple script to post to Twitter, but all the API's were large, complex and had dependancies. When I stopped being lazy and actually looked at the Twitter API documentation, it is very simple.. Basically a HTTP post with status:your%20message (and it needs your username/password, of course)

The simple post-to-twitter module I wrote is.. 20 lines, with doc-strings, and only needs urllib:

"""Very simple Twitter-posting library.
Requires only default Python modules.
Very short."""
import urllib

def truncate(string,target):
    if len(string) > target:
    return string[:(target-3)] + "..."
else:
    return string

def squawk(username,password,message):
    """Simple post-to-twitter function"""
    message = truncate(message,140) # trim message

data = urllib.urlencode({"status" : message})
res = urllib.urlopen("http://%s:%s@twitter.com/statuses/update.xml" % \
    (username,password), data)

squawk("yourusername","yourpassword","The message to post")

(tab = 4 spaces)

It does nothing but post status-updates, so no pulling data in - but most of the code is there.. The only ~difficult thing would be parsing the XML (And beautifulSoup makes this much simpler)

Posted at 9:49 a.m. on April 10, 2008


2 Prakash says...

Hey Fellas,

Here is what I want to do,

when somebody adds me on twitter, I want to send them a thank you message with a link to facebook.

Any Ideas ?

Posted at 6:12 p.m. on July 19, 2009


What do you have to say?

Show Editing Help

About

Hello, my name is Zeth, I'll be your host here.

Command Line Warriors is about taking control of your own technology, it looks at our experiences of computing; especially using GNU/Linux, the Python programming language, the command-line and issues such as techno-ethics, best practices and whatever is cool now. If you take control of your technology then you are a Warrior too!

This site is your site too which means that you can contribute and get involved. You can leave comments using the facility provided. For me, the comments and discussions are by far the best part of the site. So please do have your say!

Latest Discussions

Zeth

November 29, 2009
Hi Jordan, yes that URL is gone now. I have a new contact form on this site.
Python CGI contact forms

Jordan

November 29, 2009
Zeth attention! Your form, http://zeth.me.uk/contact/, is not working The explorer says connecting ..but nothing happens Sorry for my poor English: I am Spanish Regards
Python CGI contact forms

Jordan

November 26, 2009
Sorry: tell me , not tellme (I'm spaniard) And http://zeth.me.uk/contact/ don't work
You got the touch, you got the power

David Jones

November 25, 2009
Your mad skillz are too l33t! for me. I specifically switched to Google Reader so that I could show people what blogs I read. But I couldn't work out how ...
How to find the fashionable blogs quickly

Brian R. Hickey

November 20, 2009
Symantec picked it up too.
How to bring down Internet Explorer with six words

Zeth

November 17, 2009
Thanks djm, I am the moose here. Christian, assuming one actually does Internationalise the countries, it should still work I guess, as the gettext stuff will happen before the list ...
Countries in Django

Phillip Temple

November 17, 2009
Good start, but: a) wouldn't I want None back rather than 'ZZ'? b) why not add a 'shortcut' boolean, then prepend flagged fields (plus usual '-----' separator) to the actual ...
Countries in Django

djm

November 17, 2009
Am I being a moose or did you mean: from whatever.countries import CountryField instead of from whatever.countries import CharField ? Good post though, cheers.
Countries in Django

Christian Joergensen

November 17, 2009
Wouldn't the ordering get messed up after i18n?
Countries in Django

Steve - Electronic Cigarettes Fan

November 17, 2009
Very well done. Is your blog just you writing? Nicely done, Steven.
Blogger vs Wordpress

vetetix

November 15, 2009
Sorry to bother you nearly two years after you wrote this blog article, but I can't manage to find how to modify an existing field. I am trying to change ...
Three Useful Python Bindings - ClamAV, Apt and Evolution

Manju

November 4, 2009
I am transferring some files using psftp to other device's FAT partition. But the filestamp of the file being transferred is modified to that of FAT device, after the transfer. ...
PuTTY Series: Using PSFTP

iki

November 2, 2009
or simpler: socket.gethostbyname_ex(socket.gethostname())[2]
How to find out your IP address in Python

iki

November 2, 2009
local_ip = set([ i[4][0] for i in socket.getaddrinfo(socket.gethostname(), None) if i[0] == 2 ])
How to find out your IP address in Python

Fred

November 2, 2009
testing rst ------------- - point 1
An Introduction to ReStructuredText

Ano

October 27, 2009
"You simply found the license of the StumbleUpon Toolbar for Internet Explorer." That's possible. I've got some more interesting information to add. Firstly, go to this page: https://addons.mozilla.org/en-US/firefox/addon/138 - this ...
Are your Firefox extensions proprietary software?

Ken

October 21, 2009
Stumbled in here at lunch. This is the best find of the week. Thanks.
Three classic command line tips

Jim

October 19, 2009
Thanks for the rtsp:// post - that's something that has been bugging me for a while!
Three classic command line tips

Zeth

October 18, 2009
Thanks for the comments guys. Great to see the all the gang are still here!
Three classic command line tips

Bubba

October 18, 2009
Is there any way psftp can return the true transfer rates oberved during the actual transfer?
PuTTY Series: Using PSFTP