DEV Community

Cover image for Declare Your Love Like a Programmer ❤️
Florin Pop
Florin Pop

Posted on • Originally published at florin-pop.com

Declare Your Love Like a Programmer ❤️

Originally posted on www.florin-pop.com


Today is Valentines Day! 😍

How nice would it be if you sent a Romantic Message every hour to your loved one? But even better...

How awesome would it be to do it automatically using a NodeJS script? We are after all... programmers, right? 😏

In this short tutorial I'm going to show you how to do it.

P.S. For the lazy ones out there, here is a Video Tutorial:

Create a CRON job

First, we need to create a CRON job which will run a function every hour.

For that, let's install the node-cron package into our NodeJS app:

npm install node-cron

Next, we're going to schedule a function to run every hour:

const cron = require('node-cron');

cron.schedule('0 * * * *', () => {
    sendMessage();
});

Perfect. We don't have the sendMessage() function yet, but we'll create it later.

Also, in case you don't know how the CRON string works, here is an awesome website where you can test it out.

Basically '0 * * * *' means: Run every hour at 0 minutes, so it will run at: 00:00, 01:00, 02:00, etc... You get the point!

Connect to Twilio

We need a Twilio acount, so head over to Twilio.com and create one. You need to verify your email address and also verify the number you want to send message to. (I had to "steal" my wife's phone in order to verify the number 😅)

In there they'll ask you a couple of questions like: "What programming language are you using"... You can pick NodeJS and then you'll end up on the /console page.

Here you'll get the ACCOUNT SID and AUTH TOKEN. We need these to call the Twilio API so we are going to store them inside a config.js file.

Warning: Do not share the AUTH TOKEN. This is a secret key so we're going to store them inside this "secret" config.js file.

Great.

The next thing will be to create a Trial Number (you can find the button on the /console page). This number will be used to send message FROM.

Now that we have everything in place, let's go back to our code!


We need to install the Twilio package: npm install twilio and we need to use the data we stored inside the ./config.js file.

Along the ACCOUNT_SID and AUTH_TOKEN we can also store the PHONE_NR of our loved one as we are going to use this to tell Twilio where to send the message TO.

Let's do that and also let's create the sendMessage() function, which will... send a message 😆.

const config = require('./config');
const accountSid = config.ACCOUNT_SID;
const authToken = config.AUTH_TOKEN;
const client = require('twilio')(accountSid, authToken);

function sendMessage() {
    client.messages
        .create({
            body: 'Your Message here',
            from: '+19166191713',
            to: config.PHONE_NR
        })
        .then(message => {
            console.log(message);
        });
}

You can see that the client.messages.create() function required three things:

  1. The body/the message
  2. The FROM number (this is the trial number created above)
  3. The TO number (this is the number we want to send the message to)

Get the messages

We need a list of 24 romantic messages, so for that let's create a messages.js file and put all the messages in there inside an array.

module.exports = [
    `If I could give you one thing in life, I'd give you the ability to see yourself through my eyes, only then would you realize how special you are to me.`,
    `If you were a movie, I'd watch you over and over again.`,
    `In a sea of people, my eyes always search for you.`
];

I only added 3 messages above, but you can fill the array up till you get to 24 messages.

Combine everything

Now that we have all the 3 components:

  • the CRON job
  • the Twilio sendMessage() call
  • the messages

We can combine them into the final code:

const cron = require('node-cron');

const config = require('./config');
const accountSid = config.ACCOUNT_SID;
const authToken = config.AUTH_TOKEN;
const client = require('twilio')(accountSid, authToken);

const messages = require('./messages');

const currentMessage = 0;

function sendMessage() {
    client.messages
        .create({
            body: messages[currentMessage],
            from: '+19166191713',
            to: config.PHONE_NR
        })
        .then(message => {
            currentMessage++;
            console.log(message);
        });
}

cron.schedule('0 * * * *', () => {
    console.log('Message sent!');
    sendMessage();
});

You can see that I added a currentMessage counter which will be incremented every time we send a message, this way we're going to loop over the entire array of messages.

That's it! 😃

Now you can run the script and it'll send a romantic message, every hour, to your loved one!

Happy Valentines! 😇

Top comments (7)

Collapse
 
garador profile image
Garador • Edited

This made me remember of a story I read somewhere sometime (yeah, quite vague reference) where this certain dude programmed a cronjob to send poems to her girlfriend each X amount of time... Mind you, this was done when back we used floppy drives... And he developed this on his job's infrastructure...

However, he had a bug. Something went terribly wrong, and the production env. Went down HARD..

It's amazing we now have enough resources to make this on our own. We can make so much more today...

Collapse
 
thenewmona profile image
Ramona Saintandre

This is both my first nodeJS and API project.

I got this message from Twilio:
We have detected that your Twilio API credentials have been compromised. It is urgent that you take immediate action to secure your account as this poses a security risk and could lead to unauthorized activity or excessive charges.

is there a different way to hide this besides creating a .env file?

I am on my work computer right now, and I don't want to mess with the environment here.

Thanks

Collapse
 
philnash profile image
Phil Nash

Did you push the project to GitHub, including the config.js file? That would have caused the Twilio and GitHub monitoring systems to spot it and send you that email.

Hopefully you have already logged in and updated your auth token.

If you have hidden credentials like this before using .env files then the secret really is that .env files are likely to appear in your .gitignore file and never get committed to your repo. You can add config.js to the project's .gitignore file for this project, or, better for the future, update this project to use environment variables and dotenv (or similar).

Let me know if I can help any further.

Collapse
 
florinpop17 profile image
Florin Pop

I'm not sure why you got that error... I didn't 🤔

Collapse
 
philnash profile image
Phil Nash

Great post! I hope that your loved one appreciated all the messages!

Collapse
 
tobiassn profile image
Tobias SN

They might not love you back after the 10th message.

Collapse
 
florinpop17 profile image
Florin Pop

True... It might be the next level of love. 😂