The other day, I decided to make a Twitterbot to help streamline my marketing efforts for my art brand. I wanted to make a bot that would retweet tweets from a different user, selected from a list of users. I wanted the bot to also run once a day.
For my project, I used the following:
Creating an Application with Twitter
To get started, I used the Twitter application form to register my application. The process is pretty straight forward, and once it was completed, I was able to grab the necessary consumer_key
, consumer_secret
, access_token
, and access_token_secret
.
Building the Bot
To get started with Node.js, I created a new project directory. Then I ran npm init
.
I ran the following commands to ensure I had the right packages to build the application:
npm install --save dotenv http twit
Next, I created the environment variables. I created a .env
file in the directory, where I added in my project keys:
CONSUMER_KEY="add_it_here" CONSUMER_SECRET="add_it_here" ACCESS_TOKEN="add_it_here" ACCESS_TOKEN_SECRET="add_it_here"
In my index.js
file, I connected the .env
variables to the application:
require("dotenv").config(); const config = { consumer_key: process.env.CONSUMER_KEY, consumer_secret: process.env.CONSUMER_SECRET, access_token: process.env.ACCESS_TOKEN, access_token_secret: process.env.ACCESS_TOKEN_SECRET };
Then I added logic so the bot would retweet tweets from a list of users or retweet tweets tied to specific hashtags. First I set variables to use twit and to control the number of retweets the bot would make when the code was executed:
const twit = require("twit"); const Twitter = new twit(config); const MAX_RT_COUNT = 1;
I found the Twitter ids for several users that I wanted to the bot to retweet. I used their ids instead of their screen names, in case a user decided to change their screen name. In order to keep track of who was who, I stored details about each user in a comment:
const USERS = [ "15057943", // moma "14803372", // saam "5225991", // tate "22009731", // design museum "81783051", // artsy "17896874", // itsnicethat "158865339", // fastcodesign "21661279", // creative review "16336998", // print magazine "17623957", // design observer "418597196", // creativebloq "15446126", // design milk "18201801", // interior design "19038849" // how design ];
I made a function that would filter through the list of users, so that each day of the week, a different user would get a retweet from the bot:
const getUserOfTheDay = () => { let date = new Date(); let dayOfMonth = date.getDate(); let pickUserIndex = dayOfMonth % USERS.length; return USERS[pickUserIndex]; };
Next, I created the logic for retweeting tweets tied to different hashtags. I ultimately decided not to deploy this functionality, but I wanted to keep it around in case it’s useful in the future:
let retweetTags = async function() { try { const { data } = await Twitter.get("search/tweets", { q: "#art, #painting", result_type: "mixed", lang: "en" }); const statuses = data.statuses.slice(0, MAX_RT_COUNT); // loop through the first n returned tweets for (const status of statuses) { // the post action const response = await Twitter.post("statuses/retweet/:id", { id: status.id_str }); if (response) { console.log("Successfully retweeted"); } } } catch (err) { // catch all log if the search/retweet could not be executed console.error("Err:", err); } }; // retweetTags();
Lastly, I added the code for retweeting tweets from my list of users:
let retweetUsers = async function() { try { const { data } = await Twitter.get("users/show", { user_id: getUserOfTheDay() }); const status = data.status; // make sure tweet isn't in reply to another user if (status.in_reply_to_status_id == null) { const response = await Twitter.post("statuses/retweet/:id", { id: status.id_str }); if (response) { console.log("Successfully retweeted"); } } } catch (err) { // catch all log if the search/retweet could not be executed console.error("Err:", err); } };
To run the bot locally, I added retweetUsers();
to the file, then ran node index.js
in the terminal.
Deploying the App to Heroku
Once I had my app up and running locally, I wanted to deploy it somewhere so it could run automatically. I did this by deploying it to Heroku.
I added a Procfile
to the project, and added the line worker: node index.js
to the file. Then I created a new Heroku project by running heroku create twitterbot-retweet
. Next, I had to define the environment variables in Heroku by running heroku set:config key_name="key_value"
in the terminal.
By accessing the Heroku dashboard online, I had to toggle on the worker for the bot (it was located under the “Dyno formation” section).
After deploying the bot, I realized I wanted the bot to run once every day, so I looked into options for how I could wake the application up once a day in order to execute the code. I ended up going with the simple setInterval method.
If your curious about how all the code looks, or want to see an up-to-date version of the project, you can find it on GitHub.