I choose a lazy person to do a hard job. Because a lazy person will find an easy way to do it. – Bill Gates
Mở bài
Bác Gates đã bảo răng bác luôn muốn chọn những người lười biếng vì họ sẽ tìm ra cách thực hiện việc đó một cách đơn giản hơn.
Hơn nửa, đôi khi có một số công việc nhàm chán phải lặp đi lặp lại nhiều lần, trong một ngày. Với một developer thì tại sao không tìm một cách nào đó nhàn hơn để làm?
Hôm nay mình sẽ giới thiệu với các bạn cách để tự động hóa một số công việc bằng NodeJS và Heroku, hoàn toàn miễn phí.
Sau đó, các bạn có thể áp dụng vào chính công việc hiện tại của các bạn như gửi mail, tự động chúc mừng sinh nhật trên Facebook, và hàng tá việc khác nữa.
Áp dụng.
Để áp dụng, mình sẽ hướng dẫn các bạn viết một cái script vui vui nhằm áp dụng thử tự động hóa một số việc đơn giản. Mình sẽ viết một cái script lấy bài từ Subreddit r/listentothis và post sang Facebook Page bằng NodeJS mỗi giờ một lần.
Serie gồm hai phần:
- Viết script
- Tự động hóa bằng Heroku
Code nào
Đầu tiên là mình sẽ viết một script để nó tự động lấy bài bên Subreddit và post sang Facebook Page. Các bước cụ thể sẽ như sau:
- Tạo dự án
- Config Api của Đít đỏ
- Lấy random post từ Subreddit r/listentothis
- Config Facebook Page API
- Post status lên Facebook Page
Tạo dự án
Ở đây mình sẽ sử dụng NodeJS cùng một số package như snoowrap cho Reddit API và node-fetch để post bài lên Page. Ngoài ra dùng thêm dotenv để config các biến envionement nữa thôi. 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 |
Config Đít Đỏ
Để Config Đít Đỏ thì mình sử dụng Snoowrap package. Setup gồm hai bước là tạo Reddit App và tạo Token vĩnh viễn.
Tạo Reddit App
Đầu tiên, các bạn vào https://www.reddit.com/prefs/apps để tạo App Reddit.
Ở mục Redirect URL nhớ gõ url https://not-an-aardvark.github.io/reddit-oauth-helper/ nhé. Nó sẽ giúp bạn tạo Token vĩnh viễn nhanh hơn.
Sau khi tạo xong thì lưu lại Client ID và Client Secret lại.
Tạo Token vĩnh viễn
Tạo Token vĩnh viễn thì các bạn tiếp tục vào https://not-an-aardvark.github.io/reddit-oauth-helper/. Sau đó điền Client Secret và Client ID vào. Nhớ tick vào Permanent sau đó tạo Token. Kéo xuống dưới nó sẽ hiện Token. Lưu tiếp 2 cái Token đó lại là xong.
Lấy random post từ Subreddit
Đến đây mình bắt đầu vào file index.js
để bắt đầu 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> |
Kết quả sẽ trả về Object một bài post random từ Subreddit r/listentothis. Ở đây mình sẽ lấy demo 3 giá trị thôi: Title, Author và Url của bài bát đó.
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> |
Kết quả như sau
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
Tiếp theo là các bạn phải tạo Page, sau đó tạo App trên Facebook Developer. Và lấy token vĩnh viễn. Các bạn chưa biết cách lấy Token vĩnh viễn thì xem ở đây nhé. Đoạn này nhiều bài hướng dẫn nên mình lười viết lại quá.
Post Status lên Page
Tiếp theo là mình post status lên Page bằng Facebook Page API thôi.
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> |
Test thử
Bật Tơ Mi Nồ lên và gõ node index.js
để test. Nếu kết quả như sau là chính xác
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> |
Kết luận
Đến đây là coi như đẫ xong cái script đơn giản, tự động lấy bài bên Reddit để post qua Facebook Page rồi nhé. Các bạn có thễ xem thử kết quả ở Page http://fb.com/listenthisawesomesong của mình.
Source Code của script này mình ở đây https://github.com/nguyen47/listen-to-this
Phần sau mình sẽ giới thiệu cách để tự động hóa việc này bằng Heroku. Đơn giản và không tốn chi phí gì cả.
Hiện tại mình đang tập tọe viết Blog ở địa chỉ https://htknguyen.com/. Nếu bạn nào có hứng thú thì ghé vào blog của mình nghe mình chém gió loạn lên dưới góc độ một thằng Developer cùi nhé. Bắn tim