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:
- Node.js
- twit – Twitter API client for Node.js
- Heroku – platform for deployed applications
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.