If you read the first part of my tutorial, you already know how to make a Twitter Bot with Node.jsNode.js is an asynchronous event-driven JavaScript runtime and is the most effective when building scalable network applications. Node.js is free of locks, so there's no chance to dead-lock any process. that retweets and favorites tweets using the Twitter API.
In the second part of the Twitter Bot tutorial, we will continue to extend our Bot by adding functionality that will tweet back to any Twitter user who follows our bot.
Before starting this, make sure your directory structure includes:
package.json
(the configuration file for our Node.js application)config.js
(the configuration file of our Twitter application that contains both consumer and access key & tokens)bot.js
(our main application file)
The representation would be:
root/project-name
|- bot.js
|- config.js
|- package.json
You can take a look at the complete bot.js
file from the first part of this tutorial.
Also, make sure you have the twit npmnpm is a software registry that serves over 1.3 million packages. npm is used by open source developers from all around the world to share and borrow code, as well as many businesses. There are three components to npm: the website the Command Line Interface (CLI) the registry Use the website to discover and download packages, create user profiles, and... module installed.
How to make a Twitter bot that replies
After setting up the dependencies and loading/requiring the configuration related to our application, we are going to develop a functionality that is going to tweet back to a Twitter user who follows the Bot’s Twitter Handler.
We are going to use Twitter’s Streaming API to interact with our followers.
Setting up the Streams API
First, we have to set up a stream. Fortunately, our 3rd party npm dependency twit
provides an API function .stream()
to do this task.
// Use Streams API for interacting with a USER
// set up a user stream
var stream = Twitter.stream('user');
.stream()
keeps the connection alive, and returns an EventEmitter
.
twit
provides a list of stream events to listen on, such as ‘follow’, ‘unfollow’, ‘favorite’ and ‘unfavorite’.
Right now we are only interested in the follow event, however the basic syntax is similar to every event.
// when someone follows
stream.on('follow', followed);
When a user follows our Twitter Bot, the follow
event will trigger the callback associated with it, in our case followed
.
// ...trigger the callback
function followed(event) {
console.log('Follow Event is running');
//get user's twitter handler (screen name)
var name = event.source.name,
var screenName = event.source.screen_name;
// function that replies back to the user who followed
tweetNow('@' + screenName + ' Thank you for the follow up.');
}
Replying with tweetnow()
In the followed
callback, we pass an event
argument which gets the Twitter handle and the screen name of the user. In the last line, we invoke a tweetnow()
function that replies back to the user who followed our bot.
The tweetnow()
function takes a string as an argument and updates our bots status. In other terms, it tweets by using .post()
function provided by the twit
API to post to the statuses/update
Twitter API endpoint.
This endpoint gets called whenever you tweet from your Twitter account.
If you noticed in the previous tutorial when retweeting or favoriting a tweet, we used .post()
to update our status.
function tweetNow(tweetTxt) {
var tweet = {
status: tweetTxt
}
Twitter.post('statuses/update', tweet, function(err, data, response) {
if(err){
console.log("Error in Replying");
}
else{
console.log("Gratitude shown successfully");
}
});
}
Unlike in the previous tutorial, we don’t need JavaScripts Timer function this time, since we are using the Streaming API which helps to keep the connection alive.
Here comes the complete code of our bot:
// Use Streams API for interacting with a USER ==========
// set up a user stream
var stream = Twitter.stream('user');
// FOLLOW-Reply BOT ===========================
// when someone follows
stream.on('follow', followed);
// ...trigger the callback
function followed(event) {
console.log('Follow Event is running');
//get their twitter handler (screen name)
var
name = event.source.name,
screenName = event.source.screen_name;
// function that replies back to the user who followed
tweetNow('@' + screenName + ' Thank you for the follow up.');
}
// function definition to tweet back to user who followed
function tweetNow(tweetTxt) {
var tweet = {
status: tweetTxt
}
Twitter.post('statuses/update', tweet, function(err, data, response) {
if(err){
console.log("Error in Replying");
}
else{
console.log("Gratitude shown successfully");
}
});
}
Running the Twitter Bot
To run this bot, go to your terminal:
$node bot.js
To avoid this monotonous process, you can use npm
scripts or nodemon
. You can also deploy this app on Heroku
for a continuous deployment.
If you are planning to deploy on Heroku
, make sure to include a Procfile
in the root of your directory structure and add the following line to the file:
worker: node bot.js
If you are using npm scripts
, make sure you edit the scripts
attribute in the package.json
file:
{
"scripts": {
"start": "node bot.js",
}
}
Then to run from terminal:
$ npm start
Next up
To do further smart things with your bot, go and check out the twit documentation for other RESTful API methods and Streaming API events.
If you are interested in Twitter Bots, check Botwiki.org – as they have the vast collection of Twitter Bots in different programming languages.
The sole purpose of Bot as a web application is automation. For example, when I created my first Twitter Bot @nodejstweets, the whole idea was to remain up to date with the most recent happenings.
You can do a lot of things with a Twitter Bot, whether for your own sole purpose or to solve a purpose for a community. See @100DaysOfCode as a great example.
If you have any questions let me know in the comments, otherwise, see you on Twitter!
This article is written by Aman Mittal. The author’s bio:
“I am a self-taught developer and a web world enthusiast. Node.js & its scions, performance and security gets me excited. Currently, my main focus is on MEAN Stack.”