見出し画像

退職エントリをLINE通知してもらう(JavaScript)

はじめに

退職エントリが好きです。エモいですよね。
「退職エントリがたくさん読みたいな」と思っていたら、Qiitaでおもしろい記事を見つけました。

Googleで退職エントリを検索して、はてなブログに投稿するものでした。
自分も退職エントリをたくさん読みたいので、少しアレンジして退職エントリをLINE通知してもらうプログラムを書いてみました。

プログラム(63行)

async function GetRetirementEntries(){
   const client = require('cheerio-httpcli');

   const retirementEntries = [];

   for (let index = 0; index < 10; index++){
       const page = index * 10;
       const BASE_URL_GOOGLE = 'http://www.google.com/search';
       const REQUEST_PARAM = {q: '退職しました', tbs: 'qdr:d', start: page};
   
       const searchResult = await client.fetch(BASE_URL_GOOGLE, REQUEST_PARAM);
       
       const contents = searchResult.$('div.r > a > h3');
       if (contents.length === 0){
           break;
       }
       contents.each((index, elm) => {
           const url = elm.parent.attribs.href;
           const title = elm.childNodes[0].data;
           const RETIREMENT_WORDS = ['退職しました', '退職します', '退職した']
           
           const includesRetirementWords = value => RETIREMENT_WORDS.some(_ => value.includes(_));
   
           if (includesRetirementWords(title)){
               retirementEntries.push({url: url, title: title});
           }
       });
   }
   return retirementEntries;
}

function LineNotiry(retirementsEntries){
   const axios = require('axios');
   const qs = require('querystring');
   const BASE_URL = 'https://notify-api.line.me';
   const PATH =  '/api/notify';
   const LINE_TOKEN = `YOUR LINE TOKEN`;

   let sendMessage = ''
   retirementsEntries.forEach(retirementsEntry => {
     sendMessage = sendMessage + '\r\n'
       + retirementsEntry.title + '\r\n'
       + retirementsEntry.url + '\r\n'
   });

   const config = {
       baseURL: BASE_URL,
       url: PATH,
       method: 'post',
       headers: {
           'Content-Type': 'application/x-www-form-urlencoded',
           'Authorization': `Bearer ${LINE_TOKEN}`
       },
       data: qs.stringify({
           message: sendMessage,
       })
   };
   axios.request(config);      
}

GetRetirementEntries().then(entries => {
   LineNotiry(entries);
})

動くのは確認しましたが、キレイかどうかは定かではないです。そもそも今朝まではこのプログラムがJavaScriptで書かれているかさえわかっておりませんでした。

実行結果

本日7月7日は3件。バラエティーに富んだ内容でした。
・YouTube
・税理士ドットコム(これは退職エントリではない)
・知恵袋(削除されてた)

感想

VS Codeを利用してプログラムを書いています。本来は1日1回自動で通知が来るところまでをやりたかったのですが、力尽きました。
「退職しました」または「退職します」を含むタイトルのみを抽出していますが、これらをタイトルに含まない退職エントリを見逃しているのが気になります。これらのタイトルを含むけれども退職エントリではないのも含んじゃうのも気になりますね。

調べているうちに知ったのですが、Google検索に対するスクレイピング行為って禁止されているようですね。
IPアドレスからのGoogle検索ができなくなるって読みました(恐ろしい)

以降は参考にしたサイトと解説です。ほぼQiitaです。ご質問あればいつでもどうぞ!

cheerio-httpcli

・Node.jsを使ってWebページをスクレイピングする際の便利ツールです。
・文字コードの変換、パースされたHTMLをjQueryのように操作できます。

LINE Notify

Promise(非同期処理)

・非同期処理はコードの順序通りに実行されるとは限りません。
・コールバックとは非同期処理の実行順序を保つための考え方です。
・Promiseは非同期処理を簡単に書けるオブジェクトです。resolveで戻り値を渡して終了できます。thenでオブジェクト終了後に処理したい関数を記述します。

async/await(非同期処理)

Promiseを利用するよりも非同期処理を簡単に書けるようになるものです。
【async】
・asyncで関数を非同期関数として定義できるようになります。
・asyncで宣言された関数は戻り値としてPromiseを返します。
【await】
・async関数内で、別のPromiseが返されるまで待機します。

fetch

・fetchとはデータを取ってくるAPIです。
・fetchはPromiseを返します。

axios

・node.jsで動くPromiseベースのHTTPクライアントです。
・REST APIが簡単に実行できるようになります。

この記事が参加している募集

退職エントリ

この記事が気に入ったらサポートをしてみませんか?