A Python Twitter bot
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')
May 27th, 2009 at 4:31 pm
well, i think, with the new mods on the mail, from twitter, bot can’t get the text, from direct message, and do things they need to do D: like follow others or update :\