Blog moved to webfaction
Friday, February 27th, 2009I just moved this blog to webfaction.
I just moved this blog to webfaction.
This is a Python script to check a mailbox for Twitter emails. New followers are followed. Direct messages from administrators (defined in a list) are twittered by the bot.
import twitter
import logging
from imaplib import *
from email.Parser import Parser
import datetime, time, email, email.Utils
import re
import settings
# logging
logging.basicConfig(filename=settings.LOG_FILENAME,level=logging.DEBUG,)
logger = logging.getLogger('artandcode_twitter')
logger.debug('starting')
try:
# Connect to email server
server = IMAP4(settings.MAIL_SERVER)
server.login(settings.EMAIL_USERNAME, settings.EMAIL_PASSWORD)
r = server.select("INBOX")
# Find all mail
r, data = server.search(None, "(ALL)")
# If there are messages in inbox
if len(data[0]) > 0:
api = twitter.Api(username=settings.TWITTER_USERNAME, password=settings.TWITTER_PASSWORD)
p = Parser()
# Loop through emails in inbox
for num in data[0].split():
r, fetch_data = server.fetch(num,
'(BODY[HEADER.FIELDS (DATE SUBJECT FROM X-TwitterEmailType X-TwitterSenderScreenName X-TwitterCreatedAt X-TwitterRecipientScreenName)])')
msg = p.parsestr(fetch_data[0][1])
who = msg.__getitem__('From')
matchemail = re.compile(r'[\w\-][\w\-\.]+@[\w\-][\w\-\.]+[a-zA-Z]{1,4}')
email_addy = matchemail.findall(who)[0]
twitter_sender_screen_name = msg.__getitem__('X-TwitterSenderScreenName')
if msg.__getitem__('X-TwitterRecipientScreenName') == settings.TWITTER_USERNAME:
# if the message is a following message
if msg.__getitem__('X-TwitterEmailType') == 'is_following':
# follow the user
api.CreateFriendship(twitter_sender_screen_name)
# If the email is a direct message sent from Twitter
if msg.__getitem__('X-TwitterEmailType') == 'direct_message':
# if the sender is an administrator
if [twitter_sender_screen_name in settings.ADMINISTRATORS]:
# When direct message sent, convert to epoch seconds
twitter_time = msg.__getitem__('X-TwitterCreatedAt').strip()
time_tuple = email.Utils.parsedate(twitter_time)
epoch_seconds = time.mktime(time_tuple)
# Get body of email sent by Twitter
r, body_data = server.fetch(num, '(RFC822.TEXT)')
body = body_data[0][1]
twitter_direct_message = body.split("\r\n\r\n")[0].strip()
api.PostUpdate(twitter_direct_message[:140-1])
# copy the messages out of the INBOX
server.copy(','.join(data[0].split(' ')), 'PROCESSED')
# mark the messages as deleted
# Loop through emails in inbox
for num in data[0].split():
server.store(num, '+FLAGS', '\\Deleted')
# expunge the messages. Not sure if this is needed
server.expunge()
# delete the messages on close
server.close()
# Logout of email server
server.logout()
except Exception, error:
logger.exception(str(error))
logger.debug('finished')
These instructions will install PIL properly on Mac OS X 10.5. The instructions are adapted from here.
Go to here and download PIL.
Now we set up the environment so that you can install it.
In Terminal, create a symbolic link for the system’s Python.framework
in the location expected by the pythonmac.org tools, like so:
cd /Library/Frameworks sudo ln -s /System/Library/Frameworks/Python.framework/ Python.framework
Now run the installer. It should not complain and it should install successfully.
The final step installs PIL in your Python site packages.
cd /Library/Python/2.5/site-packages/ echo "/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages " > PIL.pth
Test your new PIL install with:
python -c "from PIL import Image"
if you do not get an error, then you have a correct PIL install!
Looking back at my infrequent micro-blogging on this here site, I see a message about Picasa Tab for Facebook having 500 users. Well, now it has 23,000. w00t!
And one of these weekends, the new state of the art Google App Engine / pyFacebook / Django version will be switched on (replacing the crufty but reliable PHP version).
I recently deployed a Django 1.0.2 site using mod_python. Turns out this was a mistake. I should have used mod_wsgi. Mod_python is no longer under development. See Django ticket about recommending mod_wsgi.
[Corrected: wrong link]
The link on the website is broken, the correct link is: mod python mailing list archives
A teaser for my ‘corporate rebranding’
Just wanted to say that I passed the 500 user mark this morning. Not bad for two weeks. You too can install Picasa Tab for Facebook here.
Another algorithmic drawing program hit the scene this week in Top Draw, a Mac-only program from Google. Much like Processing or OpenFrameworks, it provides a language to write code that produces images.
Top Draw was developed by one Dan Waylonis. You write object-oriented JavaScript code that is translated into images. The object-orientation differs from Processing and OpenFrameworks (and OpenGL and JOGL), where you write using the methods of one big class. And the methods are different. So for someone used to Processing-style methods (which are shared with OpenFrameworks), it’s a bit of a learning curve.
The big thing that Top Draw brings to the table is access to Apple’s CoreImage filters. Among other things, they allow you to transform 2D space with bumps and holes. Processing does not have this stuff built in, and I don’t think anyone has created a library to either use CoreImage on the Mac, or implemented the filters in Java. It would be cool stuff. ActionScript also has filters.
There’s some confusing extra functionality that lets you make a drawing your desktop image, or rotate through drawings. Neat, but really almost a separate program.
Top Draw is written in C and is licensed under the apache 2.0 license. The source code and the download is available on Google code.
So is it a Processing killer? I don’t think so. On the plus side has the CoreImage filters going for it. On the other hand, the language is awkward. The biggest issue is that it’s not a web application; even though you write in JavaScript, the library itself is in C. Processing sketches can be shown on the web using the moribund Java applet technology, and ActionScript can create Flash applications. It seems to me that almost everything must run on the web these days. Processing even has a JavaScript implementation (processing.js) that lets you run sketches using JavaScript in the browser. In this way it’s more like OpenFrameworks or OpenGL, which can’t run in a browser. And of course Top Draw only runs on Mac.
All in all, a good way to play with CoreImage filters.
Imagine that you could get people to do valuable things for you for free, like writing and distributing book reviews. That’s exactly what’s happening on the web today. Clay Shirky, in his book ‘Here Comes Everybody’, looks at the effects of the internet on producing economic value without the effort and expense of establishing an organization. He argues that the cost of organizing certain activities, such as publishing book reviews, has fallen to almost zero. Web services, such as Flickr, blogger.com, Amazon reviews, and Wikipedia are successful because they allow people to voluntarily contribute to a goal with minimal organizational effort.
Many of the examples in the book are well known (though some, like the use of blogs to organize protests in Belarus, are less known and wonderful). What makes Shirky’s book useful is the analysis that he does of the examples. Various models are proposed; a particularly useful model is promise, tool, bargain. He argues that a new group makes a promise (’lets put together photos of mermaid parades’), then provides tools to achieve that promise (Flickr), then makes bargains to achieve the goal (the agreement not to post off-topic images).
A quick read for a pretty good payoff.
Here Comes Everybody: The Power of Organizing Without Organizations