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')

One Response to “A Python Twitter bot”

  1. pedro costa neves Says:

    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 :\

Leave a Reply