I choose a lazy person to do a hard job. Because a lazy person will find an easy way to do it. – Bill Gates
Opening
Mr. Gates told me that I always wanted to choose lazy people because they would find a way to do it more simply. More than half, sometimes there is some boring work to be repeated many times, in a day. For a developer, why not find a more leisurely way to do it? Today I will introduce you how to automate some jobs with NodeJS and Heroku, completely free. After that, you can apply to your current work such as sending mail, automatically happy birthday on Facebook, and dozens more.
Apply.
To apply, I will guide you to write a fun script to apply automation to try some simple things. I will write a script that takes articles from Subreddit r / listentothis and posts to Facebook Page with NodeJS once every hour.
The series consists of two parts:
- Write script
- Automate with Heroku
Which code
First, I will write a script so that it automatically takes Subreddit posts and posts to Facebook Page. The specific steps will be as follows:
- Create a project
- Api Config of Red Ass
- Get a random post from Subreddit r / listentothis
- Config Facebook Page API
- Post status to Facebook Page
Create a project
Here I will use NodeJS with some packages such as snoowrap for Reddit API and node-fetch to post to Page. Also use dotenv to configure more envionement variables. Easy
1 2 3 4 | <span class="token function">npm</span> init -y <span class="token function">touch</span> index.js <span class="token function">npm</span> i snoowrap node-fetch dotenv |
Red Ass Config
To Config Red Data, I use the Snoowrap package. The setup consists of two steps: creating a Reddit App and creating a permanent Token.
Create the Reddit App
First, go to https://www.reddit.com/prefs/apps to create the Reddit App.
Under Redirect URL remember to type url https://not-an-aardvark.github.io/reddit-oauth-helper/ . It will help you to create permanent tokens faster.
After creating, save the Client ID and Client Secret again.
Create Token permanently
Create a permanent token then continue to https://not-an-aardvark.github.io/reddit-oauth-helper/ . Then enter the Client Secret and Client ID. Remember to tick Permanent and then create Token. Scrolling down it will display the Token. Save the 2 Token that is again.
Get random posts from Subreddit
Here I started to index.js
file to start the Code.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | <span class="token keyword">const</span> fetch <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"node-fetch"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> snoowrap <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"snoowrap"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">"dotenv"</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">config</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">(</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token comment">// Config Snoowrap</span> <span class="token keyword">const</span> r <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">snoowrap</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> userAgent <span class="token punctuation">:</span> <span class="token string">"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36"</span> <span class="token punctuation">,</span> clientId <span class="token punctuation">:</span> process <span class="token punctuation">.</span> env <span class="token punctuation">.</span> <span class="token constant">REDDIT_CLIENT_ID</span> <span class="token punctuation">,</span> clientSecret <span class="token punctuation">:</span> process <span class="token punctuation">.</span> env <span class="token punctuation">.</span> <span class="token constant">REDDIT_CLIENT_SECRET</span> <span class="token punctuation">,</span> refreshToken <span class="token punctuation">:</span> process <span class="token punctuation">.</span> env <span class="token punctuation">.</span> <span class="token constant">REDDIT_REFRESH_TOKEN</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Get Sub Reddit</span> <span class="token keyword">const</span> subReddit <span class="token operator">=</span> r <span class="token punctuation">.</span> <span class="token function">getSubreddit</span> <span class="token punctuation">(</span> <span class="token string">"listentothis"</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// Get Random post</span> <span class="token keyword">const</span> randomPost <span class="token operator">=</span> <span class="token keyword">await</span> subReddit <span class="token punctuation">.</span> <span class="token function">getRandomSubmission</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> randomPost <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span> <span class="token class-name">error</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">error</span> <span class="token punctuation">(</span> error <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
The result will return the Object a random post from Subreddit r / listentothis. Here I will take only 3 value demo: Title, Author and Url of that bowl.
1 2 3 4 5 6 | <span class="token keyword">const</span> messageData <span class="token operator">=</span> <span class="token punctuation">{</span> url <span class="token punctuation">:</span> randomPost <span class="token punctuation">.</span> url <span class="token punctuation">,</span> author <span class="token punctuation">:</span> randomPost <span class="token punctuation">.</span> author <span class="token punctuation">.</span> name <span class="token punctuation">,</span> title <span class="token punctuation">:</span> randomPost <span class="token punctuation">.</span> title <span class="token punctuation">}</span> <span class="token punctuation">;</span> |
The following results
1 2 3 4 5 | <span class="token punctuation">{</span> url <span class="token operator">:</span> 'https <span class="token operator">:</span> //youtube.com/watch?v=eiHvJVHzrvM' <span class="token punctuation">,</span> author <span class="token operator">:</span> 'Encyclopedia_Green' <span class="token punctuation">,</span> title <span class="token operator">:</span> ' <span class="token number">100</span> Proof Haze - Jimmy Mack <span class="token punctuation">[</span> rap/hiphop <span class="token punctuation">]</span> ' <span class="token punctuation">}</span> |
Config Facebook Page API
Next, you have to create Page, then create App on Facebook Developer . And get the token permanently. You do not know how to get a permanent token, see here . This paragraph has many tutorials so I’m too lazy to rewrite.
Post Status on Page
Next, I post status to Page using Facebook Page API only.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token comment">// Post Status</span> <span class="token keyword">const</span> access_token <span class="token operator">=</span> process <span class="token punctuation">.</span> env <span class="token punctuation">.</span> <span class="token constant">FACEBOOK_ACCESS_TOKEN</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> messageData <span class="token operator">=</span> <span class="token punctuation">{</span> url <span class="token punctuation">:</span> randomPost <span class="token punctuation">.</span> url <span class="token punctuation">,</span> author <span class="token punctuation">:</span> randomPost <span class="token punctuation">.</span> author <span class="token punctuation">.</span> name <span class="token punctuation">,</span> title <span class="token punctuation">:</span> randomPost <span class="token punctuation">.</span> title <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> messageTemplate <span class="token operator">=</span> <span class="token template-string"><span class="token string">`Listen and enjoy to this song </span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> messageData <span class="token punctuation">.</span> title <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string"> | Credit: </span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> messageData <span class="token punctuation">.</span> author <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string"> `</span></span> <span class="token punctuation">;</span> <span class="token keyword">const</span> url <span class="token operator">=</span> <span class="token template-string"><span class="token string">`https://graph.facebook.com/v5.0/101580544646661/feed?message=</span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> messageTemplate <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">&link=</span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> messageData <span class="token punctuation">.</span> url <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">&access_token=</span> <span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> access_token <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">`</span></span> <span class="token punctuation">;</span> <span class="token keyword">const</span> postStatus <span class="token operator">=</span> <span class="token keyword">await</span> <span class="token function">fetch</span> <span class="token punctuation">(</span> url <span class="token punctuation">,</span> <span class="token punctuation">{</span> method <span class="token punctuation">:</span> <span class="token string">"POST"</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> response <span class="token operator">=</span> <span class="token keyword">await</span> postStatus <span class="token punctuation">.</span> <span class="token function">json</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> response <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Tested
Turn on To Mi Go and type node index.js
to test. If the following result is correct
1 2 | <span class="token punctuation">{</span> id <span class="token operator">:</span> ' <span class="token number">101580544646661</span> _102170374587678' <span class="token punctuation">}</span> |
Conclude
Here is considered as a simple script, automatically get the post on Reddit to post via Facebook Page already. You can see the results in their Page http://fb.com/listenthisawesomesong . Source Code of this script I am here https://github.com/nguyen47/listen-to-this The following part I will introduce how to automate this with Heroku. Simple and no cost at all.
Currently I am learning to write Blog at https://htknguyen.com/ . If you are interested, then visit my blog to hear me slashing the wind up in the perspective of a leprous Developer. Shoot heart