Updated Dec. 2015 to reflect changes on the Twitter Apps page. See bottom of post for even more Twitter bot scripts!
If there’s one thing this budding computational linguist finds delightful, it’s computers that talk to us. From SmarterChild to horse_ebooks to Beetlejuice, I love the weirdness of machines that seem to have a voice, especially when it’s a Twitter bot that adds its murmur to a tweetstream of accounts mostly run by other humans.
As fun midnight project a few weeks ago, I cobbled together @MechanicalPoe, a Twitter bot that tweets Poe works line by line on the hour from a long .txt file. This slow-tweeting of text is by no means new—@SlowDante is pretty popular, and so is @CDarwin, among many others. In case you want to make your own, here are the quick ‘n’ easy steps I took. This is just one way of doing it—shop around and see what others have done, too.
Step 1. Choose your text & chunk it. (Look, I hate the word chunk as much as the next person, but it’s like, what else are we going to say, nuggetize?) In any case, I chose some texts from Project Gutenberg and copied them into separate .txt files. (Maybe don’t choose a long-winded writer.) I ran a script over them to split them up by sentence and mark sentences longer than 140 characters. (Link to chunking script.) There are other scripts to break up long sentences intelligently, but I wanted to exert some editorial control over where the splits occurred in the texts, so the script I wrote writes ‘SPLIT’ next to long sentences to alert me as I went over the ~600 lines by hand. I copied my chunked texts into one .txt file and marked the beginnings and ends of each individual text. (Link to the finalized .txt file.)
Step 2. Set up your Twitter developer credentials. Set up your bot’s account, then get into the Applications manager and create a new app. Click the Keys and Access Tokens tab. You’ll see it already gave you a Consumer Key and Consumer Secret right off the bat. Scroll down to create a new Access Token.
Step 3. Configure script. You’ll have to install Tweepy, which takes advantage of the Twitter API using Python. Now take a look at this super-simple 27-line script I wrote based on a few other scripts elsewhere. This script is also on my Github:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# by robincamille - for mechnicalpoe
# Tweets a .txt file line by line, waiting an hour between each tweet.
# Must be running all the time, e.g. on a Raspberry Pi, but would be better
# if rewritten to run as a cron task.
import tweepy, time
#Twitter credentials
CONSUMER_KEY = 'xxxxxxxxxxxxxxx'
CONSUMER_SECRET = 'xxxxxxxxxxxxxxx'
ACCESS_KEY = 'xxxxxxxxxxxxxxx'
ACCESS_SECRET = 'xxxxxxxxxxxxxxx'
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
api = tweepy.API(auth)
#File the bot will tweet from
filename=open('lines.txt','r')
f=filename.readlines()
filename.close()
#Tweet a line every hour
for line in f:
api.update_status(line)
print line
time.sleep(3600) #Sleep for 1 hour</code>
You’ll see that it takes a line from my .txt file, tweets it, and then waits for 3600 seconds (one hour). Fill in your developer credentials, make any changes to the filename and anything else your heart desires.
Step 4. Run script! You’ll notice that this script must always be running—that is, an IDLE window must always be open running it, or a command line window (to run in Terminal, simply write python twitterbot.py
, or whatever your filename is). A smarter way would be to run a cron task every hour, and you should probably do that instead, but that requires rewriting the last part of the script. For me, MechanicalPoe runs on my Raspberry Pi, and it’s pretty much the only thing that’s doing now, so it’s fine for it to be running that script 24/7.
Gotchas. So you might encounter some silly text formatting stuff, like encoding errors for quotation marks (but probably not, since the script declares itself UTF-8). You might also make a boo-boo like I did and miss a SPLIT (below) or try to tweet an empty line (you’ll get an error message, “Missing stats”). Also, if you choose a poet like Poe whose lines repeat themselves, Twitter will give you a “Status is a duplicate” error message. I don’t know how long you have to wait to post, but that’s why there are gaps in Mechanical Poe’s Twitter record. The script I wrote is too simple to handle this error elegantly. It just crashes, and when you restart it, you’ll have to specify for line in f[125:]:
(whatever line it is in your text file, minus 1) to start there instead.
Further reading:
- Peter Organisciak: Your first Twitter bot, in 20 minutes
- Newbie: Intro to cron
Update Dec. 2015: My colleague Mark Eaton and I led a one-day Build Your Own Twitter Bot workshop. We built five ready-made Twitter bots. See the tutorial and get the Python scripts on my GitHub. I updated the above tutorial to reflect a different Apps panel in Twitter, too.
How do you set it up to run on a Raspberry Pi? I have a Raspberry Pi 2 and it would be a bit more reliable than my laptop.
The RPi is a computer just like your laptop, so you can do the same steps you’d do with any other computer. Specifically:
Your RPi should be set up with an operating system; if that’s not installed yet, you should do that. (Lots of step by step instructions out there.) Connect your RPi to a monitor/keyboard/mouse so you can see what’s going on and use it like a regular computer. Make sure your RPi is connected to the internet. Transfer the script to your RPi or write it there. You can use the command line for this. Make sure all necessary Python libraries are on your RPi. Then run the script. (Once it’s running, you probably don’t have to have the monitor/keyboard/mouse connected.)
Do you have any python examples that are similar to cdarwin, where the tweets are made based on timestamps?
Good question! I believe that’s something done with cron. The creator of @cdarwin has described the process in brief here: http://www.metaburbia.com/darwin/ He’s also posted the code on GitHub (https://github.com/metaburbia/BeagleTweets), but not the cron code required or the actual database that contains the content and date/time info.
where should i put the bot file ” python twitterbot.py ” and the text file
Anywhere you want: your desktop, My Documents, etc. The twitterbot.py file and the text file should be in the same folder. Typing “python twitterbot.py” (no quotes) from the Terminal (aka command line) should start running the bot.
You can put this bot on a server, too, but you’ll have to get in touch with your web hosting service or a friend who knows what they’re doing. I’m still figuring that part out!
hey , can i ask something? i have some problem when i tried to execute setup.py , i couldn’t execute it.
i didn’t know why . Before the notice showing , i tried to type like this on my terminal : “python setup.py install”
after that, the notice was showing like this :
Notice :
Traceback (most recent call las):
File “setup.py”, line 4, in
from setuptools import setup, find_packages
ImportError: No module named setuptools
So , can you help me for this one sir ?
Thanks in advance …
That means you don’t have the “setuptools” Python package installed. Download and follow setup instructions at https://pypi.python.org/pypi/setuptools
PS. Thanks for your politeness, but I’m not a sir :)
Awesome project. I used this as a basis for a similar bot i created. A little simpler but its still pretty neat. Take a look. https://github.com/jaysea/TwitterBot
Great project, have you had any luck with using your python bot script for searching and replying to Tweets? I’ve seen other scripts but I’m wondering how Tweepy would deal with this. The concept of Twitter bots really interests me, especially using Python. I’ve seen the ones that automatically reply based on people mentioning certain things and it gets me thinking..
Cheers!
Thanks! I haven’t tried a bot that searches/replies yet. I know Tweepy as a “mentions me” method (http://pythonhosted.org/tweepy/html/api.html#timeline-methods) and several “saved searches” methods (http://pythonhosted.org/tweepy/html/api.html#saved-searches-methods). I’ll be looking into this for a project I’m doing soon, so will probably write a future blog post about it. Do get back to me if you find success!